pax_global_header00006660000000000000000000000064150046657260014525gustar00rootroot0000000000000052 comment=52edf8b0f333810aef0803b48c066c99bd15a47e Tiling-Assistant-52/000077500000000000000000000000001500466572600145125ustar00rootroot00000000000000Tiling-Assistant-52/.github/000077500000000000000000000000001500466572600160525ustar00rootroot00000000000000Tiling-Assistant-52/.github/ISSUE_TEMPLATE/000077500000000000000000000000001500466572600202355ustar00rootroot00000000000000Tiling-Assistant-52/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000007311500466572600227300ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: bug assignees: '' --- **Describe the bug** **Steps To Reproduce** **System Info:** - Distro (incl. version): - GNOME Shell version: - Extension version and from where (e. g. EGO, `main` branch...): - XOrg/Wayland: **Journalctl logs** Tiling-Assistant-52/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000010441500466572600237610ustar00rootroot00000000000000--- name: Feature request about: Suggest a new feature title: '' labels: enhancement assignees: '' --- **Briefly describe how the feature should work** **Explain why this feature should be added** Tiling-Assistant-52/.github/ignore-words.txt000066400000000000000000000001621500466572600212310ustar00rootroot00000000000000allws Distro finalX finalY fullscreen gettext Journalctl journalctl leleat Msgid msgid msgstr prefs Rects UntilingTiling-Assistant-52/.github/workflows/000077500000000000000000000000001500466572600201075ustar00rootroot00000000000000Tiling-Assistant-52/.github/workflows/create-release.yml000066400000000000000000000012241500466572600235120ustar00rootroot00000000000000name: Release run-name: Create Release on: push: tags: - "v*" jobs: release: name: Create release runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: sudo apt-get update -q && sudo apt-get install gettext - run: bash scripts/build.sh - uses: svenstaro/upload-release-action@2.5.0 with: file: tiling-assistant@leleat-on-github.shell-extension.zip overwrite: true release_name: Tiling Assistant ${{ github.ref_name }} body: "Read about all the changes [here](https://github.com/Leleat/Tiling-Assistant/blob/main/CHANGELOG.md#${{ github.ref_name }})." Tiling-Assistant-52/.github/workflows/run-ci.yml000066400000000000000000000033021500466572600220250ustar00rootroot00000000000000name: CI run-name: Check ${{ github.ref_name }} by @${{ github.actor }} on: pull_request jobs: linters: name: Run linters runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - uses: actions/setup-node@v3 with: node-version: "*" - name: Prepare Linters run: npm i - name: Run ESLint (*.js) run: > git diff --name-only --diff-filter=ACMTUXB origin/${{ github.base_ref }} HEAD | grep -E "\.js$" | xargs -r npx eslint - name: Run ShellCheck (*.sh) if: success() || failure() run: > git diff --name-only --diff-filter=ACMTUXB origin/${{ github.base_ref }} HEAD | grep -E "\.sh$" | xargs -r shellcheck spellcheck: name: Run spell check runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - uses: actions/setup-node@v3 with: node-version: "*" - run: pip install codespell # The case sensitivity of codespeller for ignore-words seems to be buggy. See # issue tracker. According to the help page it should be case sensitive but # only 'allws' makes codespeller ignore 'allWs' in code files. - name: Run codespell run: > git diff --name-only --diff-filter=ACMTUXB origin/${{ github.base_ref }} HEAD | xargs -r codespell -q 3 --skip="*.po*,*.git/*" --ignore-words .github/ignore-words.txt build: name: Run build runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: sudo apt-get update -q && sudo apt-get install gettext - run: bash scripts/build.sh Tiling-Assistant-52/.gitignore000066400000000000000000000000721500466572600165010ustar00rootroot00000000000000*.zip *~ gschemas.compiled locale/ node_modules/ TODO.txt Tiling-Assistant-52/CHANGELOG.md000066400000000000000000000356641500466572600163410ustar00rootroot00000000000000# Changelog ## [52] - 2025-05-01 ### Added - More Russian translation by Ser82-png (#399) - More Ukrainian translation by xalt7x (#395) ### Fixed - Fixed maximized windows not being tilable via DND (#402) ## [51] - 2025-02-16 ### Added - Port to GNOME 48 (#388) ### Fixed - Don't show tile preview for unresizable and skip_taskbar windows (#389) ## [50] - 2025-01-27 ### Added - Add Russian translation by Ser82-png (#367) - Add Polish translation by alewicki95 (#369) - Add Italian translation by albanobattistella (#377) - Add Ukrainian translation by xalt7x (#379) ### Fixed - Added option to make the Outline Focus Hint an actual outline to improve the compatibility with transparent windows (#384) - Workaround retiling already tiled windows freezing by disabling animations for them (#385) - Fixed some compatibility issues with AATWS (#386) ## [49] - 2024-08-11 ### Added - Port to GNOME 47 (#363) ### Changed - Replace the active window hint with https://github.com/Leleat/focus-indicator-prototype. It is disabled by default (#344) ## [48] - 2024-08-10 ### Added - Add more Italian translation by albanobattistella (#352) - Add translations comments (#338) ### Fixed - Ignore unused mods for determining the MoveModes (#340) - Don't spam logs that a config file exists when un/locking the screen by jtojnar (#346) - Mark 'Preferences' in the PanelButton for translation by ChrisLauinger77 (#351) - Maximize windows vertically/horizontally without gaps (#353) - Mark 'Disabled' for translation in prefs by ChrisLauinger77 (#356) - Work around a possible mutter assertion when trying to tile an app that crashed (#360) - Work around a possible crash when un/locking the screen (#361) ## [47] - 2024-04-21 ### Fixed - Don't untile a window on a single click by taoky (#328) ### Changed - Use native AdwSwitchRow and AdwSpinRow (#334) ### Removed - Removed restore-window-size-on-grab-start/end setting since it should be no longer needed (#334) ## [46] - 2024-03-24 ### Added - Brazilian Portuguese translation by nunseik (#310) - Italian translation by albanobattistella (#312) - Ukrainian translation by xalt7x (#317) - Support for GNOME 46 by sergio-costas (#319) ### Fixed - Rework arch PKGBUILD to compile completely from source to enable building inside a docker-container by VeldoraTheDragon (#296, #301) - Handle change of window action key while the extension is enabled (#321) ### Changed - Disable animations when using layouts as a workaround for freezing windows according to #304 (#321) ## [44] - 2023-09-18 ### Added - support for GNOME 45 (#281) ## [43] - 2023-09-17 ### Fixed - Window not resizing correctly when it enters another monitor - by domferr (#290) ## [42] - 2023-09-03 ### Added - Italian translation by albanobattistella (#271) ### Fixed - Move modes update correctly when the grabbed window changes the monitor (#279) ## [41] - 2023-05-17 ### Fixed - Tiling Popup not appearing under some circumstances (#259) - Properly restore tiling props on all workspaces (#262) ## [40] - 2023-04-13 ### Added - Support for GNOME Shell 44 by 3v1n0 (mostly #234) - Github CI: linting and spell checking - Spanish translations by IngrownMink4 (#216) - Dutch translations by flipflop97 (#215) - Italian translations by albanobattistella (#220) - German translations by affengeist (#231) - Hungarian translations by infeeeee (#236) ### Fixed - The position of the fix-search-a-layout popup now appears correctly on multi-monitor setups (#247) - Fix tiling when there are always-on-top windows (#240) - Fix non-extension maximization window-restore position (#251) ### Changed - Move UserGuide.MD into the [github wiki](https://github.com/Leleat/Tiling-Assistant/wiki) - Update Scripts and a bugfix by SubOptimal (#248, #249, #250) ## [39] - 2022-11-23 ### Fixed - Clean up settings signals properly (technically only relevant for the active hint since it may be destroyed before the settings singleton) ## [38] - 2022-11-23 ### Fixed - Issue with always active window hint (there is still a problem with GTK4 popups on Wayland) ## [37] - 2022-11-22 ### Added - Added active window hint. By default the `Minimal` option will be chosen (#210) - Added an option to not use T-A features (Tiling Popup and grouping) when DNDing a window via a modifier and via additional keyboard shortcuts. Features are hidden behind the advanced settings (#212) - Added setting for a single/uniform screen gap instead of splitting it into edges (each edge is still available, if the advanced settings are enabled) ### Changed - Increased possible maximum of gaps to 500 (#205) - Changed/shuffled some of the preferences around ## [36] - 2022-09-04 ### Added - Support GNOME 43 ### Changed - Removed the 'row'-look of shortcuts in the layouts ### Fixed - Consider monitor scale when calculating window gaps (#196) ## [35] - 2022-07-23 ### Added - Added setting to disable multi-monitor grace period (#189) ### Changed - Make the 'improved performance behavior' opt-in (in the advanced settings) since it impacts the precision of the tile preview (#190) ### Fixed - Fixed issue about windows maximizing to wrong monitor under some circumstances setups (#188) ### Removed - Removed in-app changelog ## [34] - 2022-07-13 ### Added - Added setting to completely disable tile groups. That means no resizing, raising or suggestions anymore (#180) - Added the ability to only resize the absolutely necessary windows in a tile group when holding `Ctrl` before resizing started (#155) ### Changed - Improved performance when dragging a window around for lower performance machines (#181) - Split the screen gap setting into top, bottom, left and right parts by CharlieQLe (#146) - Don't open the changelog window after an extension update in the prefs by default anymore ### Fixed - Added a workaround for a multi-monitor bug where windows may untile incorrectly under Wayland (#137) - Fixed issue with RMB as a `Move Mode Activator` under Wayland (#170) - Added Meta as a `Move Mode Activator` and set it as default, if `Alt` is the default window action key (#172) ## [33] - 2022-05-07 ### Added - German (Switzerland) tl by MrReSc #152 - German (Germany) tl by pjanze #161 - Italian translation by starise #164 - Spanish translation by fjsevilla-dev #168 ### Changed - Port to GNOME 42 and drop support for older versions - Brazilian Portuguese tl by ItzJaum #157 - If an app is attached to a layout rect, try to tile an existing window instance first before opening a new one ### Removed - Deprecate 'App Switcher and Tiling Popup' setting - Hacky partial touch 'support' ### Fixed - Override GNOME's default shortcuts only if they are set in Tiling Assistant ## [32] - 2022-01-22 ### Added - Added new keyboard shortcuts: - Restore window size (#134) - Toggle Vertical Maximization - Toggle Horizontal Maximization - Move Window to Center (#132) - Toggle `Always on Top` - Added ability to move tile groups to a new workspace/monitor using the Tile Editing Mode: - `Shift`+`Directions` moves the tile group to a new monitor - `Shift`+`Alt`+`Directions` moves the tile group to a new workspace - Tiled windows will untile themselves if they change workspaces - Allow one action to have multiple keyboard shortcuts (press `Enter` or `Space` when listening for a new keyboard shortcut to append shortcuts to existing ones) - Added GNOME's native tiling behavior (`Super`+`Up`/`Down`/`Left`/`Right`) to the default shortcuts ### Changed - Adapt edge-tiling only if it doesn't cover existing tiles. Use `Ctrl`-drag (mouse) or the `Tile Editing Mode` (keyboard) to 'replace/cover' existing tiles. That way 1 window can be part of multiple tile groups - Reworked tile group detection when a window is tiled - Renamed `Split Tiles` mode to `Adaptive Tiling`. This is the mode when moving a window around while holding `Ctrl` - Disabled grouping tiled windows in the app switcher by default and mark that setting as experimental - Introduce concept of deprecated settings and deprecate the `Toggle Tiling Popup` and `Auto-Tile` keyboard shortcuts - Deprecated settings won't be visible in the prefs window anymore unless they have a non-default value set ### Fixed - Fixed a compatibility issue introduced in v31 with other alt-Tab extensions (#126) - Fixed the Tiling Popup ignoring the Tile Group setting `App Switcher and Tiling Popup` - Shortcuts may no longer change unintentionally after using the clear-shortcut-button - Fixed the URLs in the prefs' popup menu freezing the prefs - Wayland only (#136) ## [31] - 2021-12-10 ### Fixed - Fixed crash introduced in v28 (#125) ## [30] - 2021-12-10 ### Fixed - Fixed crash introduced in v28 (#124) ## [29] - 2021-12-09 ### Fixed - Removed timer sources according to EGO review ## [28] - 2021-12-09 ### Added - Added a Panel Indicator for the layouts (disabled by default). With it you can activate a layout with your pointer or change your `Favorite Layout` (per monitor) - Added a setting to group tileGroups in the AppSwitcher (altTab) and Tiling Popup - When dnd-ing a window, hold `Super` to make the tile preview span multiple rectangles. This only works in the `Favorite Layout` or `Split Tiles` preview modes - Added a `hidden` setting to not adapt the Edge-Tiling to the favorite layouts ### Removed - Removed the `Change favorite layouts` keyboard shortcut (Use the Panel Indicator instead) - Removed the favorite button from the `Layouts` in the preferences (Use the Panel Indicator instead) ### Changed - Show the entire Layout when moving a window with the `Favorite Layout` preview mode - Updated the jp translation (by k-fog #112) - Untile tiled windows, if they are moved to a new monitor or workspace (#114) - `Tile Editing Mode`: Pressing `Space` will always open the Tiling Popup (even if there is already a window in that spot) - Visual tweaks to the preference window ### Fixed - When dragging a window to a new monitor there is a short `Grace Period` (150 ms), in which, if the grab is released, the window will tile to the old monitor. Fix: The `Tiling Popup` will appear on the correct monitor now. - Fixed artifacts due to the rounded corners of the `Changelog Dialog` (only works on Wayland) - Fixed animations being skipped, if an animation was already running (#58) ## [27] - 2021-11-01 ### Added - `Favorite Layout`, a new window movement mode, as an alternative to the default Edge Tiling (issue #94) - It allows users to dnd a window to a predefined layout (Check out the `GUIDE.md` for details) - It also adapts the keyboard shortcuts and edge previews to the favorite layout - Changelog dialog to prefs window on new extension version (deactivatable in `Hidden Settings`) ### Removed - The color selection for the Tile Editing Mode because now we can always follow the system's native Tile-Preview style ### Changed - Split gaps into `Window Gaps` and `Screen Gaps` (i. e. when windows are touching the screen edges) (discussion #109) - `Tile to top` & `Toggle Maximization` cycle between top tiling and maximization in `Tiling State` and `Tiling State (Windows)` - Reworked the preference window to follow GNOME's HIG a bit more closely - Moved the `Inverse Top Screen Edge Action` settings to the `Hidden Setting` - Moved the `Include apps from all workspaces` for the Tiling Popup to the general settings - And some other minor settings tweaks ## [26] - 2021-10-14 ### Added - AUR package (not by me, see #85) ### Changed - Hid the `Layouts` behind the 'Advanced / Experimental Settings' switch (in `Hidden Settings`) - Renamed `Layout` to `Popup Layout` since just `Layout` may be misleading - Tile Editing Mode's resizing now follows GNOME native keyboard resizing style (see `Alt` + `F8`) - Removed the PieMenu - Removed support for GNOME < 40 - Refactored code & created scripts to automate stuff like building, updating translations... ## [25] - 2021-09-27 ### Fixed - Bug when PieMenu is enabled ## [24] - 2021-09-27 ### Added - Clear-keybindings button - Dutch translation (by Vistaus #95) - Partial japanese translation (by k-fog #89) - Added Brazilian Portuguese translation (by msmafra #92) - Windows-like minimize option for the dynamic keybindings - Hidden settings: choose secondary mode (tile preview) activator and option to default to secondary mode (#90) ### Fixed - GNOME Shell 41: use new function, which got replaced in GS ## [23] ### Added - Partial Traditional Chinese translation for users in Taiwan (by laichiaheng #84) - Added dynamic tiling options: disabled, focus & tiling states (#87) - Added the 'layout selector' as an option for the pieMenu ### Changed - Moved 'Tile Editing Mode: Focus Color' to the 'Hidden Settings' - Removed experimental semi-autotiling mode (#70) - Simplify tl file (removed duplicates) ### Fixed - Multimonitor: wrong position for the focus indicator of the tile editing mode - Multimonitor: wrong position for the layout selector - Multimonitor: inconsistent behavior for tiling a window via DND within the 'grace period' ## [22] ### Added - Link to a list of known incompatible apps/extensions (github issue #61) - Czech translation (by pervoj #81) ### Fixed - Correctly position PieMenu on multimonitor setup (#78) - Wrong tilePreview, if window was at the very top display edge - Stop an extension crash, if ~/.config/tiling-assistant didn't exist, when the screen got locked (#80) ## [21] ### Fixed - Re-enable focus on prefs40.ui - Correctly use pointer position when moving window with keyboard `Alt` + `F7` + `Arrow` keys (#76) ## [20] ### Added - Tile Editing Mode: add option to 'equalize' window sizes (see 6bfbc07) - Layouts: add dynamic rectangles to enable layouts like Master & Stack (see the tooltip in the `Layouts` tab of the settings) - Experimental: Semi Tiling Mode (see 'Hidden Settings') - Setup `translations/` for translations ### Changed - Remove `User Guide` and `Changelog` tabs from the settings page (instead create .md files in repo) ### Fixed - Restore tile states properly after a screen lock ## [17] - [19] ### Added - Experimental: app attachments to layouts ### Changed - Layouts: move layouts file from the extension folder to $XDG_CONFIG_HOME/tiling-assistant/layouts.json (#68) ### Fixed - Raise tileGroups with sloppy mouse focus mode only on click ## [16] ### Added - Pie menu: Super + RMB a window - Settings: gaps on maximized windows (off by default) - Settings: 'restore window size on grab end' (workaround for Wayland) - Experimental: Tile Editing Mode ## [13] - [15] ### Added - Dynamic tiling ('focus and tiling') - Ctrl-dragging a window now also works for multiple windows (by dragging the window to the very edges of other windows/free screen rects) - Inverse top screen edge action (by c-ridgway) - Multi-monitor: the tile preview will stick to the old monitor when changing monitors for a short period to easier tile quickly on the old monitor (by c-ridgway) - Default keybindings with the numpad for tiling (by c-ridgway) - Dynamic numbers of layouts & layout selector - Add 'User Guide' and 'Changelog' settings tab ### Changed - Other minor settings additions/removals/changes Tiling-Assistant-52/LICENSE000066400000000000000000000432541500466572600155270ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser General Public License instead of this License. Tiling-Assistant-52/README.md000066400000000000000000000042121500466572600157700ustar00rootroot00000000000000# Tiling Assistant Tiling Assistant is a GNOME Shell extension which adds a Windows-like snap assist to the GNOME desktop. It expands GNOME's 2 column tiling layout and adds many more features. ## Features Please visit the [wiki](https://github.com/Leleat/Tiling-Assistant/wiki) for a list of all features. You'll also find videos and explanations for each of them there. ## Supported GNOME Versions The [metadata](https://github.com/Leleat/Tiling-Assistant/blob/main/tiling-assistant%40leleat-on-github/metadata.json#L4) file lists all currently supported GNOME Shell versions. Generally, only the most recent GNOME Shell is supported. That means older releases may not include all features and bug fixes. You can look at the revisions of the wiki articles to find out when a feature was added, changed, or improved. The [changelog](https://github.com/Leleat/Tiling-Assistant/blob/main/CHANGELOG.md) will show all changes in chronological order. Here is a table showing the GNOME Shell releases and the latest extension version supporting them. | GNOME Shell | Tiling Assistant | |:-------------:|:-----------:| | 45 | 44 | | 44 | 43 | | 43 | 43 | | 42 | 36 | | 41 | 32 | | 40 | 32 | | 3.38 | 23 | | 3.36 | 23 | ## Installation You can install it via https://extensions.gnome.org/extension/3733/tiling-assistant/. Alternatively, or if you want an up-to-date version, download / clone the repository and run the `scripts/build.sh` script with the `-i` flag. Make sure to have `gettext` installed. If you've manually installed the extension, you need to reload GNOME Shell afterwards (e.g. by logging out). It's also on the AUR but that repository is maintained by a 3rd party. ## Translation Translations are welcome! If you are already familiar with how it works, feel free to directly open a pull request with a `YOUR_LANG.po` file at `translations/`. Don't worry, in case you don't know how to create a `.po` file. Just open an issue and I'll set everything up. You'll only need a text editor and your language skills 🙂. ## License This extension is distributed under the terms of the GNU General Public License, version 2 or later. See the license file for details. Tiling-Assistant-52/ambient.d.ts000066400000000000000000000016301500466572600167230ustar00rootroot00000000000000import "@girs/gjs"; import "@girs/gjs/dom"; import "@girs/gnome-shell/ambient"; import "@girs/gnome-shell/extensions/global"; /*********************** * Module Augmentation * ***********************/ import "tiling-assistant@leleat-on-github/src/dependencies/gi.js"; import { Rect } from "tiling-assistant@leleat-on-github/src/extension/utility.js"; declare module "tiling-assistant@leleat-on-github/src/dependencies/gi.js" { namespace Clutter { interface Actor { ease: (params: object) => void; } } namespace GObject { interface Object { connectObject: (...args: unknown[]) => void; disconnectObject: (object: object) => void; } } namespace Meta { interface Window { assertExistence: () => void; isTiled: boolean tiledRect?: Rect untiledRect?: Rect } } } Tiling-Assistant-52/eslint.config.js000066400000000000000000000215401500466572600176140ustar00rootroot00000000000000// Based on https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/blob/main/lint/eslintrc-gjs.yml#L67 import js from "@eslint/js"; export default [ js.configs.recommended, { files: ["tiling-assistant@leleat-on-github/**/*.js"], languageOptions: { globals: { ARGV: "readonly", Debugger: "readonly", GIRepositoryGType: "readonly", globalThis: "readonly", global: "readonly", imports: "readonly", Intl: "readonly", log: "readonly", logError: "readonly", print: "readonly", printerr: "readonly", window: "readonly", TextEncoder: "readonly", TextDecoder: "readonly" } }, rules: { "array-bracket-newline": [ "error", "consistent" ], "array-bracket-spacing": [ "error", "never" ], "array-callback-return": "error", "arrow-parens": [ "error", "as-needed" ], "arrow-spacing": "error", "block-scoped-var": "error", "block-spacing": "error", "comma-dangle": "error", "comma-spacing": [ "error", { "before": false, "after": true } ], "comma-style": [ "error", "last" ], "computed-property-spacing": "error", "curly": [ "error", "multi-or-nest", "consistent" ], "dot-location": [ "error", "property" ], "eol-last": "error", "eqeqeq": "error", "func-call-spacing": "error", "func-name-matching": "error", "func-style": [ "error", "declaration", { "allowArrowFunctions": true } ], "indent": [ "error", 4, { "FunctionExpression": { "parameters": 2 }, "SwitchCase": 1, "ignoredNodes": ["CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child"], "MemberExpression": "off" } ], "key-spacing": [ "error", { "beforeColon": false, "afterColon": true } ], "keyword-spacing": [ "error", { "before": true, "after": true } ], "linebreak-style": [ "error", "unix" ], "max-nested-callbacks": "error", "max-statements-per-line": [ "error", { "max": 2 } ], "new-parens": "error", "no-array-constructor": "error", "no-await-in-loop": "error", "no-caller": "error", "no-constant-condition": [ "error", { "checkLoops": false } ], "no-div-regex": "error", "no-empty": [ "error", { "allowEmptyCatch": true } ], "no-extra-bind": "error", "no-extra-boolean-cast": "off", "no-extra-parens": [ "error", "all", { "conditionalAssign": false, "nestedBinaryExpressions": false, "returnAssign": false } ], "no-implicit-coercion": [ "error", { "allow": ["!!"] } ], "no-iterator": "error", "no-label-var": "error", "no-lonely-if": "error", "no-loop-func": "error", "no-multiple-empty-lines": "error", "no-multi-spaces": "error", "no-nested-ternary": "error", "no-new-object": "error", "no-new-wrappers": "error", "no-octal-escape": "error", "no-proto": "error", "no-prototype-builtins": "off", "no-restricted-properties": [ "error", { "object": "imports", "property": "format", "message": "Use template strings" }, { "object": "pkg", "property": "initFormat", "message": "Use template strings" }, { "object": "Lang", "property": "copyProperties", "message": "Use Object.assign()" }, { "object": "Lang", "property": "bind", "message": "Use arrow notation or Function.prototype.bind()" }, { "object": "Lang", "property": "Class", "message": "Use ES6 classes" } ], "no-return-assign": "error", "no-return-await": "error", "no-self-compare": "error", "no-shadow": "error", "no-shadow-restricted-names": "error", "no-spaced-func": "error", "no-tabs": "error", "no-template-curly-in-string": "error", "no-throw-literal": "error", "no-trailing-spaces": "error", "no-undef": "error", "no-unneeded-ternary": "error", "no-unused-vars": [ "error", { "vars": "local", "varsIgnorePattern": "(^unused|_$)", "argsIgnorePattern": "^(unused|_)" } ], "no-useless-call": "error", "no-useless-computed-key": "error", "no-useless-concat": "error", "no-useless-constructor": "error", "no-useless-rename": "error", "no-useless-return": "error", "no-whitespace-before-property": "error", "no-with": "error", "nonblock-statement-body-position": [ "error", "below" ], "object-curly-newline": [ "error", { "consistent": true, "multiline": true } ], "object-curly-spacing": [ "error", "always" ], "object-shorthand": "error", "operator-assignment": "error", "operator-linebreak": "error", "padded-blocks": [ "error", "never" ], "prefer-numeric-literals": "error", "prefer-promise-reject-errors": "error", "prefer-rest-params": "error", "prefer-spread": "error", "prefer-template": "error", "quotes": [ "error", "single", { "avoidEscape": true } ], "require-await": "error", "rest-spread-spacing": "error", "semi": [ "error", "always" ], "semi-spacing": [ "error", { "before": false, "after": true } ], "semi-style": "error", "space-before-blocks": [ "error", "always" ], "space-before-function-paren": [ "error", { "named": "never", "anonymous": "always", "asyncArrow": "always" } ], "space-in-parens": "error", "space-infix-ops": [ "error", { "int32Hint": false } ], "space-unary-ops": "error", "switch-colon-spacing": "error", "symbol-description": "error", "template-curly-spacing": "error", "template-tag-spacing": "error", "unicode-bom": "error", "wrap-iife": [ "error", "inside" ], "yield-star-spacing": "error", "yoda": "error" }, } ]; Tiling-Assistant-52/jsconfig.json000066400000000000000000000002031500466572600172020ustar00rootroot00000000000000{ "compilerOptions": { "module": "NodeNext", "target": "ESNext", "baseUrl": "." }, "exclude": ["node_modules"] } Tiling-Assistant-52/package-lock.json000066400000000000000000002450011500466572600177300ustar00rootroot00000000000000{ "name": "tiling-assistant", "version": "46.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tiling-assistant", "version": "46.0", "license": "GPL-2.0-or-later", "devDependencies": { "@eslint/js": "^9.0.0", "@girs/gjs": "^4.0.0-beta.19", "@girs/gnome-shell": "^47.0.1", "eslint": "^9.0.0" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/eslintrc": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { "version": "9.19.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/object-schema": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@girs/accountsservice-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/accountsservice-1.0/-/accountsservice-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-I+40tDaYCCVkcUdSCVq85EUHG8Uav3tdXsd0Qb+tewxT4jJ6ksw9jIiox4bVKMwdyvLXrshFVx21dNFGPMmwPw==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/adw-1": { "version": "1.7.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/adw-1/-/adw-1-1.7.0-4.0.0-beta.19.tgz", "integrity": "sha512-T3KF0YcjMwomDtAYm9NobGe21tkd8u3ybf6ANLDX4sIyM07Xqtamix00Cj3ZCDZ0+tOPdRMkRRhXV1DGoo7OLw==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/gsk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gtk-4.0": "^4.16.3-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/atk-1.0": { "version": "2.54.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/atk-1.0/-/atk-1.0-2.54.0-4.0.0-beta.19.tgz", "integrity": "sha512-gKzsnSBzrsxA0FIgYPCRVveNgc6udI9gbFM4Nkfl/w7TTh3R1Fc9w8q7t8Rog4Ek10EJzb+rw2zpc2e+WlXpJA==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/cairo-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/cairo-1.0/-/cairo-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-nBI5oveqH0N7czBC95ofJ4Un5KKqK6guANE6O0OxkwuF6B3YxVqdNmF8O8i2tk3GIxBzwxkC0bi0Wb6X4tLR8g==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/cally-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/cally-15/-/cally-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-bWHSUosGSwa0UKxBsO3MfnG9EFxtYfN5k/tTJtNFmWF0JOTiMwBgtvXSrxqPpnoRxHaGQ8f5QFQ20rH2kHtvkQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/atk-1.0": "^2.54.0-4.0.0-beta.19", "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/clutter-15": "^15.0.0-4.0.0-beta.19", "@girs/cogl-15": "^15.0.0-4.0.0-beta.19", "@girs/coglpango-15": "^15.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/xlib-2.0": "^2.0.0-4.0.0-beta.19" } }, "node_modules/@girs/clutter-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/clutter-15/-/clutter-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-1LpSErfEKPh8tcysgL07++hWy2xsokJ+svbzub95ykXjFkibNrutJBWXmh6E3j5Hs61Va18JjyjPIfmGdVclPA==", "dev": true, "license": "MIT", "dependencies": { "@girs/atk-1.0": "^2.54.0-4.0.0-beta.19", "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/cogl-15": "^15.0.0-4.0.0-beta.19", "@girs/coglpango-15": "^15.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/xlib-2.0": "^2.0.0-4.0.0-beta.19" } }, "node_modules/@girs/cogl-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/cogl-15/-/cogl-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-GEsERs00Vi1TjvPDev05QonAQABSmLoLeNzDciIc9ZhPdDRAf8/MQAQYLqFx6+4U8OmvCNPYDC/t/n+6BwoqBA==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/xlib-2.0": "^2.0.0-4.0.0-beta.19" } }, "node_modules/@girs/cogl-2.0": { "version": "2.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/cogl-2.0/-/cogl-2.0-2.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-Fgb9k7Hi6PMZ944VUxYGDq0hG16BQz7NZ6knzXKzgvcP2LqIt4rlR2+TC5FkXRXlYV+SypsI8f4PuMvRp4N1+g==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/coglpango-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/coglpango-15/-/coglpango-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-fNNwTYsGfMYcLNUkvWLr6OlAuMJMB+XWfppQhXL8NFX15d4AIaBFBHi8vdVRLf/buU2g8Yga52/zH/DJZN/8mg==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/cogl-15": "^15.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/xlib-2.0": "^2.0.0-4.0.0-beta.19" } }, "node_modules/@girs/freetype2-2.0": { "version": "2.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/freetype2-2.0/-/freetype2-2.0-2.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-xU3uVUXMY0MeLc2U4QgpWBQ6VSBtMKaqKRcRT7TrOM1etkLzGhh70SWt16xjqA6vrpF+wZ9TtndQZy2ky0gpwA==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gck-2": { "version": "4.3.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gck-2/-/gck-2-4.3.0-4.0.0-beta.19.tgz", "integrity": "sha512-0oVamw4QWQSo2sDOmrfv8K5pV1h2yNDuD+64m0Y3Ciq+X/vSmmV6r1fsmF7hR64ISz8OtBALRydQ1dQ/m3z1bA==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gcr-4": { "version": "4.3.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gcr-4/-/gcr-4-4.3.0-4.0.0-beta.19.tgz", "integrity": "sha512-WK8ytGrac+MvVOMaMVJb5+uWmVnxRbU6SwHxwosLmLAJOFJlzOL3LHtN1bkI92qtGfwG2+uAmS3ZOtEAbMJIvw==", "dev": true, "license": "MIT", "dependencies": { "@girs/gck-2": "^4.3.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gdesktopenums-3.0": { "version": "3.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gdesktopenums-3.0/-/gdesktopenums-3.0-3.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-YGRG54iOGknzbZjfY/OdiX0keoOvyjIjEPdWKNm7C4VrIrTmNxDlPorUoJf4aJcWuBfAXHQ8EupsrjMhGnULAQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gdk-4.0": { "version": "4.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gdk-4.0/-/gdk-4.0-4.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-mzUgED6t5lvCeX5r1QHozwYs1/gZmOuDegMHawvSOydSkScaP5tlwLrUgpB+iosOPibUeZScMSkXWsNd09Stng==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/gdkpixbuf-2.0": { "version": "2.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gdkpixbuf-2.0/-/gdkpixbuf-2.0-2.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-h8+LofOkyChEhduPGWYI4XDi5bCb9h8aRhYU4p6CTWEAiWXE2a7EtPjdLKXkQADAL/xt3eQoF2t6ecFdYIoiEg==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gdm-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gdm-1.0/-/gdm-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-mV4f+hzW+3Kd7JjvXWnB0NUH7AW3qAq1C26pUu3mkf6AbinHTuri+J15toW6K3htkl5Og193PMIpD4ETDguiOA==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gio-2.0": { "version": "2.82.2-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gio-2.0/-/gio-2.0-2.82.2-4.0.0-beta.19.tgz", "integrity": "sha512-OM2E/mdNX3Z+X7mB8ZVFch4WbUqX1Y6hADiG9+LuGWsAOjPAVvDDUk5N4+34+BTPEfFHLGOdo8E7dI235jylCQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gjs": { "version": "4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gjs/-/gjs-4.0.0-beta.19.tgz", "integrity": "sha512-tl+BjmMqqZH9xZcJZ2AwWI0sotGDc7qVPppAJNeFZFCgUDOFVWThZfkpZffZcQGNphn7wgU8HOvgZyrtVhrltw==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gl-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gl-1.0/-/gl-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-uG/KCXgo2zHdtJGmiMJq5k8kv3B1QH3kl325dQkyE+G6/Ii7gsBepVsy1Gyew2bXPKU2UTUwIn8DDnLIhMHJZg==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/glib-2.0": { "version": "2.82.2-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/glib-2.0/-/glib-2.0-2.82.2-4.0.0-beta.19.tgz", "integrity": "sha512-mRUhcp7O65KQQkyrgiQpUzl1rY+TH4X+A98Kk67g3VjuA7Ei/lV4lcuZnW04HnXAGvQ3Qfkq877NmcDXRgb02g==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gmodule-2.0": { "version": "2.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gmodule-2.0/-/gmodule-2.0-2.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-whTYGLL63Hw1Tn9ZicpJRAMtkYiZwB3lrcln4ETFxyO1ckGTTZ5s17cWcrQjij27veVvjWcb5rmc93L5djeBpg==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gnome-shell": { "version": "47.0.1", "resolved": "https://registry.npmjs.org/@girs/gnome-shell/-/gnome-shell-47.0.1.tgz", "integrity": "sha512-0DnY+fy9CpRTDjvTKOyeFazZdba/JlRC8dSy5AZwvoCY3XNsiKA0yMxY/1iibJ180poXytbKQeG7OVLbFP+o6g==", "dev": true, "license": "MIT", "dependencies": { "@girs/accountsservice-1.0": "1.0.0-4.0.0-beta.19", "@girs/adw-1": "^1.7.0-4.0.0-beta.19", "@girs/atk-1.0": "^2.54.0-4.0.0-beta.19", "@girs/cally-15": "^15.0.0-4.0.0-beta.19", "@girs/clutter-15": "^15.0.0-4.0.0-beta.19", "@girs/cogl-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gcr-4": "^4.3.0-4.0.0-beta.19", "@girs/gdm-1.0": "^1.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gnomebg-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gnomebluetooth-3.0": "^3.0.0-4.0.0-beta.19", "@girs/gnomedesktop-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gtk-4.0": "^4.16.3-4.0.0-beta.19", "@girs/gvc-1.0": "^1.0.0-4.0.0-beta.19", "@girs/meta-15": "^15.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/polkit-1.0": "^1.0.0-4.0.0-beta.19", "@girs/shell-15": "^15.0.0-4.0.0-beta.19", "@girs/shew-0": "^0.0.0-4.0.0-beta.19", "@girs/st-15": "^15.0.0-4.0.0-beta.19", "@girs/upowerglib-1.0": "^0.99.1-4.0.0-beta.19" } }, "node_modules/@girs/gnomebg-4.0": { "version": "4.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gnomebg-4.0/-/gnomebg-4.0-4.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-eDeNaVOBAoYIjC5RiHfpDfS3PjAweSUsGc+jYWm/BdNkFtmUujlv/b+91nhCTN7iwWDuN5nRf2PEw0smFWvpoQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdesktopenums-3.0": "^3.0.0-4.0.0-beta.19", "@girs/gdk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gnomedesktop-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/gnomebluetooth-3.0": { "version": "3.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gnomebluetooth-3.0/-/gnomebluetooth-3.0-3.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-seVQKnNVF06H3W2qB6utRYWTYsia5lqymyPVe41ALzWGfI0dgpnGIubKUslA7cx1U5a/wnGoaKvL6N1wysT0uw==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gnomedesktop-4.0": { "version": "4.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gnomedesktop-4.0/-/gnomedesktop-4.0-4.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-8v7BwRN6RRtx5KnamsnUUU63tem+WuOYQy2+AsiARWEqgZwb91yt25qpk2oii/0WeTleHVsh/00dmjksboloxw==", "dev": true, "license": "MIT", "dependencies": { "@girs/gdesktopenums-3.0": "^3.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gobject-2.0": { "version": "2.82.2-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gobject-2.0/-/gobject-2.0-2.82.2-4.0.0-beta.19.tgz", "integrity": "sha512-E1fCaIZvZ7K035Waa/vYOTqLKI47OSUX3wpMrD+DBlyfDLDCFvyXwaIrFsiKUVFJIxj1xxq7H2yCZvkYqkfklA==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/graphene-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/graphene-1.0/-/graphene-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-TVich9PzcDhD0vECizmHydSTqUhzfIUw3iYi8Pu9bE4wT90gwkgzst9klrjd64oNCNBa3JYrI8xB1txD69kMIg==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/gsk-4.0": { "version": "4.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gsk-4.0/-/gsk-4.0-4.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-UW2skBBR652PVCeTfnjcQ246099wmb9L2rq7C2MwPeV+n7hqnlIBEczdDKspZCvEIC0377Ds9kZeUYqprEBdfQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/gtk-4.0": { "version": "4.16.3-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gtk-4.0/-/gtk-4.0-4.16.3-4.0.0-beta.19.tgz", "integrity": "sha512-IPDbVzknnEs1G4XyYZxB+0cx6d1CBQjg/CJOgUCk4NTIrvxfzvcHBy4idyT/12ecOGsAx7AryqCkn4dhetYLqg==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/gsk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/gvc-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/gvc-1.0/-/gvc-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-b2KYzVB/I8YRUosUy0CDduFasS6AEP+lYDgo/O3xjwmkW35LclE7CoVuRxhYl2fpL8hvuM6VutpKBdzeMXdRCQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/harfbuzz-0.0": { "version": "9.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/harfbuzz-0.0/-/harfbuzz-0.0-9.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-m+rGrFJs6OUdz/WdG/lvXgJ6eSMW5vSPmtZDHoipDnY5LDMDfF0/tEc12RqPqJ7uF59czcYtpSa2gR4ZtrKHUA==", "dev": true, "license": "MIT", "dependencies": { "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/meta-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/meta-15/-/meta-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-XRVOb66tm/zteoZt1ST8X0jh6ZTB3JjFpxGYllQ+2tooOTW1CodbEkCjBq5JzhCD7hieOpgLF5KorPiDRNWKUw==", "dev": true, "license": "MIT", "dependencies": { "@girs/atk-1.0": "^2.54.0-4.0.0-beta.19", "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/clutter-15": "^15.0.0-4.0.0-beta.19", "@girs/cogl-15": "^15.0.0-4.0.0-beta.19", "@girs/coglpango-15": "^15.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdesktopenums-3.0": "^3.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/xfixes-4.0": "^4.0.0-4.0.0-beta.19", "@girs/xlib-2.0": "^2.0.0-4.0.0-beta.19" } }, "node_modules/@girs/mtk-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/mtk-15/-/mtk-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-tdSeO4xGFrZAVkGxhOgt+Q3hicpzkPUajtpm6FI2SiO6UDtiC5i+2LwO1IuerlHTLKkuThZ+81s3JRiXYATKEg==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/nm-1.0": { "version": "1.49.4-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/nm-1.0/-/nm-1.0-1.49.4-4.0.0-beta.19.tgz", "integrity": "sha512-MMNqS9Yp+cfTdwE6NziFOjGA9iL0/3wArM6r8qF1Cr+cTbFIXXSWHcz98GFpH2xkRK0HQuyFIW0vbEoJdWbEPQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/pango-1.0": { "version": "1.54.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/pango-1.0/-/pango-1.0-1.54.0-4.0.0-beta.19.tgz", "integrity": "sha512-O/tJNlRAdmuJFrw8pOMKZrYldgSLgAN9dOJrtQXSh4+6vFH7LQ9SnCKv+6hmJ6yJUnfzEtyOgWAhdmee/Hz3tQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19" } }, "node_modules/@girs/pangocairo-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/pangocairo-1.0/-/pangocairo-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-LSyxXfJ3/FgOHW4pZt2w1mPyi4Gi1LduikLH5X5XtTaPDqA3czf9G72V3QJ/P8RI+LZ/9KWhhg1ZuGF/uhQyZA==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19" } }, "node_modules/@girs/polkit-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/polkit-1.0/-/polkit-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-1AaBJDsEYvbS4iuqqbZ/k9nTOPDn7gYM870SH77wNrVNOw4CT5FTidfHj45jYBviiRGLGod0MPQ/1DOCIv/rSQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/polkitagent-1.0": { "version": "1.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/polkitagent-1.0/-/polkitagent-1.0-1.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-qLZVTunA2VczYgqhqobOT5NSelDfvuPV6JIXoo7Y5JJpM37zw58PiWLmvMLSiPiUXAOXQuCJM7pcHNlyEdvYLQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/polkit-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/shell-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/shell-15/-/shell-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-2IzUX8hbcS2byQtyqmgtblDP/McpYOnfXCf5mWliJErHyaYvF7Ki+skProaJKnEuRC8t9C/c+kkJKVFSRXes7w==", "dev": true, "license": "MIT", "dependencies": { "@girs/atk-1.0": "^2.54.0-4.0.0-beta.19", "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/clutter-15": "^15.0.0-4.0.0-beta.19", "@girs/cogl-15": "^15.0.0-4.0.0-beta.19", "@girs/coglpango-15": "^15.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gck-2": "^4.3.0-4.0.0-beta.19", "@girs/gcr-4": "^4.3.0-4.0.0-beta.19", "@girs/gdesktopenums-3.0": "^3.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/gvc-1.0": "^1.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/meta-15": "^15.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/nm-1.0": "^1.49.4-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/polkit-1.0": "^1.0.0-4.0.0-beta.19", "@girs/polkitagent-1.0": "^1.0.0-4.0.0-beta.19", "@girs/st-15": "^15.0.0-4.0.0-beta.19", "@girs/xfixes-4.0": "^4.0.0-4.0.0-beta.19", "@girs/xlib-2.0": "^2.0.0-4.0.0-beta.19" } }, "node_modules/@girs/shew-0": { "version": "0.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/shew-0/-/shew-0-0.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-Fc50IgkiAIrixb8iGBV2crbi0wVL/fKV8cg/KnS7XfFmczLfw7NGnlp+Cbcm0GS5totgR91RrT+RQjEShX7oJQ==", "dev": true, "license": "MIT", "dependencies": { "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/gsk-4.0": "^4.0.0-4.0.0-beta.19", "@girs/gtk-4.0": "^4.16.3-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19" } }, "node_modules/@girs/st-15": { "version": "15.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/st-15/-/st-15-15.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-+4xg3T672KUYgIf9hAkZsD5ALKvWveRq410xJ8qkHEj7adRG+MFBjt+xXr7RPmvTRw74pvESAXA0M+JY4x3kXw==", "dev": true, "license": "MIT", "dependencies": { "@girs/atk-1.0": "^2.54.0-4.0.0-beta.19", "@girs/cairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/clutter-15": "^15.0.0-4.0.0-beta.19", "@girs/cogl-15": "^15.0.0-4.0.0-beta.19", "@girs/coglpango-15": "^15.0.0-4.0.0-beta.19", "@girs/freetype2-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gdesktopenums-3.0": "^3.0.0-4.0.0-beta.19", "@girs/gdkpixbuf-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/gl-1.0": "^1.0.0-4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19", "@girs/graphene-1.0": "^1.0.0-4.0.0-beta.19", "@girs/harfbuzz-0.0": "^9.0.0-4.0.0-beta.19", "@girs/meta-15": "^15.0.0-4.0.0-beta.19", "@girs/mtk-15": "^15.0.0-4.0.0-beta.19", "@girs/pango-1.0": "^1.54.0-4.0.0-beta.19", "@girs/pangocairo-1.0": "^1.0.0-4.0.0-beta.19", "@girs/xfixes-4.0": "^4.0.0-4.0.0-beta.19", "@girs/xlib-2.0": "^2.0.0-4.0.0-beta.19" } }, "node_modules/@girs/upowerglib-1.0": { "version": "0.99.1-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/upowerglib-1.0/-/upowerglib-1.0-0.99.1-4.0.0-beta.19.tgz", "integrity": "sha512-8Do2336E1fkaWPLvrHQeIAs9cvITD3d7jLCKhPEx1NtthYjCQYP6FwzWIzNmCbJ62xskvuxBsfsts5C2jleqBw==", "dev": true, "license": "MIT", "dependencies": { "@girs/gio-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/glib-2.0": "^2.82.2-4.0.0-beta.19", "@girs/gmodule-2.0": "^2.0.0-4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/xfixes-4.0": { "version": "4.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/xfixes-4.0/-/xfixes-4.0-4.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-WJES/KPgiAc6f5skUCYlIlijSF6eSibH06KUKP+xHgvdYd3DDmeu+L6I+I557rndcvFDFyD8I7CiJs9knUdPEg==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@girs/xlib-2.0": { "version": "2.0.0-4.0.0-beta.19", "resolved": "https://registry.npmjs.org/@girs/xlib-2.0/-/xlib-2.0-2.0.0-4.0.0-beta.19.tgz", "integrity": "sha512-+xAeOIyMuXdRUdfUe5yOqpgfWN/zcYD6WE+zNmlvosXneGz6D13N/s58qqJ+uDXqNP9n/z2w2iROMxXsZtJlUw==", "dev": true, "license": "MIT", "dependencies": { "@girs/gjs": "^4.0.0-beta.19", "@girs/gobject-2.0": "^2.82.2-4.0.0-beta.19" } }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/retry": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "9.19.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://eslint.org/donate" }, "peerDependencies": { "jiti": "*" }, "peerDependenciesMeta": { "jiti": { "optional": true } } }, "node_modules/eslint-scope": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" }, "engines": { "node": ">=16" } }, "node_modules/flatted": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true, "license": "ISC" }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } } } } Tiling-Assistant-52/package.json000066400000000000000000000010761500466572600170040ustar00rootroot00000000000000{ "name": "tiling-assistant", "version": "46.0", "description": "Expand GNOME's 2 column tiling and add a Windows-snap-assist-inspired popup...", "private": true, "homepage": "https://github.com/Leleat/Tiling-Assistant", "main": "tiling-assistant@leleat-on-github/extension.js", "scripts": {}, "author": "Leleat", "license": "GPL-2.0-or-later", "type": "module", "devDependencies": { "@eslint/js": "^9.0.0", "@girs/gjs": "^4.0.0-beta.19", "@girs/gnome-shell": "^47.0.1", "eslint": "^9.0.0" } } Tiling-Assistant-52/scripts/000077500000000000000000000000001500466572600162015ustar00rootroot00000000000000Tiling-Assistant-52/scripts/aur-build/000077500000000000000000000000001500466572600200655ustar00rootroot00000000000000Tiling-Assistant-52/scripts/aur-build/.SRCINFO000066400000000000000000000011021500466572600211630ustar00rootroot00000000000000pkgbase = gnome-shell-extension-tiling-assistant pkgdesc = A GNOME Shell extension to expand GNOME's native 2 column design. pkgver = 52 pkgrel = 1 url = https://github.com/Leleat/Tiling-Assistant install = INSTALL arch = x86_64 license = GPL2 makedepends = gettext depends = gnome-shell provides = gnome-shell-extension-tiling-assistant conflicts = gnome-shell-extension-tiling-assistant source = gnome-shell-extension-tiling-assistant::git+https://github.com/Leleat/Tiling-Assistant.git#tag=v52 sha256sums = SKIP pkgname = gnome-shell-extension-tiling-assistant Tiling-Assistant-52/scripts/aur-build/INSTALL000066400000000000000000000021231500466572600211140ustar00rootroot00000000000000## arg 1: the new package version post_install() { echo "" echo ------------------------------------------------------------------------------- echo Reload GNOME Shell and enable the extension to finish the installation process. echo ------------------------------------------------------------------------------- echo } ## arg 1: the new package version ## arg 2: the old package version post_upgrade() { echo "" echo ------------------------------------------------- echo Reload GNOME Shell to finish the upgrade process. echo ------------------------------------------------- echo } ## arg 1: the old package version post_remove() { echo "" echo --------------------------------------------------------- echo Reload GNOME Shell to finish the uninstallation process. echo "" echo If you didn\'t disable the extension before removal, run echo "'gsettings set org.gnome.mutter edge-tiling true ; \\" echo gsettings set org.gnome.shell.overrides edge-tiling true\' echo to re-enable GNOME\'s native edge tiling. echo --------------------------------------------------------- echo } Tiling-Assistant-52/scripts/aur-build/PKGBUILD000066400000000000000000000022731500466572600212150ustar00rootroot00000000000000# Maintainer: Leleat # Contributor: VeldoraTheDragon <127216238+VeldoraTheDragon@users.noreply.github.com> pkgname=gnome-shell-extension-tiling-assistant pkgver=52 pkgrel=1 pkgdesc="A GNOME Shell extension to expand GNOME's native 2 column design." arch=('x86_64') url="https://github.com/Leleat/Tiling-Assistant" license=('GPL2') depends=('gnome-shell') install='INSTALL' makedepends=('gettext') provides=("${pkgname}") conflicts=("${pkgname}") source=("${pkgname}::git+https://github.com/Leleat/Tiling-Assistant.git#tag=v${pkgver}") sha256sums=('SKIP') _uuid="tiling-assistant@leleat-on-github" prepare() { install -dm755 "${srcdir}/${pkgname}/${_uuid}/locale" } build() { cd "${srcdir}/${pkgname}/${_uuid}" # compile gschema glib-compile-schemas ./schemas/ # compile tl for FILE in ${srcdir}/${pkgname}/translations/*.po; do LANG=$(basename "$FILE" .po) mkdir -p "${srcdir}/${pkgname}/${_uuid}/locale/$LANG/LC_MESSAGES" msgfmt -c "$FILE" -o "${srcdir}/${pkgname}/${_uuid}/locale/$LANG/LC_MESSAGES/${_uuid}.mo" done } package() { install -dm755 "${pkgdir}/usr/share/gnome-shell/extensions" cp -r "${srcdir}/${pkgname}/${_uuid}" "${pkgdir}/usr/share/gnome-shell/extensions/${_uuid}" } Tiling-Assistant-52/scripts/build.sh000077500000000000000000000025451500466572600176450ustar00rootroot00000000000000#!/bin/bash # exit, if a command fails set -e # cd to repo dir SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" cd "$SCRIPT_DIR"/../ # compile settings glib-compile-schemas tiling-assistant@leleat-on-github/schemas # compile tl: requires gettext for FILE in translations/*.po; do LANG=$(basename "$FILE" .po) mkdir -p "tiling-assistant@leleat-on-github/locale/$LANG/LC_MESSAGES" msgfmt -c "$FILE" -o "tiling-assistant@leleat-on-github/locale/$LANG/LC_MESSAGES/tiling-assistant@leleat-on-github.mo" done # create zip package and delete locale directory rm -f tiling-assistant@leleat-on-github.shell-extension.zip cd tiling-assistant@leleat-on-github zip -qr tiling-assistant@leleat-on-github.shell-extension.zip ./* cd .. mv tiling-assistant@leleat-on-github/tiling-assistant@leleat-on-github.shell-extension.zip ./ while getopts i FLAG; do case $FLAG in i) echo Installing extension... gnome-extensions install --force tiling-assistant@leleat-on-github.shell-extension.zip && \ rm -f tiling-assistant@leleat-on-github.shell-extension.zip && \ echo Installation complete. Restart GNOME Shell and enable the extension to use it. || \ exit 1;; *) echo Don\'t use any flags to just create an extension package. Use \'-i\' to additionally install the extension. exit 1;; esac done Tiling-Assistant-52/scripts/release.sh000077500000000000000000000025531500466572600201650ustar00rootroot00000000000000#!/bin/bash # exit, if a command fails set -e # cd to repo dir SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" cd "$SCRIPT_DIR"/../ METADATA=tiling-assistant@leleat-on-github/metadata.json # get new version nr VERSION_LINE=$(cat $METADATA | grep \"version\":) # split after ":" and trim the spaces VERSION_NR=$(echo "$VERSION_LINE" | cut -d ':' -f 2 | xargs) NEW_VERSION_NR=$((VERSION_NR + 1)) # switch to new release branch git checkout -b "release-$NEW_VERSION_NR" # bump up version nr in metadata.json echo Updating metadata.json... sed -i "s/\"version\": $VERSION_NR/\"version\": $NEW_VERSION_NR/" $METADATA echo Metadata updated. echo # bump up version nr in AUR files PKGBUILD=scripts/aur-build/PKGBUILD echo Updating Arch\'s PKGBUILD... sed -i "s/pkgver=$VERSION_NR/pkgver=$NEW_VERSION_NR/" $PKGBUILD cd scripts/aur-build/ makepkg --printsrcinfo > .SRCINFO cd ../../ echo PKGBUILD updated. echo # update translations bash scripts/update-tl.sh echo # package zip for EGO bash scripts/build.sh # commit changes echo Committing version bump... git add $METADATA $PKGBUILD CHANGELOG.md scripts/aur-build/.SRCINFO translations/*.po translations/*.pot git commit -m "Release: Bump version to $NEW_VERSION_NR" echo echo Release done. echo echo TODO: echo echo [] Push release branch and and create pull request echo [] Create and push tag echo [] Upload the extension to EGO Tiling-Assistant-52/scripts/update-tl.sh000077500000000000000000000012251500466572600204370ustar00rootroot00000000000000#!/bin/bash # exit, if a command fails set -e # cd to repo dir SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" cd "$SCRIPT_DIR"/../ # update main.pot echo -n Updating \'translations/main.pot\' xgettext \ --from-code=UTF-8 \ --output=translations/main.pot \ --add-comments='Translators:' \ ./tiling-assistant@leleat-on-github/*/*/*.ui \ ./tiling-assistant@leleat-on-github/*.js \ ./tiling-assistant@leleat-on-github/*/*.js \ ./tiling-assistant@leleat-on-github/*/*/*.js echo \ ......... done. # update .po files for FILE in translations/*.po; do echo -n "Updating '$FILE' " msgmerge -NU "$FILE" translations/main.pot done Tiling-Assistant-52/tiling-assistant@leleat-on-github/000077500000000000000000000000001500466572600231705ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/extension.js000066400000000000000000000321071500466572600255450ustar00rootroot00000000000000/* extension.js * * 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 * 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 . * * SPDX-License-Identifier: GPL-2.0-or-later */ import { Gio, GLib, Meta } from './src/dependencies/gi.js'; import { Extension, Main } from './src/dependencies/shell.js'; import MoveHandler from './src/extension/moveHandler.js'; import ResizeHandler from './src/extension/resizeHandler.js'; import KeybindingHandler from './src/extension/keybindingHandler.js'; import LayoutsManager from './src/extension/layoutsManager.js'; import AltTabOverride from './src/extension/altTab.js'; import FocusHintManager from './src/extension/focusHint.js'; import { Rect } from './src/extension/utility.js'; /** * 2 entry points: * 1. keyboard shortcuts: * => keybindingHandler.js * 2. Grabbing a window: * => moveHandler.js (when moving a window) * => resizeHandler.js (when resizing a window) */ class SettingsOverrider { constructor(settingsSingleton) { this._settings = settingsSingleton; this._overrides = new Map(); this._originalSettings = new Map(); this._maybeNullValue = GLib.Variant.new_maybe( new GLib.VariantType('b'), null); const savedSettings = this._settings.getUserValue('overridden-settings'); this._wasOverridden = savedSettings !== null; } _maybeUpdateOverriden(schemaId, key, value) { if (this._wasOverridden) return undefined; const savedSettings = this._settings.getValue( 'overridden-settings').deepUnpack(); const prefKey = `${schemaId}.${key}`; const oldValue = savedSettings[prefKey]; if (value !== undefined) savedSettings[prefKey] = value ?? this._maybeNullValue; else delete savedSettings[prefKey]; this._settings.setValue('overridden-settings', new GLib.Variant('a{sv}', savedSettings)); return oldValue; } add(settings, key, value) { this._originalSettings.set(settings.schemaId, settings); const userValue = settings.get_user_value(key); const values = this._overrides.get(settings.schemaId) ?? new Map(); if (!values.size) this._overrides.set(settings.schemaId, values); values.set(key, userValue); settings.set_value(key, value); this._maybeUpdateOverriden(settings.schemaId, key, userValue ?? this._maybeNullValue); } remove(schema, key) { const settings = this._originalSettings.get(schema); if (!settings) return; const values = this._overrides.get(settings.schemaId); const value = values?.get(key); if (value === undefined) return; if (value) settings.set_value(key, value); else settings.reset(key); values.delete(key); this._maybeUpdateOverriden(settings.schemaId, key, undefined); } _clear() { if (this._wasOverridden) { const savedSettings = this._settings.getValue( 'overridden-settings').unpack(); Object.entries(savedSettings).forEach(([path, value]) => { const splits = path.split('.'); const key = splits.at(-1); const schemaId = splits.slice(0, -1).join('.'); const settings = this._originalSettings.get(schemaId) ?? new Gio.Settings({ schema_id: schemaId }); value = value.get_variant(); if (value.equal(this._maybeNullValue)) settings.reset(key); else settings.set_value(key, value); }); } else { this._originalSettings.forEach(settings => { this._overrides.get(settings.schemaId).forEach((value, key) => { if (value) settings.set_value(key, value); else settings.reset(key); }); }); } this._settings.reset('overridden-settings'); } destroy() { this._clear(); this._maybeNullValue = null; this._originalSettings = null; this._overrides = null; this._settings = null; } } export default class TilingAssistantExtension extends Extension { async enable() { this.settings = (await import('./src/common.js')).Settings; this.settings.initialize(this.getSettings()); this._settingsOverrider = new SettingsOverrider(this.settings); const twmModule = await import('./src/extension/tilingWindowManager.js'); this._twm = twmModule.TilingWindowManager; this._twm.initialize(); this._moveHandler = new MoveHandler(); this._resizeHandler = new ResizeHandler(); this._keybindingHandler = new KeybindingHandler(); this._layoutsManager = new LayoutsManager(); this._focusHintManager = new FocusHintManager(); this._altTabOverride = new AltTabOverride(); // Disable native tiling. this._settingsOverrider.add(new Gio.Settings({ schema_id: 'org.gnome.mutter' }), 'edge-tiling', new GLib.Variant('b', false)); // Disable native keybindings for Super+Up/Down/Left/Right const gnomeMutterKeybindings = new Gio.Settings({ schema_id: 'org.gnome.mutter.keybindings' }); const gnomeDesktopKeybindings = new Gio.Settings({ schema_id: 'org.gnome.desktop.wm.keybindings' }); const emptyStrvVariant = new GLib.Variant('as', []); if (gnomeDesktopKeybindings.get_strv('maximize').includes('Up') && this.settings.getStrv('tile-maximize').includes('Up')) { this._settingsOverrider.add(gnomeDesktopKeybindings, 'maximize', emptyStrvVariant); } if (gnomeDesktopKeybindings.get_strv('unmaximize').includes('Down') && this.settings.getStrv('restore-window').includes('Down')) { this._settingsOverrider.add(gnomeDesktopKeybindings, 'unmaximize', emptyStrvVariant); } if (gnomeMutterKeybindings.get_strv('toggle-tiled-left').includes('Left') && this.settings.getStrv('tile-left-half').includes('Left')) { this._settingsOverrider.add(gnomeMutterKeybindings, 'toggle-tiled-left', emptyStrvVariant); } if (gnomeMutterKeybindings.get_strv('toggle-tiled-right').includes('Right') && this.settings.getStrv('tile-right-half').includes('Right')) { this._settingsOverrider.add(gnomeMutterKeybindings, 'toggle-tiled-right', emptyStrvVariant); } // Include tiled windows when dragging from the top panel. this._getDraggableWindowForPosition = Main.panel._getDraggableWindowForPosition; Main.panel._getDraggableWindowForPosition = function (stageX) { const workspaceManager = global.workspace_manager; const windows = workspaceManager.get_active_workspace().list_windows(); const allWindowsByStacking = global.display.sort_windows_by_stacking(windows).reverse(); return allWindowsByStacking.find(w => { const rect = w.get_frame_rect(); const workArea = w.get_work_area_current_monitor(); return w.is_on_primary_monitor() && w.showing_on_its_workspace() && w.get_window_type() !== Meta.WindowType.DESKTOP && (w.maximized_vertically || w.tiledRect?.y === workArea.y) && stageX > rect.x && stageX < rect.x + rect.width; }); }; // Restore tiled window properties after session was unlocked. this._loadAfterSessionLock(); // Setting used for detection of a fresh install and do compatibility // changes if necessary... this.settings.setInt('last-version-installed', this.metadata.version); } disable() { // Save tiled window properties, if the session was locked to restore // them after the session is unlocked again. this._saveBeforeSessionLock(); this._settingsOverrider.destroy(); this._settingsOverrider = null; this._moveHandler.destroy(); this._moveHandler = null; this._resizeHandler.destroy(); this._resizeHandler = null; this._keybindingHandler.destroy(); this._keybindingHandler = null; this._layoutsManager.destroy(); this._layoutsManager = null; this._focusHintManager.destroy(); this._focusHintManager = null; this._altTabOverride.destroy(); this._altTabOverride = null; this._twm.destroy(); this._twm = null; this.settings.destroy(); this.settings = null; // Restore old functions. Main.panel._getDraggableWindowForPosition = this._getDraggableWindowForPosition; this._getDraggableWindowForPosition = null; // Delete custom tiling properties. const openWindows = global.display.get_tab_list(Meta.TabList.NORMAL, null); openWindows.forEach(w => { delete w.isTiled; delete w.tiledRect; delete w.untiledRect; }); } /** * Extensions are disabled when the screen is locked. So save the custom tiling * properties of windows before locking the screen. */ _saveBeforeSessionLock() { if (!Main.sessionMode.isLocked) return; this._wasLocked = true; const userPath = GLib.get_user_config_dir(); const parentPath = GLib.build_filenamev([userPath, '/tiling-assistant']); const parent = Gio.File.new_for_path(parentPath); try { parent.make_directory_with_parents(null); } catch (e) { if (e.code !== Gio.IOErrorEnum.EXISTS) throw e; } const path = GLib.build_filenamev([parentPath, '/tiledSessionRestore2.json']); const file = Gio.File.new_for_path(path); try { file.create(Gio.FileCreateFlags.NONE, null); } catch (e) { if (e.code !== Gio.IOErrorEnum.EXISTS) throw e; } file.replace_contents( JSON.stringify({ windows: Object.fromEntries(this._twm.getTileStates()), tileGroups: Object.fromEntries(this._twm.getTileGroups()) }), null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null ); } /** * Extensions are disabled when the screen is locked. After having saved them, * reload them here. */ _loadAfterSessionLock() { if (!this._wasLocked) return; this._wasLocked = false; const userPath = GLib.get_user_config_dir(); const path = GLib.build_filenamev([userPath, '/tiling-assistant/tiledSessionRestore2.json']); const file = Gio.File.new_for_path(path); if (!file.query_exists(null)) return; try { file.create(Gio.FileCreateFlags.NONE, null); } catch (e) { if (e.code !== Gio.IOErrorEnum.EXISTS) throw e; } const [success, contents] = file.load_contents(null); if (!success || !contents.length) return; const states = JSON.parse(new TextDecoder().decode(contents)); const keysAsNumbers = entries => entries.map(([key, value]) => [parseInt(key), value]); const tileGroups = new Map(keysAsNumbers(Object.entries(states.tileGroups))); const tileStates = new Map(keysAsNumbers(Object.entries(states.windows))); const openWindows = global.display.list_all_windows(); this._twm.setTileGroups(tileGroups); this._twm.setTileStates(tileStates); openWindows.forEach(window => { const tileState = tileStates.get(window.get_id()); if (tileState) { const { isTiled, tiledRect, untiledRect } = tileState; const jsToRect = jsRect => jsRect && new Rect( jsRect.x, jsRect.y, jsRect.width, jsRect.height ); window.isTiled = isTiled; window.tiledRect = jsToRect(tiledRect); window.untiledRect = jsToRect(untiledRect); } if (tileGroups.has(window.get_id())) { const group = this._twm.getTileGroupFor(window); this._twm.updateTileGroup(group); } }); } } Tiling-Assistant-52/tiling-assistant@leleat-on-github/media/000077500000000000000000000000001500466572600242475ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/media/insert-link-symbolic.svg000066400000000000000000000036641500466572600310570ustar00rootroot00000000000000 Tiling-Assistant-52/tiling-assistant@leleat-on-github/media/preferences-desktop-apps-symbolic.svg000066400000000000000000000007351500466572600335250ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/metadata.json000066400000000000000000000006331500466572600256450ustar00rootroot00000000000000{ "description": "Expand GNOME's 2 column tiling and add a Windows-snap-assist-inspired popup...", "name": "Tiling Assistant", "shell-version": [ "48" ], "url": "https://github.com/Leleat/Tiling-Assistant", "uuid": "tiling-assistant@leleat-on-github", "gettext-domain": "tiling-assistant@leleat-on-github", "settings-schema": "org.gnome.shell.extensions.tiling-assistant", "version": 52 } Tiling-Assistant-52/tiling-assistant@leleat-on-github/prefs.js000066400000000000000000000260661500466572600246570ustar00rootroot00000000000000import { Gdk, Gio, GLib, Gtk } from './src/dependencies/prefs/gi.js'; import { ExtensionPreferences } from './src/dependencies/prefs.js'; import LayoutPrefs from './src/prefs/layoutsPrefs.js'; import { Shortcuts } from './src/common.js'; import './src/prefs/shortcutListener.js'; export default class Prefs extends ExtensionPreferences { fillPreferencesWindow(window) { // Load css file const provider = new Gtk.CssProvider(); const path = GLib.build_filenamev([this.path, 'stylesheet.css']); provider.load_from_path(path); Gtk.StyleContext.add_provider_for_display( Gdk.Display.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ); window.set_can_navigate_back(true); const settings = this.getSettings(); const builder = new Gtk.Builder(); builder.set_translation_domain(this.uuid); builder.add_from_file(`${this.path}/src/ui/prefs.ui`); // Add general preference page window.add(builder.get_object('general')); // Add keybindings preference page window.add(builder.get_object('keybindings')); // Add layouts preference page on condition of advanced setting const layoutsPage = builder.get_object('layouts'); settings.connect('changed::enable-advanced-experimental-features', () => { settings.get_boolean('enable-advanced-experimental-features') ? window.add(layoutsPage) : window.remove(layoutsPage); }); if (settings.get_boolean('enable-advanced-experimental-features')) window.add(layoutsPage); // Bind settings to GUI this._bindSwitches(settings, builder); this._bindSpinbuttons(settings, builder); this._bindComboRows(settings, builder); this._bindRadioButtons(settings, builder); this._bindKeybindings(settings, builder); this._bindColorButtons(settings, builder); // LayoutPrefs manages everything related to layouts on the // prefs side (including the keyboard shortcuts) new LayoutPrefs(settings, builder, this.path); // Set visibility for deprecated settings this._setDeprecatedSettings(settings, builder); // Add a button into the headerbar with info this._addHeaderBarInfoButton(window, settings, builder); } /* * Bind GUI switches to settings. */ _bindSwitches(settings, builder) { const switches = [ 'enable-tiling-popup', 'tiling-popup-all-workspace', 'enable-raise-tile-group', 'tilegroups-in-app-switcher', 'maximize-with-gap', 'show-layout-panel-indicator', 'enable-advanced-experimental-features', 'disable-tile-groups', 'low-performance-move-mode', 'monitor-switch-grace-period', 'adapt-edge-tiling-to-favorite-layout', 'enable-tile-animations', 'enable-untile-animations', 'enable-hold-maximize-inverse-landscape', 'enable-hold-maximize-inverse-portrait' ]; switches.forEach(key => { const widget = builder.get_object(key.replaceAll('-', '_')); settings.bind(key, widget, 'active', Gio.SettingsBindFlags.DEFAULT); }); } /* * Bind GUI spinbuttons to settings. */ _bindSpinbuttons(settings, builder) { const spinButtons = [ 'window-gap', 'single-screen-gap', 'screen-top-gap', 'screen-left-gap', 'screen-right-gap', 'screen-bottom-gap', 'focus-hint-outline-size', 'focus-hint-outline-border-radius', 'toggle-maximize-tophalf-timer', 'vertical-preview-area', 'horizontal-preview-area' ]; spinButtons.forEach(key => { const widget = builder.get_object(key.replaceAll('-', '_')); settings.bind(key, widget, 'value', Gio.SettingsBindFlags.DEFAULT); }); } /* * Bind GUI AdwComboRows to settings. */ _bindComboRows(settings, builder) { const comboRows = [ 'focus-hint-outline-style', 'move-adaptive-tiling-mod', 'move-favorite-layout-mod', 'ignore-ta-mod' ]; comboRows.forEach(key => { const widget = builder.get_object(key.replaceAll('-', '_')); settings.bind(key, widget, 'selected', Gio.SettingsBindFlags.DEFAULT); widget.set_selected(settings.get_int(key)); }); } /* * Bind GUI color buttons to settings. */ _bindColorButtons(settings, builder) { const switches = [ 'focus-hint-color' ]; switches.forEach(key => { const widget = builder.get_object(`${key.replaceAll('-', '_')}_button`); widget.connect('color-set', () => { settings.set_string(key, widget.get_rgba().to_string()); }); // initialize color const rgba = new Gdk.RGBA(); rgba.parse(settings.get_string(key)); widget.set_rgba(rgba); }); } /* * Bind radioButtons to settings. */ _bindRadioButtons(settings, builder) { // These 'radioButtons' are basically just used as a 'fake ComboBox' with // explanations for the different options. So there is just *one* gsetting // (an int) which saves the current 'selection'. const radioButtons = [ { key: 'dynamic-keybinding-behavior', rowNames: [ 'dynamic_keybinding_disabled_row', 'dynamic_keybinding_window_focus_row', 'dynamic_keybinding_tiling_state_row', 'dynamic_keybinding_tiling_state_windows_row', 'dynamic_keybinding_favorite_layout_row' ] }, { key: 'focus-hint', rowNames: [ 'disabled_focus_hint_row', 'animated_outline_focus_hint_row', 'animated_upscale_focus_hint_row', 'static_outline_focus_hint_row' ] }, { key: 'default-move-mode', rowNames: [ 'edge_tiling_row', 'adaptive_tiling_row', 'favorite_layout_row', 'ignore_ta_row' ] } ]; radioButtons.forEach(({ key, rowNames }) => { const currActive = settings.get_int(key); rowNames.forEach((name, idx) => { const row = builder.get_object(name.replaceAll('-', '_')); const checkButton = row.activatable_widget; checkButton.connect('toggled', () => settings.set_int(key, idx)); // Set initial state if (idx === currActive) checkButton.activate(); }); }); } /* * Bind keybinding widgets to settings. */ _bindKeybindings(settings, builder) { const shortcuts = Shortcuts.getAllKeys(); shortcuts.forEach(key => { const shortcut = builder.get_object(key.replaceAll('-', '_')); shortcut.initialize(key, settings); }); } /** * Sets the visibility of deprecated settings. Those setting aren't visible * in the GUI unless they have a user set value. That means they aren't * discoverable through the GUI and need to first be set with the gsetting. * The normal rows should have the id of: GSETTING_WITH_UNDERSCORES_row. * ShortcutListeners have the format of GSETTING_WITH_UNDERSCORES. */ _setDeprecatedSettings(settings, builder) { // Keybindings ['toggle-tiling-popup', 'auto-tile'].forEach(s => { const isNonDefault = settings.get_strv(s)[0] !== settings.get_default_value(s).get_strv()[0]; builder.get_object(s.replaceAll('-', '_')).set_visible(isNonDefault); }); // Switches ['tilegroups-in-app-switcher'].forEach(s => { const isNonDefault = settings.get_boolean(s) !== settings.get_default_value(s).get_boolean(); builder.get_object(s.replaceAll('-', '_')).set_visible(isNonDefault); }); } _addHeaderBarInfoButton(window, settings, builder) { // Add headerBar button for menu // TODO: is this a 'reliable' method to access the headerbar? const page = builder.get_object('general'); const gtkStack = page .get_parent() .get_parent() .get_parent(); const adwHeaderBar = gtkStack .get_next_sibling() .get_first_child() .get_first_child() .get_first_child(); adwHeaderBar.pack_start(builder.get_object('info_menu')); // Setup menu actions const actionGroup = new Gio.SimpleActionGroup(); window.insert_action_group('prefs', actionGroup); const bugReportAction = new Gio.SimpleAction({ name: 'open-bug-report' }); bugReportAction.connect('activate', this._openBugReport.bind(this, window)); actionGroup.add_action(bugReportAction); const userGuideAction = new Gio.SimpleAction({ name: 'open-user-guide' }); userGuideAction.connect('activate', this._openUserGuide.bind(this, window)); actionGroup.add_action(userGuideAction); const changelogAction = new Gio.SimpleAction({ name: 'open-changelog' }); changelogAction.connect('activate', this._openChangelog.bind(this, window)); actionGroup.add_action(changelogAction); const licenseAction = new Gio.SimpleAction({ name: 'open-license' }); licenseAction.connect('activate', this._openLicense.bind(this, window)); actionGroup.add_action(licenseAction); const hiddenSettingsAction = new Gio.SimpleAction({ name: 'open-hidden-settings' }); hiddenSettingsAction.connect('activate', this._openHiddenSettings.bind(this, window, builder)); actionGroup.add_action(hiddenSettingsAction); // Button to return to main settings page const returnButton = builder.get_object('hidden_settings_return_button'); returnButton.connect('clicked', () => window.close_subpage()); } _openBugReport(window) { Gtk.show_uri(window, 'https://github.com/Leleat/Tiling-Assistant/issues', Gdk.CURRENT_TIME); } _openUserGuide(window) { Gtk.show_uri(window, 'https://github.com/Leleat/Tiling-Assistant/wiki', Gdk.CURRENT_TIME); } _openChangelog(window) { Gtk.show_uri(window, 'https://github.com/Leleat/Tiling-Assistant/blob/main/CHANGELOG.md', Gdk.CURRENT_TIME); } _openLicense(window) { Gtk.show_uri(window, 'https://github.com/Leleat/Tiling-Assistant/blob/main/LICENSE', Gdk.CURRENT_TIME); } _openHiddenSettings(window, builder) { const hiddenSettingsPage = builder.get_object('hidden_settings'); window.present_subpage(hiddenSettingsPage); } } Tiling-Assistant-52/tiling-assistant@leleat-on-github/schemas/000077500000000000000000000000001500466572600246135ustar00rootroot00000000000000org.gnome.shell.extensions.tiling-assistant.gschema.xml000066400000000000000000000200171500466572600373570ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/schemas true false true false 0 0 '' 8 8 0 0 0 0 0 0 0 false true [] [] [] [] Up','KP_5']]]> [] [] Down']]]> [] KP_8']]]> KP_2']]]> Left','KP_4']]]> Right','KP_6']]]> KP_7']]]> KP_9']]]> KP_1']]]> KP_3']]]> [] [] [] [] [] [] [] [] true false [] -1 [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] false true true false 0 false false 1 2 0 15 15 600 false false [] [] -1 [] Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/000077500000000000000000000000001500466572600237575ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/common.js000066400000000000000000000170301500466572600256060ustar00rootroot00000000000000/** * Helper classes / enums for the settings.xml used in the extension files * *and* prefs files */ /** * A Singleton providing access to the settings. */ export class Settings { static _settings; static initialize(gioSettings) { this._settings = gioSettings; } static destroy() { this._settings = null; } /** * @returns {import("./dependencies/gi.js").Gio.Settings} the Gio.Settings object. */ static getGioObject() { return this._settings; } /** * Listens for the change of a setting. * * @param {string} key a settings key. * @param {*} func function to call when the setting changed. */ static changed(key, func) { return this._settings.connect(`changed::${key}`, func); } static disconnect(id) { this._settings.disconnect(id); } /** * Getters */ static getEnum(key) { return this._settings.get_enum(key); } static getString(key) { return this._settings.get_string(key); } static getStrv(key) { return this._settings.get_strv(key); } static getInt(key) { return this._settings.get_int(key); } static getBoolean(key) { return this._settings.get_boolean(key); } static getValue(key) { return this._settings.get_value(key); } static getUserValue(key) { return this._settings.get_user_value(key); } /** * Setters */ static setEnum(key, value) { this._settings.set_enum(key, value); } static setString(key, value) { this._settings.set_string(key, value); } static setStrv(key, value) { this._settings.set_strv(key, value); } static setInt(key, value) { this._settings.set_int(key, value); } static setBoolean(key, value) { this._settings.set_boolean(key, value); } static setValue(key, value) { return this._settings.set_value(key, value); } static reset(key) { this._settings.reset(key); } } /** * A Singleton providing access to the shortcut keys except the * ones related to the Layouts. */ export class Shortcuts { /** * @returns {string[]} the settings keys for the shortcuts in the same * order as they appear in the preference window. */ static getAllKeys() { return [ 'toggle-tiling-popup', 'tile-edit-mode', 'auto-tile', 'toggle-always-on-top', 'tile-maximize', 'tile-maximize-vertically', 'tile-maximize-horizontally', 'restore-window', 'center-window', 'tile-top-half', 'tile-bottom-half', 'tile-left-half', 'tile-right-half', 'tile-topleft-quarter', 'tile-topright-quarter', 'tile-bottomleft-quarter', 'tile-bottomright-quarter', 'tile-top-half-ignore-ta', 'tile-bottom-half-ignore-ta', 'tile-left-half-ignore-ta', 'tile-right-half-ignore-ta', 'tile-topleft-quarter-ignore-ta', 'tile-topright-quarter-ignore-ta', 'tile-bottomleft-quarter-ignore-ta', 'tile-bottomright-quarter-ignore-ta', 'debugging-show-tiled-rects', 'debugging-free-rects' ]; } } export class DynamicKeybindings { // Order comes from prefs static DISABLED = 0; static FOCUS = 1; static TILING_STATE = 2; static TILING_STATE_WINDOWS = 3; static FAVORITE_LAYOUT = 4; } export const FocusHint = Object.freeze({ DISABLED: 0, ANIMATED_OUTLINE: 1, ANIMATED_UPSCALE: 2, STATIC_OUTLINE: 3 }); export const FocusHintOutlineStyle = Object.freeze({ SOLID_BG: 0, BORDER: 1 }); export class MoveModes { // Order comes from prefs static EDGE_TILING = 0; static ADAPTIVE_TILING = 1; static FAVORITE_LAYOUT = 2; static IGNORE_TA = 3; } export class Orientation { static H = 1; static V = 2; } export class Direction { static N = 1; static E = 2; static S = 4; static W = 8; static opposite(dir) { let opposite = 0; if (dir & this.N) opposite |= this.S; if (dir & this.S) opposite |= this.N; if (dir & this.W) opposite |= this.E; if (dir & this.E) opposite |= this.W; return opposite; } } // Classes for the layouts: // See src/prefs/layoutsPrefs.js for details on layouts. export class Layout { /** * @param {object} layout is the parsed object from the layouts file. */ constructor(layout = null) { this._name = layout?._name ?? ''; this._items = layout?._items ?? []; } /** * @returns {string} */ getName() { return this._name; } /** * @param {string} name */ setName(name) { this._name = name; } /** * @param {number} index * @returns {LayoutItem} */ getItem(index) { return this._items[index]; } /** * @param {LayoutItem|null} item * @returns {LayoutItem} the added item. */ addItem(item = null) { item = item ?? new LayoutItem(); this._items.push(item); return item; } /** * @param {number} index * @returns {LayoutItem|null} the removed item. */ removeItem(index) { return this._items.splice(index, 1)[0]; } /** * @param {boolean} filterOutEmptyRects * @returns {LayoutItem[]} */ getItems(filterOutEmptyRects = true) { return filterOutEmptyRects ? this._items.filter(i => Object.keys(i.rect).length === 4) : this._items; } /** * @param {LayoutItem[]} items */ setItems(items) { this._items = items; } /** * @param {boolean} filterOutEmptyRects * @returns {number} */ getItemCount(filterOutEmptyRects = false) { return filterOutEmptyRects ? this.getItems().length : this._items.length; } /** * @returns {[boolean, string, number]} whether the layout has valid rects and * a potential error message. */ validate() { const rects = this.getItems().map(i => i.rect); if (!rects.length) return [false, 'No valid rectangles defined.', -1]; const getOverlapArea = (r1, r2) => { return Math.max(0, Math.min(r1.x + r1.width, r2.x + r2.width) - Math.max(r1.x, r2.x)) * Math.max(0, Math.min(r1.y + r1.height, r2.y + r2.height) - Math.max(r1.y, r2.y)); }; for (let i = 0; i < rects.length; i++) { const rect = rects[i]; if (rect.width <= 0 || rect.width > 1) return [false, `Rectangle ${i} has an invalid width.`, i]; if (rect.height <= 0 || rect.height > 1) return [false, `Rectangle ${i} has an invalid height.`, i]; if (rect.x < 0 || rect.y < 0 || rect.x + rect.width > 1 || rect.y + rect.height > 1) return [false, `Rectangle ${i} extends beyond the screen.`, i]; for (let j = i + 1; j < rects.length; j++) { if (getOverlapArea(rect, rects[j]) !== 0) return [false, `Rectangles ${i} and ${j} overlap.`, j]; } } return [true, '', -1]; } } var LayoutItem = class LayoutItem { constructor() { this.rect = {}; this.appId = null; this.loopType = null; } }; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/000077500000000000000000000000001500466572600264055ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/gi.js000066400000000000000000000006311500466572600273420ustar00rootroot00000000000000export { default as Atk } from 'gi://Atk'; export { default as Clutter } from 'gi://Clutter'; export { default as Gio } from 'gi://Gio'; export { default as GLib } from 'gi://GLib'; export { default as GObject } from 'gi://GObject'; export { default as Meta } from 'gi://Meta'; export { default as Mtk } from 'gi://Mtk'; export { default as Shell } from 'gi://Shell'; export { default as St } from 'gi://St'; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/prefs.js000066400000000000000000000001741500466572600300640ustar00rootroot00000000000000export { ExtensionPreferences, gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/prefs/000077500000000000000000000000001500466572600275245ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/prefs/gi.js000066400000000000000000000004141500466572600304600ustar00rootroot00000000000000export { default as Adw } from 'gi://Adw'; export { default as Gdk } from 'gi://Gdk'; export { default as Gio } from 'gi://Gio'; export { default as GLib } from 'gi://GLib'; export { default as GObject } from 'gi://GObject'; export { default as Gtk } from 'gi://Gtk'; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/shell.js000066400000000000000000000012761500466572600300600ustar00rootroot00000000000000export { Extension, gettext as _ } from 'resource:///org/gnome/shell/extensions/extension.js'; export * as AppFavorites from 'resource:///org/gnome/shell/ui/appFavorites.js'; export * as AltTab from 'resource:///org/gnome/shell/ui/altTab.js'; export * as Main from 'resource:///org/gnome/shell/ui/main.js'; export * as OsdWindow from 'resource:///org/gnome/shell/ui/osdWindow.js'; export * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; export * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; export * as SwitcherPopup from 'resource:///org/gnome/shell/ui/switcherPopup.js'; export * as WindowManager from 'resource:///org/gnome/shell/ui/windowManager.js'; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/unexported/000077500000000000000000000000001500466572600306025ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/unexported/altTab.js000066400000000000000000000644651500466572600323660ustar00rootroot00000000000000import { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } from '../gi.js'; import { Main } from '../shell.js'; import * as SwitcherPopup from './switcherPopup.js'; const THUMBNAIL_DEFAULT_SIZE = 256; const THUMBNAIL_FADE_TIME = 100; // milliseconds const THUMBNAIL_POPUP_TIME = 500; // milliseconds export const baseIconSizes = [96, 64, 48, 32, 22]; export const APP_ICON_HOVER_TIMEOUT = 200; // milliseconds function _createWindowClone(window, size) { let [width, height] = window.get_size(); let scale = Math.min(1.0, size / width, size / height); return new Clutter.Clone({ source: window, width: width * scale, height: height * scale, x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, // usual hack for the usual bug in ClutterBinLayout... x_expand: true, y_expand: true, }); } export function getWindows(workspace) { // We ignore skip-taskbar windows in switchers, but if they are attached // to their parent, their position in the MRU list may be more appropriate // than the parent; so start with the complete list ... let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, workspace); // ... map windows to their parent where appropriate ... return windows.map(w => { return w.is_attached_dialog() ? w.get_transient_for() : w; // ... and filter out skip-taskbar windows and duplicates }).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) === i); } export const AppSwitcherPopup = GObject.registerClass( class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup { _init() { super._init(); this._thumbnails = null; this._thumbnailTimeoutId = 0; this._currentWindow = -1; this.thumbnailsVisible = false; let apps = Shell.AppSystem.get_default().get_running(); this._switcherList = new AppSwitcher(apps, this); this._items = this._switcherList.icons; } vfunc_allocate(box) { super.vfunc_allocate(box); // Allocate the thumbnails // We try to avoid overflowing the screen so we base the resulting size on // those calculations if (this._thumbnails) { let childBox = this._switcherList.get_allocation_box(); let primary = Main.layoutManager.primaryMonitor; let leftPadding = this.get_theme_node().get_padding(St.Side.LEFT); let rightPadding = this.get_theme_node().get_padding(St.Side.RIGHT); let bottomPadding = this.get_theme_node().get_padding(St.Side.BOTTOM); let hPadding = leftPadding + rightPadding; let icon = this._items[this._selectedIndex]; let [posX] = icon.get_transformed_position(); let thumbnailCenter = posX + icon.width / 2; let [, childNaturalWidth] = this._thumbnails.get_preferred_width(-1); childBox.x1 = Math.max(primary.x + leftPadding, Math.floor(thumbnailCenter - childNaturalWidth / 2)); if (childBox.x1 + childNaturalWidth > primary.x + primary.width - hPadding) { let offset = childBox.x1 + childNaturalWidth - primary.width + hPadding; childBox.x1 = Math.max(primary.x + leftPadding, childBox.x1 - offset - hPadding); } let spacing = this.get_theme_node().get_length('spacing'); childBox.x2 = childBox.x1 + childNaturalWidth; if (childBox.x2 > primary.x + primary.width - rightPadding) childBox.x2 = primary.x + primary.width - rightPadding; childBox.y1 = this._switcherList.allocation.y2 + spacing; this._thumbnails.addClones(primary.y + primary.height - bottomPadding - childBox.y1); let [, childNaturalHeight] = this._thumbnails.get_preferred_height(-1); childBox.y2 = childBox.y1 + childNaturalHeight; this._thumbnails.allocate(childBox); } } _initialSelection(backward, binding) { if (binding === 'switch-group') { if (backward) this._select(0, this._items[0].cachedWindows.length - 1); else if (this._items[0].cachedWindows.length > 1) this._select(0, 1); else this._select(0, 0); } else if (binding === 'switch-group-backward') { this._select(0, this._items[0].cachedWindows.length - 1); } else if (binding === 'switch-applications-backward') { this._select(this._items.length - 1); } else if (this._items.length === 1) { this._select(0); } else if (backward) { this._select(this._items.length - 1); } else { this._select(1); } } _nextWindow() { // We actually want the second window if we're in the unset state if (this._currentWindow === -1) this._currentWindow = 0; return SwitcherPopup.mod( this._currentWindow + 1, this._items[this._selectedIndex].cachedWindows.length); } _previousWindow() { // Also assume second window here if (this._currentWindow === -1) this._currentWindow = 1; return SwitcherPopup.mod( this._currentWindow - 1, this._items[this._selectedIndex].cachedWindows.length); } _closeAppWindow(appIndex, windowIndex) { let appIcon = this._items[appIndex]; if (!appIcon) return; let window = appIcon.cachedWindows[windowIndex]; if (!window) return; window.delete(global.get_current_time()); } _quitApplication(appIndex) { let appIcon = this._items[appIndex]; if (!appIcon) return; appIcon.app.request_quit(); } _keyPressHandler(keysym, action) { const rtl = Clutter.get_default_text_direction() === Clutter.TextDirection.RTL; if (action === Meta.KeyBindingAction.SWITCH_GROUP) { if (!this._thumbnailsFocused) this._select(this._selectedIndex, 0); else this._select(this._selectedIndex, this._nextWindow()); } else if (action === Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) { this._select(this._selectedIndex, this._previousWindow()); } else if (action === Meta.KeyBindingAction.SWITCH_APPLICATIONS) { this._select(this._next()); } else if (action === Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) { this._select(this._previous()); } else if (keysym === Clutter.KEY_q || keysym === Clutter.KEY_Q) { this._quitApplication(this._selectedIndex); } else if (this._thumbnailsFocused) { if (keysym === Clutter.KEY_Left) this._select(this._selectedIndex, rtl ? this._nextWindow() : this._previousWindow()); else if (keysym === Clutter.KEY_Right) this._select(this._selectedIndex, rtl ? this._previousWindow() : this._nextWindow()); else if (keysym === Clutter.KEY_Up) this._select(this._selectedIndex, null, true); else if (keysym === Clutter.KEY_w || keysym === Clutter.KEY_W || keysym === Clutter.KEY_F4) this._closeAppWindow(this._selectedIndex, this._currentWindow); else return Clutter.EVENT_PROPAGATE; } else if (keysym === Clutter.KEY_Left) { this._select(rtl ? this._next() : this._previous()); } else if (keysym === Clutter.KEY_Right) { this._select(rtl ? this._previous() : this._next()); } else if (keysym === Clutter.KEY_Down) { this._select(this._selectedIndex, 0); } else { return Clutter.EVENT_PROPAGATE; } return Clutter.EVENT_STOP; } _scrollHandler(direction) { if (direction === Clutter.ScrollDirection.UP) { if (this._thumbnailsFocused) { if (this._currentWindow === 0 || this._currentWindow === -1) this._select(this._previous()); else this._select(this._selectedIndex, this._previousWindow()); } else { let nwindows = this._items[this._selectedIndex].cachedWindows.length; if (nwindows > 1) this._select(this._selectedIndex, nwindows - 1); else this._select(this._previous()); } } else if (direction === Clutter.ScrollDirection.DOWN) { if (this._thumbnailsFocused) { if (this._currentWindow === this._items[this._selectedIndex].cachedWindows.length - 1) this._select(this._next()); else this._select(this._selectedIndex, this._nextWindow()); } else { let nwindows = this._items[this._selectedIndex].cachedWindows.length; if (nwindows > 1) this._select(this._selectedIndex, 0); else this._select(this._next()); } } } _itemActivatedHandler(n) { // If the user clicks on the selected app, activate the // selected window; otherwise (eg, they click on an app while // !mouseActive) activate the clicked-on app. if (n === this._selectedIndex && this._currentWindow >= 0) this._select(n, this._currentWindow); else this._select(n); } _windowActivated(thumbnailSwitcher, n) { let appIcon = this._items[this._selectedIndex]; Main.activateWindow(appIcon.cachedWindows[n]); this.fadeAndDestroy(); } _windowEntered(thumbnailSwitcher, n) { if (!this.mouseActive) return; this._select(this._selectedIndex, n); } _windowRemoved(thumbnailSwitcher, n) { let appIcon = this._items[this._selectedIndex]; if (!appIcon) return; if (appIcon.cachedWindows.length > 0) { let newIndex = Math.min(n, appIcon.cachedWindows.length - 1); this._select(this._selectedIndex, newIndex); } } _finish(timestamp) { let appIcon = this._items[this._selectedIndex]; if (this._currentWindow < 0) appIcon.app.activate_window(appIcon.cachedWindows[0], timestamp); else if (appIcon.cachedWindows[this._currentWindow]) Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp); super._finish(timestamp); } _onDestroy() { if (this._thumbnailTimeoutId !== 0) GLib.source_remove(this._thumbnailTimeoutId); super._onDestroy(); } /** * _select: * * @param {number} app index of the app to select * @param {number} [window] index of which of `app`'s windows to select * @param {boolean} [forceAppFocus] optional flag, see below * * Selects the indicated `app`, and optional `window`, and sets * this._thumbnailsFocused appropriately to indicate whether the * arrow keys should act on the app list or the thumbnail list. * * If `app` is specified and `window` is unspecified or %null, then * the app is highlighted (ie, given a light background), and the * current thumbnail list, if any, is destroyed. If `app` has * multiple windows, and `forceAppFocus` is not %true, then a * timeout is started to open a thumbnail list. * * If `app` and `window` are specified (and `forceAppFocus` is not), * then `app` will be outlined, a thumbnail list will be created * and focused (if it hasn't been already), and the `window`'th * window in it will be highlighted. * * If `app` and `window` are specified and `forceAppFocus` is %true, * then `app` will be highlighted, and `window` outlined, and the * app list will have the keyboard focus. */ _select(app, window, forceAppFocus) { if (app !== this._selectedIndex || window == null) { if (this._thumbnails) this._destroyThumbnails(); } if (this._thumbnailTimeoutId !== 0) { GLib.source_remove(this._thumbnailTimeoutId); this._thumbnailTimeoutId = 0; } this._thumbnailsFocused = (window != null) && !forceAppFocus; this._selectedIndex = app; this._currentWindow = window ? window : -1; this._switcherList.highlight(app, this._thumbnailsFocused); if (window != null) { if (!this._thumbnails) this._createThumbnails(); this._currentWindow = window; this._thumbnails.highlight(window, forceAppFocus); } else if (this._items[this._selectedIndex].cachedWindows.length > 1 && !forceAppFocus) { this._thumbnailTimeoutId = GLib.timeout_add( GLib.PRIORITY_DEFAULT, THUMBNAIL_POPUP_TIME, this._timeoutPopupThumbnails.bind(this)); GLib.Source.set_name_by_id(this._thumbnailTimeoutId, '[gnome-shell] this._timeoutPopupThumbnails'); } } _timeoutPopupThumbnails() { if (!this._thumbnails) this._createThumbnails(); this._thumbnailTimeoutId = 0; this._thumbnailsFocused = false; return GLib.SOURCE_REMOVE; } _destroyThumbnails() { let thumbnailsActor = this._thumbnails; this._thumbnails.ease({ opacity: 0, duration: THUMBNAIL_FADE_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => { thumbnailsActor.destroy(); this.thumbnailsVisible = false; }, }); this._thumbnails = null; this._switcherList.removeAccessibleState(this._selectedIndex, Atk.StateType.EXPANDED); } _createThumbnails() { this._thumbnails = new ThumbnailSwitcher(this._items[this._selectedIndex].cachedWindows); this._thumbnails.connect('item-activated', this._windowActivated.bind(this)); this._thumbnails.connect('item-entered', this._windowEntered.bind(this)); this._thumbnails.connect('item-removed', this._windowRemoved.bind(this)); this._thumbnails.connect('destroy', () => { this._thumbnails = null; this._thumbnailsFocused = false; }); this.add_child(this._thumbnails); // Need to force an allocation so we can figure out whether we // need to scroll when selecting this._thumbnails.get_allocation_box(); this._thumbnails.opacity = 0; this._thumbnails.ease({ opacity: 255, duration: THUMBNAIL_FADE_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => { this.thumbnailsVisible = true; }, }); this._switcherList.addAccessibleState(this._selectedIndex, Atk.StateType.EXPANDED); } }); export const AppIcon = GObject.registerClass( class AppIcon extends St.BoxLayout { _init(app) { super._init({ style_class: 'alt-tab-app', vertical: true, }); this.app = app; this.icon = null; this._iconBin = new St.Bin(); this.add_child(this._iconBin); this.label = new St.Label({ text: this.app.get_name(), x_align: Clutter.ActorAlign.CENTER, }); this.add_child(this.label); } // eslint-disable-next-line camelcase set_size(size) { this.icon = this.app.create_icon_texture(size); this._iconBin.child = this.icon; } }); const AppSwitcher = GObject.registerClass( class AppSwitcher extends SwitcherPopup.SwitcherList { _init(apps, altTabPopup) { super._init(true); this.icons = []; this._arrows = []; let windowTracker = Shell.WindowTracker.get_default(); let settings = new Gio.Settings({schema_id: 'org.gnome.shell.app-switcher'}); let workspace = null; if (settings.get_boolean('current-workspace-only')) { let workspaceManager = global.workspace_manager; workspace = workspaceManager.get_active_workspace(); } let allWindows = getWindows(workspace); // Construct the AppIcons, add to the popup for (let i = 0; i < apps.length; i++) { let appIcon = new AppIcon(apps[i]); // Cache the window list now; we don't handle dynamic changes here, // and we don't want to be continually retrieving it appIcon.cachedWindows = allWindows.filter( w => windowTracker.get_window_app(w) === appIcon.app); if (appIcon.cachedWindows.length > 0) this._addIcon(appIcon); } this._altTabPopup = altTabPopup; this._delayedHighlighted = -1; this._mouseTimeOutId = 0; this.connect('destroy', this._onDestroy.bind(this)); } _onDestroy() { if (this._mouseTimeOutId !== 0) GLib.source_remove(this._mouseTimeOutId); this.icons.forEach( icon => icon.app.disconnectObject(this)); } _setIconSize() { let j = 0; while (this._items.length > 1 && this._items[j].style_class !== 'item-box') j++; let themeNode = this._items[j].get_theme_node(); this._list.ensure_style(); let iconPadding = themeNode.get_horizontal_padding(); let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT); let [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1); let iconSpacing = labelNaturalHeight + iconPadding + iconBorder; let totalSpacing = this._list.spacing * (this._items.length - 1); // We just assume the whole screen here due to weirdness happening with the passed width let primary = Main.layoutManager.primaryMonitor; let parentPadding = this.get_parent().get_theme_node().get_horizontal_padding(); let availWidth = primary.width - parentPadding - this.get_theme_node().get_horizontal_padding(); let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let iconSizes = baseIconSizes.map(s => s * scaleFactor); let iconSize = baseIconSizes[0]; if (this._items.length > 1) { for (let i = 0; i < baseIconSizes.length; i++) { iconSize = baseIconSizes[i]; let height = iconSizes[i] + iconSpacing; let w = height * this._items.length + totalSpacing; if (w <= availWidth) break; } } this._iconSize = iconSize; for (let i = 0; i < this.icons.length; i++) { if (this.icons[i].icon != null) break; this.icons[i].set_size(iconSize); } } vfunc_get_preferred_height(forWidth) { if (!this._iconSize) this._setIconSize(); return super.vfunc_get_preferred_height(forWidth); } vfunc_allocate(box) { // Allocate the main list items super.vfunc_allocate(box); let contentBox = this.get_theme_node().get_content_box(box); let arrowHeight = Math.floor(this.get_theme_node().get_padding(St.Side.BOTTOM) / 3); let arrowWidth = arrowHeight * 2; // Now allocate each arrow underneath its item let childBox = new Clutter.ActorBox(); for (let i = 0; i < this._items.length; i++) { let itemBox = this._items[i].allocation; childBox.x1 = contentBox.x1 + Math.floor(itemBox.x1 + (itemBox.x2 - itemBox.x1 - arrowWidth) / 2); childBox.x2 = childBox.x1 + arrowWidth; childBox.y1 = contentBox.y1 + itemBox.y2 + arrowHeight; childBox.y2 = childBox.y1 + arrowHeight; this._arrows[i].allocate(childBox); } } // We override SwitcherList's _onItemMotion method to delay // activation when the thumbnail list is open _onItemMotion(item) { if (item === this._items[this._highlighted] || item === this._items[this._delayedHighlighted]) return Clutter.EVENT_PROPAGATE; const index = this._items.indexOf(item); if (this._mouseTimeOutId !== 0) { GLib.source_remove(this._mouseTimeOutId); this._delayedHighlighted = -1; this._mouseTimeOutId = 0; } if (this._altTabPopup.thumbnailsVisible) { this._delayedHighlighted = index; this._mouseTimeOutId = GLib.timeout_add( GLib.PRIORITY_DEFAULT, APP_ICON_HOVER_TIMEOUT, () => { this._enterItem(index); this._delayedHighlighted = -1; this._mouseTimeOutId = 0; return GLib.SOURCE_REMOVE; }); GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem'); } else { this._itemEntered(index); } return Clutter.EVENT_PROPAGATE; } _enterItem(index) { let [x, y] = global.get_pointer(); let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); if (this._items[index].contains(pickedActor)) this._itemEntered(index); } // We override SwitcherList's highlight() method to also deal with // the AppSwitcher->ThumbnailSwitcher arrows. Apps with only 1 window // will hide their arrows by default, but show them when their // thumbnails are visible (ie, when the app icon is supposed to be // in justOutline mode). Apps with multiple windows will normally // show a dim arrow, but show a bright arrow when they are // highlighted. highlight(n, justOutline) { if (this.icons[this._highlighted]) { if (this.icons[this._highlighted].cachedWindows.length === 1) this._arrows[this._highlighted].hide(); else this._arrows[this._highlighted].remove_style_pseudo_class('highlighted'); } super.highlight(n, justOutline); if (this._highlighted !== -1) { if (justOutline && this.icons[this._highlighted].cachedWindows.length === 1) this._arrows[this._highlighted].show(); else this._arrows[this._highlighted].add_style_pseudo_class('highlighted'); } } _addIcon(appIcon) { this.icons.push(appIcon); let item = this.addItem(appIcon, appIcon.label); appIcon.app.connectObject('notify::state', app => { if (app.state !== Shell.AppState.RUNNING) this._removeIcon(app); }, this); let arrow = new St.DrawingArea({style_class: 'switcher-arrow'}); arrow.connect('repaint', () => SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM)); this.add_child(arrow); this._arrows.push(arrow); if (appIcon.cachedWindows.length === 1) arrow.hide(); else item.add_accessible_state(Atk.StateType.EXPANDABLE); } _removeIcon(app) { let index = this.icons.findIndex(icon => { return icon.app === app; }); if (index === -1) return; this._arrows[index].destroy(); this._arrows.splice(index, 1); this.icons.splice(index, 1); this.removeItem(index); } }); const ThumbnailSwitcher = GObject.registerClass( class ThumbnailSwitcher extends SwitcherPopup.SwitcherList { _init(windows) { super._init(false); this._labels = []; this._thumbnailBins = []; this._clones = []; this._windows = windows; for (let i = 0; i < windows.length; i++) { const box = new St.BoxLayout({ style_class: 'thumbnail-box', vertical: true, }); let bin = new St.Bin({style_class: 'thumbnail'}); box.add_child(bin); this._thumbnailBins.push(bin); const title = windows[i].get_title(); const name = new St.Label({ text: title, // St.Label doesn't support text-align x_align: Clutter.ActorAlign.CENTER, }); this._labels.push(name); box.add_child(name); this.addItem(box, name); } this.connect('destroy', this._onDestroy.bind(this)); } addClones(availHeight) { if (!this._thumbnailBins.length) return; let totalPadding = this._items[0].get_theme_node().get_horizontal_padding() + this._items[0].get_theme_node().get_vertical_padding(); totalPadding += this.get_theme_node().get_horizontal_padding() + this.get_theme_node().get_vertical_padding(); let [, labelNaturalHeight] = this._labels[0].get_preferred_height(-1); let spacing = this._items[0].child.get_theme_node().get_length('spacing'); let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let thumbnailSize = THUMBNAIL_DEFAULT_SIZE * scaleFactor; availHeight = Math.min(availHeight - labelNaturalHeight - totalPadding - spacing, thumbnailSize); let binHeight = availHeight + this._items[0].get_theme_node().get_vertical_padding() + this.get_theme_node().get_vertical_padding() - spacing; binHeight = Math.min(thumbnailSize, binHeight); for (let i = 0; i < this._thumbnailBins.length; i++) { let mutterWindow = this._windows[i].get_compositor_private(); if (!mutterWindow) continue; let clone = _createWindowClone(mutterWindow, thumbnailSize); this._thumbnailBins[i].set_height(binHeight); this._thumbnailBins[i].child = clone; mutterWindow.connectObject('destroy', source => this._removeThumbnail(source, clone), this); this._clones.push(clone); } // Make sure we only do this once this._thumbnailBins = []; } _removeThumbnail(source, clone) { let index = this._clones.indexOf(clone); if (index === -1) return; this._clones.splice(index, 1); this._windows.splice(index, 1); this._labels.splice(index, 1); this.removeItem(index); if (this._clones.length > 0) this.highlight(SwitcherPopup.mod(index, this._clones.length)); else this.destroy(); } _onDestroy() { this._clones.forEach( clone => clone?.source.disconnectObject(this)); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/unexported/switcherPopup.js000066400000000000000000000521271500466572600340230ustar00rootroot00000000000000import { Clutter, GLib, GObject, St } from '../gi.js'; import { Main } from '../shell.js'; const POPUP_DELAY_TIMEOUT = 150; // milliseconds const POPUP_SCROLL_TIME = 100; // milliseconds const POPUP_FADE_OUT_TIME = 100; // milliseconds const DISABLE_HOVER_TIMEOUT = 500; // milliseconds const NO_MODS_TIMEOUT = 1500; // milliseconds /** * @param {number} a * @param {number} b * @returns {number} */ export function mod(a, b) { return (a + b) % b; } function primaryModifier(mask) { if (mask === 0) return 0; let primary = 1; while (mask > 1) { mask >>= 1; primary <<= 1; } return primary; } export const SwitcherPopup = GObject.registerClass({ GTypeFlags: GObject.TypeFlags.ABSTRACT, }, class SwitcherPopup extends St.Widget { _init(items) { super._init({ style_class: 'switcher-popup', reactive: true, visible: false, }); this._switcherList = null; this._items = items || []; this._selectedIndex = 0; this.connect('destroy', this._onDestroy.bind(this)); Main.uiGroup.add_child(this); Main.layoutManager.connectObject( 'system-modal-opened', () => this.destroy(), this); this._haveModal = false; this._modifierMask = 0; this._motionTimeoutId = 0; this._initialDelayTimeoutId = 0; this._noModsTimeoutId = 0; this.add_constraint(new Clutter.BindConstraint({ source: global.stage, coordinate: Clutter.BindCoordinate.ALL, })); // Initially disable hover so we ignore the enter-event if // the switcher appears underneath the current pointer location this._disableHover(); } vfunc_allocate(box) { this.set_allocation(box); let childBox = new Clutter.ActorBox(); let primary = Main.layoutManager.primaryMonitor; let leftPadding = this.get_theme_node().get_padding(St.Side.LEFT); let rightPadding = this.get_theme_node().get_padding(St.Side.RIGHT); let hPadding = leftPadding + rightPadding; // Allocate the switcherList // We select a size based on an icon size that does not overflow the screen let [, childNaturalHeight] = this._switcherList.get_preferred_height(primary.width - hPadding); let [, childNaturalWidth] = this._switcherList.get_preferred_width(childNaturalHeight); childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2)); childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth); childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2); childBox.y2 = childBox.y1 + childNaturalHeight; this._switcherList.allocate(childBox); } _initialSelection(backward, _binding) { if (backward) this._select(this._items.length - 1); else if (this._items.length === 1) this._select(0); else this._select(1); } show(backward, binding, mask) { if (this._items.length === 0) return false; let grab = Main.pushModal(this); // We expect at least a keyboard grab here if ((grab.get_seat_state() & Clutter.GrabState.KEYBOARD) === 0) { Main.popModal(grab); return false; } this._grab = grab; this._haveModal = true; this._modifierMask = primaryModifier(mask); this.add_child(this._switcherList); this._switcherList.connect('item-activated', this._itemActivated.bind(this)); this._switcherList.connect('item-entered', this._itemEntered.bind(this)); this._switcherList.connect('item-removed', this._itemRemoved.bind(this)); // Need to force an allocation so we can figure out whether we // need to scroll when selecting this.opacity = 0; this.visible = true; this.get_allocation_box(); this._initialSelection(backward, binding); // There's a race condition; if the user released Alt before // we got the grab, then we won't be notified. (See // https://bugzilla.gnome.org/show_bug.cgi?id=596695 for // details.) So we check now. (Have to do this after updating // selection.) if (this._modifierMask) { let [x_, y_, mods] = global.get_pointer(); if (!(mods & this._modifierMask)) { this._finish(global.get_current_time()); return true; } } else { this._resetNoModsTimeout(); } // We delay showing the popup so that fast Alt+Tab users aren't // disturbed by the popup briefly flashing. this._initialDelayTimeoutId = GLib.timeout_add( GLib.PRIORITY_DEFAULT, POPUP_DELAY_TIMEOUT, () => { this._showImmediately(); return GLib.SOURCE_REMOVE; }); GLib.Source.set_name_by_id(this._initialDelayTimeoutId, '[gnome-shell] Main.osdWindow.cancel'); return true; } _showImmediately() { if (this._initialDelayTimeoutId === 0) return; GLib.source_remove(this._initialDelayTimeoutId); this._initialDelayTimeoutId = 0; Main.osdWindowManager.hideAll(); this.opacity = 255; } _next() { return mod(this._selectedIndex + 1, this._items.length); } _previous() { return mod(this._selectedIndex - 1, this._items.length); } _keyPressHandler(_keysym, _action) { throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`); } vfunc_key_press_event(event) { let keysym = event.get_key_symbol(); let action = global.display.get_keybinding_action( event.get_key_code(), event.get_state()); this._disableHover(); if (this._keyPressHandler(keysym, action) !== Clutter.EVENT_PROPAGATE) { this._showImmediately(); return Clutter.EVENT_STOP; } // Note: pressing one of the below keys will destroy the popup only if // that key is not used by the active popup's keyboard shortcut if (keysym === Clutter.KEY_Escape || keysym === Clutter.KEY_Tab) this.fadeAndDestroy(); // Allow to explicitly select the current item; this is particularly // useful for no-modifier popups if (keysym === Clutter.KEY_space || keysym === Clutter.KEY_Return || keysym === Clutter.KEY_KP_Enter || keysym === Clutter.KEY_ISO_Enter) this._finish(event.get_time()); return Clutter.EVENT_STOP; } vfunc_key_release_event(event) { if (this._modifierMask) { let [x_, y_, mods] = global.get_pointer(); let state = mods & this._modifierMask; if (state === 0) this._finish(event.get_time()); } else { this._resetNoModsTimeout(); } return Clutter.EVENT_STOP; } vfunc_button_press_event() { /* We clicked outside */ this.fadeAndDestroy(); return Clutter.EVENT_PROPAGATE; } _scrollHandler(direction) { if (direction === Clutter.ScrollDirection.UP) this._select(this._previous()); else if (direction === Clutter.ScrollDirection.DOWN) this._select(this._next()); } vfunc_scroll_event(event) { this._disableHover(); this._scrollHandler(event.get_scroll_direction()); return Clutter.EVENT_PROPAGATE; } _itemActivatedHandler(n) { this._select(n); } _itemActivated(switcher, n) { this._itemActivatedHandler(n); this._finish(global.get_current_time()); } _itemEnteredHandler(n) { this._select(n); } _itemEntered(switcher, n) { if (!this.mouseActive) return; this._itemEnteredHandler(n); } _itemRemovedHandler(n) { if (this._items.length > 0) { let newIndex; if (n < this._selectedIndex) newIndex = this._selectedIndex - 1; else if (n === this._selectedIndex) newIndex = Math.min(n, this._items.length - 1); else if (n > this._selectedIndex) return; // No need to select something new in this case this._select(newIndex); } else { this.fadeAndDestroy(); } } _itemRemoved(switcher, n) { this._itemRemovedHandler(n); } _disableHover() { this.mouseActive = false; if (this._motionTimeoutId !== 0) GLib.source_remove(this._motionTimeoutId); this._motionTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, DISABLE_HOVER_TIMEOUT, this._mouseTimedOut.bind(this)); GLib.Source.set_name_by_id(this._motionTimeoutId, '[gnome-shell] this._mouseTimedOut'); } _mouseTimedOut() { this._motionTimeoutId = 0; this.mouseActive = true; return GLib.SOURCE_REMOVE; } _resetNoModsTimeout() { if (this._noModsTimeoutId !== 0) GLib.source_remove(this._noModsTimeoutId); this._noModsTimeoutId = GLib.timeout_add( GLib.PRIORITY_DEFAULT, NO_MODS_TIMEOUT, () => { this._finish(global.display.get_current_time_roundtrip()); this._noModsTimeoutId = 0; return GLib.SOURCE_REMOVE; }); } _popModal() { if (this._haveModal) { Main.popModal(this._grab); this._grab = null; this._haveModal = false; } } fadeAndDestroy() { this._popModal(); if (this.opacity > 0) { this.ease({ opacity: 0, duration: POPUP_FADE_OUT_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => this.destroy(), }); } else { this.destroy(); } } _finish(_timestamp) { this.fadeAndDestroy(); } _onDestroy() { this._popModal(); if (this._motionTimeoutId !== 0) GLib.source_remove(this._motionTimeoutId); if (this._initialDelayTimeoutId !== 0) GLib.source_remove(this._initialDelayTimeoutId); if (this._noModsTimeoutId !== 0) GLib.source_remove(this._noModsTimeoutId); // Make sure the SwitcherList is always destroyed, it may not be // a child of the actor at this point. if (this._switcherList) this._switcherList.destroy(); } _select(num) { this._selectedIndex = num; this._switcherList.highlight(num); } }); const SwitcherButton = GObject.registerClass( class SwitcherButton extends St.Button { _init(square) { super._init({ style_class: 'item-box', reactive: true, }); this._square = square; } vfunc_get_preferred_width(forHeight) { if (this._square) return this.get_preferred_height(-1); else return super.vfunc_get_preferred_width(forHeight); } }); export const SwitcherList = GObject.registerClass({ Signals: { 'item-activated': {param_types: [GObject.TYPE_INT]}, 'item-entered': {param_types: [GObject.TYPE_INT]}, 'item-removed': {param_types: [GObject.TYPE_INT]}, }, }, class SwitcherList extends St.Widget { _init(squareItems) { super._init({style_class: 'switcher-list'}); this._list = new St.BoxLayout({ style_class: 'switcher-list-item-container', vertical: false, x_expand: true, y_expand: true, }); let layoutManager = this._list.get_layout_manager(); this._list.spacing = 0; this._list.connect('style-changed', () => { this._list.spacing = this._list.get_theme_node().get_length('spacing'); }); this._scrollView = new St.ScrollView({ style_class: 'hfade', enable_mouse_scrolling: false, hscrollbar_policy: St.PolicyType.NEVER, vscrollbar_policy: St.PolicyType.NEVER, child: this._list, }); this.add_child(this._scrollView); // Those arrows indicate whether scrolling in one direction is possible this._leftArrow = new St.DrawingArea({ style_class: 'switcher-arrow', pseudo_class: 'highlighted', }); this._leftArrow.connect('repaint', () => { drawArrow(this._leftArrow, St.Side.LEFT); }); this._rightArrow = new St.DrawingArea({ style_class: 'switcher-arrow', pseudo_class: 'highlighted', }); this._rightArrow.connect('repaint', () => { drawArrow(this._rightArrow, St.Side.RIGHT); }); this.add_child(this._leftArrow); this.add_child(this._rightArrow); this._items = []; this._highlighted = -1; this._squareItems = squareItems; this._scrollableRight = true; this._scrollableLeft = false; layoutManager.homogeneous = squareItems; } addItem(item, label) { let bbox = new SwitcherButton(this._squareItems); bbox.set_child(item); this._list.add_child(bbox); bbox.connect('clicked', () => this._onItemClicked(bbox)); bbox.connect('motion-event', () => this._onItemMotion(bbox)); bbox.label_actor = label; this._items.push(bbox); return bbox; } removeItem(index) { let item = this._items.splice(index, 1); item[0].destroy(); this.emit('item-removed', index); } addAccessibleState(index, state) { this._items[index].add_accessible_state(state); } removeAccessibleState(index, state) { this._items[index].remove_accessible_state(state); } _onItemClicked(item) { this._itemActivated(this._items.indexOf(item)); } _onItemMotion(item) { // Avoid reentrancy if (item !== this._items[this._highlighted]) this._itemEntered(this._items.indexOf(item)); return Clutter.EVENT_PROPAGATE; } highlight(index, justOutline) { if (this._items[this._highlighted]) { this._items[this._highlighted].remove_style_pseudo_class('selected'); this._items[this._highlighted].remove_style_pseudo_class('highlighted'); } if (this._items[index]) { if (justOutline) this._items[index].add_style_pseudo_class('highlighted'); else this._items[index].add_style_pseudo_class('selected'); } this._highlighted = index; const adjustment = this._scrollView.hadjustment; let [value] = adjustment.get_values(); let [absItemX] = this._items[index].get_transformed_position(); let [result_, posX, posY_] = this.transform_stage_point(absItemX, 0); let [containerWidth] = this.get_transformed_size(); if (posX + this._items[index].get_width() > containerWidth) this._scrollToRight(index); else if (this._items[index].allocation.x1 - value < 0) this._scrollToLeft(index); } _scrollToLeft(index) { const adjustment = this._scrollView.hadjustment; let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values(); let item = this._items[index]; if (item.allocation.x1 < value) value = Math.max(0, item.allocation.x1); else if (item.allocation.x2 > value + pageSize) value = Math.min(upper, item.allocation.x2 - pageSize); this._scrollableRight = true; adjustment.ease(value, { progress_mode: Clutter.AnimationMode.EASE_OUT_QUAD, duration: POPUP_SCROLL_TIME, onComplete: () => { if (index === 0) this._scrollableLeft = false; this.queue_relayout(); }, }); } _scrollToRight(index) { const adjustment = this._scrollView.hadjustment; let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values(); let item = this._items[index]; if (item.allocation.x1 < value) value = Math.max(0, item.allocation.x1); else if (item.allocation.x2 > value + pageSize) value = Math.min(upper, item.allocation.x2 - pageSize); this._scrollableLeft = true; adjustment.ease(value, { progress_mode: Clutter.AnimationMode.EASE_OUT_QUAD, duration: POPUP_SCROLL_TIME, onComplete: () => { if (index === this._items.length - 1) this._scrollableRight = false; this.queue_relayout(); }, }); } _itemActivated(n) { this.emit('item-activated', n); } _itemEntered(n) { this.emit('item-entered', n); } _maxChildWidth(forHeight) { let maxChildMin = 0; let maxChildNat = 0; for (let i = 0; i < this._items.length; i++) { let [childMin, childNat] = this._items[i].get_preferred_width(forHeight); maxChildMin = Math.max(childMin, maxChildMin); maxChildNat = Math.max(childNat, maxChildNat); if (this._squareItems) { [childMin, childNat] = this._items[i].get_preferred_height(-1); maxChildMin = Math.max(childMin, maxChildMin); maxChildNat = Math.max(childNat, maxChildNat); } } return [maxChildMin, maxChildNat]; } vfunc_get_preferred_width(forHeight) { let themeNode = this.get_theme_node(); let [maxChildMin] = this._maxChildWidth(forHeight); let [minListWidth] = this._list.get_preferred_width(forHeight); return themeNode.adjust_preferred_width(maxChildMin, minListWidth); } vfunc_get_preferred_height(_forWidth) { let maxChildMin = 0; let maxChildNat = 0; for (let i = 0; i < this._items.length; i++) { let [childMin, childNat] = this._items[i].get_preferred_height(-1); maxChildMin = Math.max(childMin, maxChildMin); maxChildNat = Math.max(childNat, maxChildNat); } if (this._squareItems) { let [childMin] = this._maxChildWidth(-1); maxChildMin = Math.max(childMin, maxChildMin); maxChildNat = maxChildMin; } let themeNode = this.get_theme_node(); return themeNode.adjust_preferred_height(maxChildMin, maxChildNat); } vfunc_allocate(box) { this.set_allocation(box); let contentBox = this.get_theme_node().get_content_box(box); let width = contentBox.x2 - contentBox.x1; let height = contentBox.y2 - contentBox.y1; let leftPadding = this.get_theme_node().get_padding(St.Side.LEFT); let rightPadding = this.get_theme_node().get_padding(St.Side.RIGHT); let [minListWidth] = this._list.get_preferred_width(height); let childBox = new Clutter.ActorBox(); let scrollable = minListWidth > width; this._scrollView.allocate(contentBox); let arrowWidth = Math.floor(leftPadding / 3); let arrowHeight = arrowWidth * 2; childBox.x1 = leftPadding / 2; childBox.y1 = this.height / 2 - arrowWidth; childBox.x2 = childBox.x1 + arrowWidth; childBox.y2 = childBox.y1 + arrowHeight; this._leftArrow.allocate(childBox); this._leftArrow.opacity = this._scrollableLeft && scrollable ? 255 : 0; arrowWidth = Math.floor(rightPadding / 3); arrowHeight = arrowWidth * 2; childBox.x1 = this.width - arrowWidth - rightPadding / 2; childBox.y1 = this.height / 2 - arrowWidth; childBox.x2 = childBox.x1 + arrowWidth; childBox.y2 = childBox.y1 + arrowHeight; this._rightArrow.allocate(childBox); this._rightArrow.opacity = this._scrollableRight && scrollable ? 255 : 0; } }); /** * @param {St.DrawingArrow} area * @param {St.Side} side */ export function drawArrow(area, side) { let themeNode = area.get_theme_node(); let borderColor = themeNode.get_border_color(side); let bodyColor = themeNode.get_foreground_color(); let [width, height] = area.get_surface_size(); let cr = area.get_context(); cr.setLineWidth(1.0); cr.setSourceColor(borderColor); switch (side) { case St.Side.TOP: cr.moveTo(0, height); cr.lineTo(Math.floor(width * 0.5), 0); cr.lineTo(width, height); break; case St.Side.BOTTOM: cr.moveTo(width, 0); cr.lineTo(Math.floor(width * 0.5), height); cr.lineTo(0, 0); break; case St.Side.LEFT: cr.moveTo(width, height); cr.lineTo(0, Math.floor(height * 0.5)); cr.lineTo(width, 0); break; case St.Side.RIGHT: cr.moveTo(0, 0); cr.lineTo(width, Math.floor(height * 0.5)); cr.lineTo(0, height); break; } cr.strokePreserve(); cr.setSourceColor(bodyColor); cr.fill(); cr.$dispose(); } Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/dependencies/unexported/windowManager.js000066400000000000000000000000521500466572600337370ustar00rootroot00000000000000export const WINDOW_ANIMATION_TIME = 250; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/000077500000000000000000000000001500466572600257735ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/altTab.js000066400000000000000000000416261500466572600275510ustar00rootroot00000000000000import { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } from '../dependencies/gi.js'; import { Extension, Main } from '../dependencies/shell.js'; import { AppSwitcherPopup, AppIcon as BaseAppIcon, baseIconSizes, APP_ICON_HOVER_TIMEOUT } from '../dependencies/unexported/altTab.js'; import * as SwitcherPopup from '../dependencies/unexported/switcherPopup.js'; import { Settings } from '../common.js'; import { TilingWindowManager as Twm } from './tilingWindowManager.js'; /** * Optionally, override GNOME's altTab / appSwitcher to group tileGroups */ export default class AltTabOverride { constructor() { if (Settings.getBoolean('tilegroups-in-app-switcher')) this._overrideNativeAppSwitcher(); this._settingsId = Settings.changed('tilegroups-in-app-switcher', () => { if (Settings.getBoolean('tilegroups-in-app-switcher')) this._overrideNativeAppSwitcher(); else this._restoreNativeAppSwitcher(); }); } destroy() { Settings.disconnect(this._settingsId); this._restoreNativeAppSwitcher(); } _overrideNativeAppSwitcher() { Main.wm.setCustomKeybindingHandler( 'switch-applications', Shell.ActionMode.NORMAL, this._startSwitcher.bind(this) ); } _restoreNativeAppSwitcher() { Main.wm.setCustomKeybindingHandler( 'switch-applications', Shell.ActionMode.NORMAL, Main.wm._startSwitcher.bind(Main.wm) ); } /** * Copy-pasta from windowManager.js. Removed unused stuff... * * @param {*} display - * @param {*} window - * @param {*} binding - */ _startSwitcher(display, window, binding) { if (Main.wm._workspaceSwitcherPopup !== null) Main.wm._workspaceSwitcherPopup.destroy(); const tabPopup = new TilingAppSwitcherPopup(); if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask())) tabPopup.destroy(); } } export const TilingAppSwitcherPopup = GObject.registerClass( class TilingAppSwitcherPopup extends AppSwitcherPopup { _init() { SwitcherPopup.SwitcherPopup.prototype._init.call(this); const settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' }); const workspace = settings.get_boolean('current-workspace-only') ? global.workspace_manager.get_active_workspace() : null; const windows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); this._switcherList = new TilingAppSwitcher(this, windows); this._items = this._switcherList.icons; } // Called when closing an entire app / tileGroup _quitApplication(index) { const item = this._items[index]; if (!item) return; item.cachedWindows.forEach(w => w.delete(global.get_current_time())); item.cachedWindows = []; this._switcherList._removeIcon(item); } // Called when closing a window with the thumbnail switcher // meaning that .cachedWindow of an item was updated via signals _windowRemoved(thumbnailSwitcher, n) { const item = this._items[this._selectedIndex]; if (!item) return; if (item.cachedWindows.length) { const newIndex = Math.min(n, item.cachedWindows.length - 1); this._select(this._selectedIndex, newIndex); } item.updateAppIcons(); } }); export const TilingAppSwitcher = GObject.registerClass( class TilingAppSwitcher extends SwitcherPopup.SwitcherList { _init(altTabPopup, windows) { // Don't make the SwitcherButtons squares since 1 SwitcherButton // may contain multiple AppIcons for a tileGroup. super._init(false); this.icons = []; this._arrows = []; this._apps = []; this._altTabPopup = altTabPopup; this._delayedHighlighted = -1; this._mouseTimeOutId = 0; const winTracker = Shell.WindowTracker.get_default(); let groupedWindows; // Group windows based on their tileGroup, if tileGroup.length > 1. // Otherwise group them based on their respective apps. if (Settings.getBoolean('tilegroups-in-app-switcher')) { groupedWindows = windows.reduce((allGroups, w) => { for (const group of allGroups) { if (w.isTiled && Twm.getTileGroupFor(w).length > 1) { if (Twm.getTileGroupFor(w).includes(group[0])) { group.push(w); return allGroups; } } else if ((!group[0].isTiled || group[0].isTiled && Twm.getTileGroupFor(group[0]).length <= 1) && winTracker.get_window_app(group[0]) === winTracker.get_window_app(w)) { group.push(w); return allGroups; } } const newGroup = [w]; allGroups.push(newGroup); return allGroups; }, []); // Group windows based on apps } else { groupedWindows = windows.reduce((allGroups, w) => { for (const group of allGroups) { if (winTracker.get_window_app(group[0]) === winTracker.get_window_app(w)) { group.push(w); return allGroups; } } const newGroup = [w]; allGroups.push(newGroup); return allGroups; }, []); } // Construct the AppIcons and add them to the popup. groupedWindows.forEach(group => { const item = new AppSwitcherItem(group); item.connect('all-icons-removed', () => this._removeIcon(item)); this._addIcon(item); }); // Listen for the app stop state in case the app got closed outside // of the app switcher along with closing via the app switcher const allApps = windows.map(w => winTracker.get_window_app(w)); this._apps = [...new Set(allApps)]; this._stateChangedIds = this._apps.map(app => app.connect('notify::state', () => { if (app.state !== Shell.AppState.RUNNING) this.icons.forEach(item => item.removeApp(app)); })); this.connect('destroy', this._onDestroy.bind(this)); } _onDestroy() { if (this._mouseTimeOutId !== 0) GLib.source_remove(this._mouseTimeOutId); this._stateChangedIds?.forEach((id, index) => this._apps[index].disconnect(id)); this._stateChangedIds = []; this._apps = []; } _setIconSize() { let j = 0; while (this._items.length > 1 && this._items[j].style_class !== 'item-box') j++; let themeNode = this._items[j].get_theme_node(); this._list.ensure_style(); let iconPadding = themeNode.get_horizontal_padding(); let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT); let [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1); let iconSpacing = labelNaturalHeight + iconPadding + iconBorder; let totalSpacing = this._list.spacing * (this._items.length - 1); // We just assume the whole screen here due to weirdness happening with the passed width let primary = Main.layoutManager.primaryMonitor; let parentPadding = this.get_parent().get_theme_node().get_horizontal_padding(); let availWidth = primary.width - parentPadding - this.get_theme_node().get_horizontal_padding(); let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let iconSizes = baseIconSizes.map(s => s * scaleFactor); let iconSize = baseIconSizes[0]; if (this._items.length > 1) { for (let i = 0; i < baseIconSizes.length; i++) { iconSize = baseIconSizes[i]; let height = iconSizes[i] + iconSpacing; let w = height * this._items.length + totalSpacing; if (w <= availWidth) break; } } this._iconSize = iconSize; for (let i = 0; i < this.icons.length; i++) { // eslint-disable-next-line eqeqeq if (this.icons[i].icon != null) break; this.icons[i].set_size(iconSize); } } vfunc_get_preferred_height(forWidth) { if (!this._iconSize) this._setIconSize(); return super.vfunc_get_preferred_height(forWidth); } vfunc_allocate(box) { // Allocate the main list items super.vfunc_allocate(box); let contentBox = this.get_theme_node().get_content_box(box); let arrowHeight = Math.floor(this.get_theme_node().get_padding(St.Side.BOTTOM) / 3); let arrowWidth = arrowHeight * 2; // Now allocate each arrow underneath its item let childBox = new Clutter.ActorBox(); for (let i = 0; i < this._items.length; i++) { let itemBox = this._items[i].allocation; childBox.x1 = contentBox.x1 + Math.floor(itemBox.x1 + (itemBox.x2 - itemBox.x1 - arrowWidth) / 2); childBox.x2 = childBox.x1 + arrowWidth; childBox.y1 = contentBox.y1 + itemBox.y2 + arrowHeight; childBox.y2 = childBox.y1 + arrowHeight; this._arrows[i].allocate(childBox); } } // We override SwitcherList's _onItemMotion method to delay // activation when the thumbnail list is open _onItemMotion(item) { if (item === this._items[this._highlighted] || item === this._items[this._delayedHighlighted]) return Clutter.EVENT_PROPAGATE; const index = this._items.indexOf(item); if (this._mouseTimeOutId !== 0) { GLib.source_remove(this._mouseTimeOutId); this._delayedHighlighted = -1; this._mouseTimeOutId = 0; } if (this._altTabPopup.thumbnailsVisible) { this._delayedHighlighted = index; this._mouseTimeOutId = GLib.timeout_add( GLib.PRIORITY_DEFAULT, APP_ICON_HOVER_TIMEOUT, () => { this._enterItem(index); this._delayedHighlighted = -1; this._mouseTimeOutId = 0; return GLib.SOURCE_REMOVE; }); GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem'); } else { this._itemEntered(index); } return Clutter.EVENT_PROPAGATE; } _enterItem(index) { let [x, y] = global.get_pointer(); let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); if (this._items[index].contains(pickedActor)) this._itemEntered(index); } // We override SwitcherList's highlight() method to also deal with // the AppSwitcher->ThumbnailSwitcher arrows. Apps with only 1 window // will hide their arrows by default, but show them when their // thumbnails are visible (ie, when the app icon is supposed to be // in justOutline mode). Apps with multiple windows will normally // show a dim arrow, but show a bright arrow when they are // highlighted. highlight(n, justOutline) { if (this.icons[this._highlighted]) { if (this.icons[this._highlighted].cachedWindows.length === 1) this._arrows[this._highlighted].hide(); else this._arrows[this._highlighted].remove_style_pseudo_class('highlighted'); } super.highlight(n, justOutline); if (this._highlighted !== -1) { if (justOutline && this.icons[this._highlighted].cachedWindows.length === 1) this._arrows[this._highlighted].show(); else this._arrows[this._highlighted].add_style_pseudo_class('highlighted'); } } _addIcon(appIcon) { this.icons.push(appIcon); let item = this.addItem(appIcon, appIcon.label); appIcon.app.connectObject('notify::state', app => { if (app.state !== Shell.AppState.RUNNING) this._removeIcon(app); }, this); let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' }); arrow.connect('repaint', () => SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM)); this.add_child(arrow); this._arrows.push(arrow); if (appIcon.cachedWindows.length === 1) arrow.hide(); else item.add_accessible_state(Atk.StateType.EXPANDABLE); } _removeIcon(item) { const index = this.icons.findIndex(i => i === item); if (index === -1) return; this._arrows[index].destroy(); this._arrows.splice(index, 1); this.icons.splice(index, 1); this.removeItem(index); } }); /** * Replace AltTab.AppIcon and insert this into the TilingAppSwitcher instead. * This may contain multiple AppIcons to represent a tileGroup with chain icons * between the AppIcons. */ const AppSwitcherItem = GObject.registerClass({ Signals: { 'all-icons-removed': {} } }, class AppSwitcherItem extends St.BoxLayout { _init(windows) { super._init({ vertical: false }); // A tiled window in a tileGroup of length 1, doesn't get a separate // AppSwitcherItem. It gets added to the non-tiled windows' AppSwitcherItem const tileGroup = windows[0].isTiled && Twm.getTileGroupFor(windows[0]); this.isTileGroup = tileGroup && tileGroup.every(w => windows.includes(w)) && tileGroup?.length > 1; this.cachedWindows = windows; this.appIcons = []; this.chainIcons = []; // Compatibility with AltTab.AppIcon this.set_size = size => this.appIcons.forEach(i => i.set_size(size)); this.label = null; this.app = { // Only raise the first window since we split up apps and tileGroups activate_window: (window, timestamp) => { Main.activateWindow(this.cachedWindows[0], timestamp); }, // Listening to the app-stop now happens in the custom _init func // So prevent signal connection. here.. careful in case signal // connection in the future is used for more... connectObject: () => {} }; this.updateAppIcons(); } // Re/Create the AppIcons based on the cached window list updateAppIcons() { this.appIcons.forEach(i => i.destroy()); this.appIcons = []; this.chainIcons.forEach(i => i.destroy()); this.chainIcons = []; const winTracker = Shell.WindowTracker.get_default(); const path = Extension.lookupByURL(import.meta.url) .dir.get_child('media/insert-link-symbolic.svg') .get_path(); const icon = new Gio.FileIcon({ file: Gio.File.new_for_path(path) }); const apps = this.isTileGroup // All apps (even duplicates) ? this.cachedWindows.map(w => winTracker.get_window_app(w)) // Only unique apps : this.cachedWindows.reduce((allApps, w) => { const a = winTracker.get_window_app(w); !allApps.includes(a) && allApps.push(a); return allApps; }, []); apps.forEach((app, idx) => { // AppIcon const appIcon = new AppIcon(app); this.add_child(appIcon); this.appIcons.push(appIcon); // Add chain to the right AppIcon except for the last AppIcon if (idx >= apps.length - 1) return; // Chain const chain = new St.Icon({ gicon: icon, icon_size: 18 }); this.add_child(chain); this.chainIcons.push(chain); }); if (!this.appIcons.length) { this.emit('all-icons-removed'); return; } this.label = this.appIcons[0].label; } // Remove an AppIcon to the corresponding app. // This doesn't update cached window list! removeApp(app) { for (let i = this.appIcons.length - 1; i >= 0; i--) { const appIcon = this.appIcons[i]; if (appIcon.app !== app) continue; this.appIcons.splice(i, 1); appIcon.destroy(); const chain = this.chainIcons.splice(Math.max(0, i - 1), 1)[0]; chain?.destroy(); } if (!this.appIcons.length) this.emit('all-icons-removed'); } }); const AppIcon = GObject.registerClass( class AppIcon extends BaseAppIcon { // Don't make the SwitcherButtons squares since 1 SwitcherButton // may contain multiple AppIcons for a tileGroup. vfunc_get_preferred_width() { return this.get_preferred_height(-1); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/focusHint.js000066400000000000000000000642011500466572600302760ustar00rootroot00000000000000import { Clutter, Gio, GLib, Meta, Shell, St } from '../dependencies/gi.js'; import { AppFavorites, Main, OsdWindow, SwitcherPopup } from '../dependencies/shell.js'; import * as AltTab from '../dependencies/unexported/altTab.js'; import { FocusHint, FocusHintOutlineStyle, Settings } from '../common.js'; export default class FocusHintManager { _hint = null; constructor(initialWindow) { // On a fresh install no color is set for the hint yet. Use the bg color // from the tile preview style by using a temporary widget. if (Settings.getString('focus-hint-color') === '') { const widget = new St.Widget({ style_class: 'tile-preview' }); global.stage.add_child(widget); const color = widget.get_theme_node().get_background_color(); const { red, green, blue } = color; Settings.setString('focus-hint-color', `rgb(${red},${green},${blue})`); widget.destroy(); } this._settingsChangedId = Settings.changed( 'focus-hint', () => this._setHint() ); this._setHint(); if (this._hint?.shouldIndicate(initialWindow)) this._hint.indicate(initialWindow); } destroy() { Settings.disconnect(this._settingsChangedId); this._hint?.destroy(); this._hint = null; } _setHint() { this._hint?.destroy(); switch (Settings.getInt('focus-hint')) { case FocusHint.ANIMATED_OUTLINE: this._hint = new AnimatedOutlineHint(); break; case FocusHint.ANIMATED_UPSCALE: this._hint = new AnimatedUpscaleHint(); break; case FocusHint.STATIC_OUTLINE: this._hint = new StaticOutlineHint(); break; default: this._hint = null; } } }; class Hint { _actors = []; constructor() { this._addIdleWatcher(); this._overrideSwitchToApplication(); this._overrideSwitcherPopupFinish(); this._overrideWorkspaceAnimationSwitch(); this._indicateOnWindowClose(); } destroy() { if (this._workspaceSwitchTimer) { GLib.Source.remove(this._workspaceSwitchTimer); this._workspaceSwitchTimer = 0; } this.resetAnimation(); this._stopIndicatingOnWindowClose(); this._restoreSwitcherPopupFinish(); this._restoreSwitchToApplication(); this._restoreWorkspaceAnimationSwitch(); this._removeIdleWatcher(); } /** @param {Meta.Window} focus */ // eslint-disable-next-line no-unused-vars indicate(focus) { throw new Error('`indicate` not implemented by Hint subclass!'); } resetAnimation() { this._actors.forEach(actor => actor.destroy()); this._actors = []; } _addIdleWatcher() { const idleMonitor = global.backend.get_core_idle_monitor(); const idleTime = 120 * 1000; this._activeWatchId && idleMonitor.remove_watch(this._activeWatchId); this._activeWatchId = 0; this._idleWatchId && idleMonitor.remove_watch(this._idleWatchId); this._idleWatchId = idleMonitor.add_idle_watch(idleTime, () => { this._activeWatchId = idleMonitor.add_user_active_watch(() => { this._activeWatchId = 0; const focus = global.display.focus_window; if (this.shouldIndicate(focus)) this.indicate(focus); }); }); } _allowedWindowType(type) { return [ Meta.WindowType.NORMAL, Meta.WindowType.DIALOG, Meta.WindowType.MODAL_DIALOG ].includes(type); } _indicateOnWindowClose() { global.display.connectObject( 'window-created', (_, metaWindow) => this._onWindowCreated(metaWindow), this ); global .get_window_actors() .forEach(actor => this._onWindowCreated(actor.get_meta_window())); } _onWindowCreated(window) { if (!this._allowedWindowType(window.get_window_type())) return; window.connectObject( 'unmanaged', () => { window.disconnectObject(this); const focus = global.display.focus_window; if (focus && this.shouldIndicate(focus)) this.indicate(focus); else this.resetAnimation(); }, this ); } _overrideSwitcherPopupFinish() { this._originalSwitcherPopupFinish = SwitcherPopup.SwitcherPopup.prototype._finish; const that = this; SwitcherPopup.SwitcherPopup.prototype._finish = function (timestamp) { that._originalSwitcherPopupFinish.call(this, timestamp); const newFocus = global.display.focus_window; if (that.shouldIndicate(newFocus)) { if (that._workspaceSwitchTimer) { GLib.Source.remove(that._workspaceSwitchTimer); that._workspaceSwitchTimer = 0; } that.indicate(newFocus); } else { that.resetAnimation(); } }; } _overrideSwitchToApplication() { for (let i = 1; i < 10; i++) { const key = `switch-to-application-${i}`; if (global.display.remove_keybinding(key)) { const handler = (_, __, ___, keybinding) => { if (!Main.sessionMode.hasOverview) return; const [, , , target] = keybinding.get_name().split('-'); const apps = AppFavorites.getAppFavorites().getFavorites(); const app = apps[target - 1]; if (app) { const [newFocus] = app.get_windows(); Main.overview.hide(); app.activate(); if (this.shouldIndicate(newFocus)) { if (this._workspaceSwitchTimer) { GLib.Source.remove(this._workspaceSwitchTimer); this._workspaceSwitchTimer = 0; } this.indicate(newFocus); } else { this.resetAnimation(); } } }; global.display.add_keybinding( key, new Gio.Settings({ schema_id: 'org.gnome.shell.keybindings' }), Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, handler ); } } } _overrideWorkspaceAnimationSwitch() { this._originalWorkspaceAnimationSwitch = Main.wm._workspaceAnimation.animateSwitch; const that = this; Main.wm._workspaceAnimation.animateSwitch = function ( from, to, direction, onComplete ) { that._originalWorkspaceAnimationSwitch.call( this, from, to, direction, onComplete ); // This is set if the focused window moved to the new workspace // along with the workspace switch animation. E. g. when using // Shift + Super + Alt + Arrow_Keys. if (this.movingWindow) return; // There are 2 different 'focus behaviors' during a workspace // animation. 1: When the workspace switch is initiated by an app or // by a window activation/focus (e. g. App Switcher). In this case // global.display.focus_window gives the correct window for the // focus hint. 2: When just switching workspaces (e. g. Super + Alt // + Arrow Key), here the focus switches *after* the animation. So // delay this code and let it be interrupted by the switcher popup // or the switch-to-application focus hint. that._workspaceSwitchTimer = GLib.timeout_add( GLib.PRIORITY_DEFAULT, 0, () => { that._workspaceSwitchTimer = 0; const newWorkspace = global.workspace_manager.get_workspace_by_index(to); const [newFocus] = AltTab.getWindows(newWorkspace); if (that.shouldIndicate(newFocus)) that.indicate(newFocus); else that.resetAnimation(); } ); }; } shouldIndicate(window) { if (!window || !window.get_compositor_private()) return false; if (!this._allowedWindowType(window.get_window_type())) return false; if ( window.is_fullscreen() || window.get_maximized() === Meta.MaximizeFlags.BOTH ) return false; return true; } _removeIdleWatcher() { const idleMonitor = global.backend.get_core_idle_monitor(); this._activeWatchId && idleMonitor.remove_watch(this._activeWatchId); this._activeWatchId = 0; this._idleWatchId && idleMonitor.remove_watch(this._idleWatchId); this._idleWatchId = 0; } _restoreSwitcherPopupFinish() { SwitcherPopup.SwitcherPopup.prototype._finish = this._originalSwitcherPopupFinish; this._originalSwitcherPopupFinish = null; } _restoreSwitchToApplication() { for (let i = 1; i < 10; i++) { const key = `switch-to-application-${i}`; if (global.display.remove_keybinding(key)) { Main.wm.addKeybinding( key, new Gio.Settings({ schema_id: 'org.gnome.shell.keybindings' }), Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, Main.wm._switchToApplication.bind(Main.wm) ); } } } _restoreWorkspaceAnimationSwitch() { Main.wm._workspaceAnimation.animateSwitch = this._originalWorkspaceAnimationSwitch; this._originalWorkspaceAnimationSwitch = null; } _stopIndicatingOnWindowClose() { global.display.disconnectObject(this); global.get_window_actors().forEach(actor => { actor.get_meta_window().disconnectObject(this); }); } } class AnimatedOutlineHint extends Hint { _color = ''; _outlineSize = 0; _outlineBorderRadius = 0; _outlineStyle = 0; constructor() { super(); this._color = Settings.getString('focus-hint-color'); this._colorChangeId = Settings.changed('focus-hint-color', () => { this._color = Settings.getString('focus-hint-color'); }); this._outlineSize = Settings.getInt('focus-hint-outline-size'); this._outlineSizeChangeId = Settings.changed('focus-hint-outline-size', () => { this._outlineSize = Settings.getInt('focus-hint-outline-size'); }); this._outlineBorderRadius = Settings.getInt('focus-hint-outline-border-radius'); this._outlineBorderRadiusChangeId = Settings.changed('focus-hint-outline-border-radius', () => { this._outlineBorderRadius = Settings.getInt('focus-hint-outline-border-radius'); }); this._outlineStyle = Settings.getInt('focus-hint-outline-style'); this._outlineStyleChangeId = Settings.changed('focus-hint-outline-style', () => { this._outlineStyle = Settings.getInt('focus-hint-outline-style'); }); } destroy() { Settings.disconnect(this._colorChangeId); Settings.disconnect(this._outlineSizeChangeId); Settings.disconnect(this._outlineBorderRadiusChangeId); Settings.disconnect(this._outlineStyleChangeId); super.destroy(); } indicate(window, workspaceSwitchAnimationDuration = 250) { this.resetAnimation(); if (!this.shouldIndicate(window)) return; const windowActor = window.get_compositor_private(); const workspaceAnimationWindowClone = findWindowCloneForWorkspaceAnimation( windowActor, !!Main.wm._workspaceAnimation._switchData ); const [monitorContainer, workspaceContainer] = createContainers( window, workspaceAnimationWindowClone, workspaceSwitchAnimationDuration ); this._actors.push(monitorContainer); const customClone = createWindowClone( windowActor, monitorContainer ); const outline = this._createOutline(window, monitorContainer); const { x: windowFrameX, y: windowFrameY, width: windowFrameWidth, height: windowFrameHeight } = window.get_frame_rect(); workspaceContainer.add_child(outline); workspaceContainer.add_child(customClone); workspaceAnimationWindowClone?.hide(); outline.ease({ x: windowFrameX - monitorContainer.x - this._outlineSize, y: windowFrameY - monitorContainer.y - this._outlineSize, width: windowFrameWidth + 2 * this._outlineSize, height: windowFrameHeight + 2 * this._outlineSize, delay: workspaceAnimationWindowClone ? (175 / 250) * workspaceSwitchAnimationDuration : 0, duration: 150, mode: Clutter.AnimationMode.EASE_OUT_BACK, onComplete: () => { outline.ease({ x: windowFrameX - monitorContainer.x, y: windowFrameY - monitorContainer.y, width: windowFrameWidth, height: windowFrameHeight, duration: 100, mode: Clutter.AnimationMode.EASE_IN, onComplete: () => this.resetAnimation() }); } }); } _createOutline(window, monitorContainer) { const { x, y, width, height } = window.get_frame_rect(); const outline = new St.Widget({ style: this._getCssStyle(), x: x - monitorContainer.x, y: y - monitorContainer.y, width, height }); return outline; } _getCssStyle() { const backgroundColor = this._outlineStyle === FocusHintOutlineStyle.SOLID_BG ? `background-color: ${this._color};` : ''; return ` ${backgroundColor} border: ${this._outlineSize}px solid ${this._color}; border-radius: ${this._outlineBorderRadius}px; `; } } class AnimatedUpscaleHint extends Hint { _scaleAmount = 10; indicate(window, workspaceSwitchAnimationDuration = 250) { this.resetAnimation(); if (!this.shouldIndicate(window)) return; const windowActor = window.get_compositor_private(); const workspaceAnimationWindowClone = findWindowCloneForWorkspaceAnimation( windowActor, !!Main.wm._workspaceAnimation._switchData ); const [monitorContainer, workspaceContainer] = createContainers( window, workspaceAnimationWindowClone, workspaceSwitchAnimationDuration ); this._actors.push(monitorContainer); const customClone = createWindowClone( windowActor, monitorContainer ); const { x, y, width, height } = customClone; workspaceContainer.add_child(customClone); workspaceAnimationWindowClone?.hide(); windowActor.set_opacity(0); // Hide to prevent double shadows. customClone.ease({ x: x - this._scaleAmount, y: y - this._scaleAmount, width: width + 2 * this._scaleAmount, height: height + 2 * this._scaleAmount, delay: workspaceAnimationWindowClone ? (175 / 250) * workspaceSwitchAnimationDuration : 0, duration: 100, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => { customClone.ease({ x, y, width, height, duration: 150, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => this.resetAnimation() }); } }); } resetAnimation() { global.get_window_actors().forEach(a => a.set_opacity(255)); super.resetAnimation(); } } class StaticOutlineHint extends AnimatedOutlineHint { _outline = null; _window = null; constructor() { super(); this._outline = new St.Widget({ style: this._getCssStyle() }); global.window_group.add_child(this._outline); // Originally, only `notify::focus-window` was used but that had issues // with popups on Wayland. `restacked` by itself seems to be kinda // spotty on Wayland for the first window that is opened on a workspace. global.display.connectObject( 'restacked', () => this._updateOutline(), 'notify::focus-window', () => this._updateOutline(), this ); this._updateOutline(); Settings.getGioObject().connectObject( 'changed::focus-hint-color', () => this._updateOutline(), 'changed::focus-hint-outline-size', () => this._updateOutline(), 'changed::focus-hint-outline-border-radius', () => this._updateOutline(), 'changed::focus-hint-outline-style', () => this._updateOutline(), this ); } destroy() { Settings.getGioObject().disconnectObject(this); this._cancelGeometryUpdate(); this._outline.destroy(); this._outline = null; this._window?.disconnectObject(this); this._window = null; global.display.disconnectObject(this); GLib.Source.remove(this._resetTimer); super.destroy(); } /** * This is really only used for the indication when changing workspaces... * * @param {Meta.Window} window - * @param {number} workspaceSwitchAnimationDuration - */ indicate(window, workspaceSwitchAnimationDuration = 250) { this.resetAnimation(); if (!this.shouldIndicate(window)) return; const animatingWorkspaceSwitch = !!Main.wm._workspaceAnimation._switchData; // Only need to use an animation to indicate the focus when switching // workspaces. In the other cases, there is the static `this._outline`. if (!animatingWorkspaceSwitch) return; const windowActor = window.get_compositor_private(); const workspaceAnimationWindowClone = findWindowCloneForWorkspaceAnimation( windowActor, animatingWorkspaceSwitch ); const [monitorContainer, workspaceContainer] = createContainers( window, workspaceAnimationWindowClone, workspaceSwitchAnimationDuration ); this._actors.push(monitorContainer); const customClone = createWindowClone( windowActor, monitorContainer ); const outline = this._createOutline(window, monitorContainer); workspaceContainer.add_child(outline); workspaceContainer.add_child(customClone); workspaceAnimationWindowClone?.hide(); this._resetTimer = GLib.timeout_add( GLib.PRIORITY_DEFAULT, workspaceSwitchAnimationDuration, () => { this.resetAnimation(); this._resetTimer = 0; } ); } _cancelGeometryUpdate() { if (this._laterID) { global.compositor.get_laters().remove(this._laterID); this._laterID = 0; } } _queueGeometryUpdate() { const windowActor = this._window.get_compositor_private(); if (!windowActor) return; this._laterID = global.compositor .get_laters() .add(Meta.LaterType.BEFORE_REDRAW, () => { this._updateGeometry(); this._outline.set_style(this._getCssStyle()); this._outline.show(); global.window_group.set_child_below_sibling( this._outline, windowActor ); this._laterID = 0; return GLib.SOURCE_REMOVE; }); } _updateOutline() { this._cancelGeometryUpdate(); this._window?.disconnectObject(this); const window = global.display.focus_window; if (!window || !this._allowedWindowType(window.get_window_type())) { this._outline.hide(); return; } this._window = window; this._window.connectObject( 'position-changed', () => this._updateGeometry(), 'size-changed', () => this._updateGeometry(), this ); if ( this._window.is_fullscreen() || this._window.get_maximized() === Meta.MaximizeFlags.BOTH ) this._outline.hide(); else this._queueGeometryUpdate(); } _updateGeometry() { const { x, y, width, height } = this._window.get_frame_rect(); this._outline.set({ x: x - this._outlineSize, y: y - this._outlineSize, width: width + this._outlineSize * 2, height: height + this._outlineSize * 2 }); } } /** * Gets the absolute position of a Clutter.AcotActor. * `Clutter.Actor.get_transformed_position` doesn't work as I expected it * * @param {Clutter.Actor} actor * * @returns {{x: number, y: number}} */ function getAbsPos(actor) { const pos = { x: actor.x, y: actor.y }; let parent = actor.get_parent(); while (parent) { pos.x += parent.x; pos.y += parent.y; parent = parent.get_parent(); } return pos; } /** * Creates containers to put clones of the monitor/workspace into to create a * workspaceSwitch with the focus hint * * @param {Meta.Window} window * @param {Clutter.Clone} workspaceAnimationWindowClone * @param {number} workspaceSwitchAnimationDuration * * @returns {[Clutter.Actor, Clutter.Actor]} a monitor and a workspace containers * for Clutter.Clones that are laid over the actual actors */ function createContainers( window, workspaceAnimationWindowClone, workspaceSwitchAnimationDuration ) { const monitorNr = window.get_monitor(); const monitorRect = global.display.get_monitor_geometry(monitorNr); let startingPos; if (workspaceAnimationWindowClone) { const actorAbsPos = getAbsPos(window.get_compositor_private()); const cloneAbsPos = getAbsPos(workspaceAnimationWindowClone); startingPos = { x: monitorRect.x + cloneAbsPos.x - actorAbsPos.x, y: monitorRect.y + cloneAbsPos.y - actorAbsPos.y }; } else { startingPos = { x: 0, y: 0 }; } const monitorContainer = new Clutter.Actor({ clip_to_allocation: true, x: monitorRect.x, y: monitorRect.y, width: monitorRect.width, height: monitorRect.height }); // Allow tiled window to be animate above the panel. Also, When changing // workspaces we want to put everything above the animating clones. if (workspaceAnimationWindowClone) { const osdWindow = Main.uiGroup .get_children() .find(child => child instanceof OsdWindow.OsdWindow); if (osdWindow) Main.uiGroup.insert_child_below(monitorContainer, osdWindow); else Main.uiGroup.add_child(monitorContainer); } else { global.window_group.add_child(monitorContainer); } const workspaceContainer = new Clutter.Actor({ x: startingPos.x, y: startingPos.y, width: monitorContainer.width, height: monitorContainer.height }); monitorContainer.add_child(workspaceContainer); workspaceContainer.ease({ x: 0, y: 0, duration: workspaceSwitchAnimationDuration, mode: Clutter.AnimationMode.EASE_OUT_CUBIC }); return [monitorContainer, workspaceContainer]; } /** * Creates a clone of a window actor for the custom workspaceSwitch animation * with the focus hint * * @param {Meta.WindowActor} windowActor * @param {Clutter.Actor} container * * @returns {Clutter.Clone} */ function createWindowClone(windowActor, container) { const { x, y } = getAbsPos(windowActor); const windowClone = new Clutter.Clone({ source: windowActor, x: x - container.x, y: y - container.y, width: windowActor.width, height: windowActor.height }); return windowClone; } /** * Finds the window clone of a window during the native workspaceSwitch animation * * @param {Meta.WindowActor} windowActor * @param {boolean} animatingWorkspaceSwitch * * @returns {Clutter.Clone|null} the clone. It may be `null` if the focus is on * the secondary monitor with 'WS only on primary display' */ function findWindowCloneForWorkspaceAnimation( windowActor, animatingWorkspaceSwitch ) { if (!animatingWorkspaceSwitch) return null; const switchData = Main.wm._workspaceAnimation._switchData; let clone = null; switchData.monitors.find(monitorGroup => { return monitorGroup._workspaceGroups.find(workspaceGroup => { return workspaceGroup._windowRecords.find(record => { const foundClone = record.windowActor === windowActor; if (foundClone) ({ clone } = record); return foundClone; }); }); }); return clone; } Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js000066400000000000000000000563661500466572600317720ustar00rootroot00000000000000import { Clutter, Meta, Shell, St } from '../dependencies/gi.js'; import { _, Main } from '../dependencies/shell.js'; import { Direction, DynamicKeybindings, Settings, Shortcuts } from '../common.js'; import { Rect, Util } from './utility.js'; import { TilingWindowManager as Twm } from './tilingWindowManager.js'; /** * Class to handle the keyboard shortcuts (on the extension side) except the * ones related to the Layouts. For those, see layoutsManager.js. */ export default class TilingKeybindingHandler { constructor() { const allowInOverview = ['toggle-tiling-popup']; this._keyBindings = Shortcuts.getAllKeys(); this._keyBindings.forEach(key => { Main.wm.addKeybinding( key, Settings.getGioObject(), Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, Shell.ActionMode.NORMAL | (allowInOverview.includes(key) && Shell.ActionMode.OVERVIEW), this._onCustomKeybindingPressed.bind(this, key) ); }); } destroy() { this._keyBindings.forEach(key => Main.wm.removeKeybinding(key)); this._debuggingIndicators?.forEach(i => i.destroy()); } /** * @param {string} shortcutName */ async _onCustomKeybindingPressed(shortcutName) { // Debugging const debugging = ['debugging-show-tiled-rects', 'debugging-free-rects']; if (debugging.includes(shortcutName)) { if (this._debuggingIndicators) { this._debuggingIndicators.forEach(i => i.destroy()); this._debuggingIndicators = null; } else { const createIndicators = shortcutName === 'debugging-show-tiled-rects' ? Util.___debugShowTiledRects : Util.___debugShowFreeScreenRects; this._debuggingIndicators = await createIndicators.call(Util); } return; // Toggle the Tiling Popup } else if (shortcutName === 'toggle-tiling-popup') { const toggleTo = !Settings.getBoolean('enable-tiling-popup'); Settings.setBoolean('enable-tiling-popup', toggleTo); Main.notify('Tiling Assistant', toggleTo // Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut ? _('Tiling popup enabled') // Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut : _('Tiling popup was disabled')); return; } const window = global.display.focus_window; if (!window) return; // Auto-tile: tile to empty space. If there's none: untile, // if it's already tiled else maximize if (shortcutName === 'auto-tile') { if (Twm.isMaximized(window)) { Twm.untile(window); } else { const topTileGroup = Twm.getTopTileGroup({ skipTopWindow: !window.isTiled }); const tRects = topTileGroup.map(w => w.tiledRect); const tileRect = Twm.getBestFreeRect(tRects, { currRect: window.tiledRect }); Twm.toggleTiling(window, tileRect); } // Tile Editing Mode } else if (shortcutName === 'tile-edit-mode') { const TileEditingMode = await import('./tileEditingMode.js'); const tileEditor = new TileEditingMode.TileEditor(); tileEditor.open(); // Toggle always-on-top } else if (shortcutName === 'toggle-always-on-top') { window.is_above() ? window.unmake_above() : window.make_above(); // Toggle maximization vertically } else if (shortcutName === 'tile-maximize-vertically') { const workArea = new Rect(window.get_work_area_current_monitor()); const currRect = window.tiledRect ?? window.get_frame_rect(); // Is tiled or maximized with this extension if (window.untiledRect && currRect.height === workArea.height) { // Is maximized if (currRect.width === workArea.width) { const tileRect = new Rect(workArea.x, window.untiledRect.y, workArea.width, window.untiledRect.height); Twm.tile(window, tileRect); // Is tiled } else { Twm.untile(window); } // is tiled normally } else if (window.untiledRect) { const tileRect = new Rect(currRect.x, workArea.y, currRect.width, workArea.height); Twm.tile(window, tileRect); // is floating } else { const width = Math.min( currRect.width + Settings.getInt('window-gap'), workArea.width ); const constrainX = Math.max( currRect.x - Settings.getInt('window-gap') / 2, workArea.x ); const finalX = Math.min(constrainX, workArea.x2 - width); const tileRect = new Rect(finalX, workArea.y, width, workArea.height); Twm.tile(window, tileRect); } // Toggle maximization horizontally } else if (shortcutName === 'tile-maximize-horizontally') { const workArea = new Rect(window.get_work_area_current_monitor()); const currRect = window.tiledRect ?? window.get_frame_rect(); // Is tiled or maximized with this extension if (window.untiledRect && currRect.width === workArea.width) { // Is maximized if (currRect.height === workArea.height) { const tileRect = new Rect(window.untiledRect.x, workArea.y, window.untiledRect.width, workArea.height); Twm.tile(window, tileRect); // Is tiled } else { Twm.untile(window); } // is tiled normally } else if (window.untiledRect) { const tileRect = new Rect(workArea.x, currRect.y, workArea.width, currRect.height); Twm.tile(window, tileRect); // is floating } else { const height = Math.min( currRect.height + Settings.getInt('window-gap'), workArea.height ); const constrainY = Math.max( currRect.y - Settings.getInt('window-gap') / 2, workArea.y ); const finalY = Math.min(constrainY, workArea.y2 - height); const tileRect = new Rect(workArea.x, finalY, workArea.width, height); Twm.tile(window, tileRect); } // Restore window size } else if (shortcutName === 'restore-window') { if (window.untiledRect) // Tiled & maximized with gaps Twm.untile(window, { clampToWorkspace: true }); else if (window.get_maximized()) window.unmaximize(window.get_maximized()); // Center window } else if (shortcutName === 'center-window') { const workArea = new Rect(window.get_work_area_current_monitor()); if (window.isTiled) { const currRect = window.tiledRect; const tileRect = new Rect( workArea.center.x - Math.floor(currRect.width / 2), workArea.center.y - Math.floor(currRect.height / 2), currRect.width, currRect.height ); if (tileRect.equal(currRect)) return; Twm.tile(window, tileRect, { openTilingPopup: false }); } else if (!Twm.isMaximized(window)) { if (!window.allows_move()) return; const currRect = window.get_frame_rect(); const x = workArea.center.x - Math.floor(currRect.width / 2); const y = workArea.center.y - Math.floor(currRect.height / 2); if (x === currRect.x && y === currRect.y) return; const wActor = window.get_compositor_private(); wActor && Main.wm._prepareAnimationInfo( global.window_manager, wActor, currRect, Meta.SizeChange.UNMAXIMIZE ); window.move_frame(false, x, y); } // Tile a window but ignore T-A features } else if (['tile-top-half-ignore-ta', 'tile-bottom-half-ignore-ta', 'tile-left-half-ignore-ta', 'tile-right-half-ignore-ta', 'tile-topleft-quarter-ignore-ta', 'tile-topright-quarter-ignore-ta', 'tile-bottomleft-quarter-ignore-ta', 'tile-bottomright-quarter-ignore-ta'].includes(shortcutName) ) { const workArea = new Rect(window.get_work_area_current_monitor()); const rect = Twm.getDefaultTileFor(shortcutName, workArea); Twm.toggleTiling(window, rect, { ignoreTA: true }); // Tile a window } else { const dynamicSetting = Settings.getInt('dynamic-keybinding-behavior'); const windowsStyle = DynamicKeybindings.TILING_STATE_WINDOWS; const isWindowsStyle = dynamicSetting === windowsStyle; const workArea = new Rect(window.get_work_area_current_monitor()); const rect = Twm.getTileFor(shortcutName, workArea, window.get_monitor()); switch (dynamicSetting) { case DynamicKeybindings.FOCUS: this._dynamicFocus(window, shortcutName); break; case DynamicKeybindings.TILING_STATE: case DynamicKeybindings.TILING_STATE_WINDOWS: this._dynamicTilingState(window, shortcutName, isWindowsStyle); break; case DynamicKeybindings.FAVORITE_LAYOUT: this._dynamicFavoriteLayout(window, shortcutName); break; default: Twm.toggleTiling(window, rect); } } } /** * Tiles or moves the focus depending on the `windows` tiling state. * * @param {Meta.Window} window a Meta.Window as the starting position. * @param {string} shortcutName indicates the direction we tile or move * the focus to. */ _dynamicFocus(window, shortcutName) { const topTileGroup = Twm.getTopTileGroup({ skipTopWindow: true }); const workArea = new Rect(window.get_work_area_current_monitor()); // Toggle tile state of the window, if it isn't tiled // or if it is the only window which is. if (!window.isTiled || topTileGroup.length === 1) { const rect = Twm.getTileFor(shortcutName, workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; } let direction; switch (shortcutName) { case 'tile-maximize': case 'tile-top-half': direction = Direction.N; break; case 'tile-bottom-half': direction = Direction.S; break; case 'tile-left-half': direction = Direction.W; break; case 'tile-right-half': direction = Direction.E; } const nearestWindow = Twm.getNearestWindow( window, topTileGroup, direction, false ); if (!nearestWindow) { const rect = Twm.getTileFor(shortcutName, workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; } // Activate() caused problems with an extensions' prefs window, if the // extensions-app wasn't open. nearestWindow.focus(global.get_current_time()); // Animation for visibility with a tmp 'tile preview' const fromRect = window.get_frame_rect(); const focusIndicator = new St.Widget({ style_class: 'tile-preview', opacity: 0, x: fromRect.x, y: fromRect.y, width: fromRect.width, height: fromRect.height }); Main.uiGroup.add_child(focusIndicator); const toRect = nearestWindow.get_frame_rect(); focusIndicator.ease({ opacity: 255, x: toRect.x, y: toRect.y, width: toRect.width, height: toRect.height, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUART, onComplete: () => { focusIndicator.ease({ opacity: 0, duration: 200, mode: Clutter.AnimationMode.EASE_IN_OUT_CIRC, delay: 100, onComplete: () => focusIndicator.destroy() }); } }); } /** * Changes the tiling state of the `window` based on its current tiling * state and the activated shortcut. * * @param {Meta.Window} window a Meta.Window. * @param {string} shortcutName the shortcut. * @param {boolean} isWindowsStyle minimize when the `window` isn't tiled or * if it's tiled to the bottom and the 'tile to bottom' shortcut is * activated. */ _dynamicTilingState(window, shortcutName, isWindowsStyle) { const workArea = new Rect(window.get_work_area_current_monitor()); if (Twm.isMaximized(window)) { switch (shortcutName) { case 'tile-maximize': case 'tile-top-half': { const rect = Twm.getTileFor('tile-top-half', workArea, window.get_monitor()); Twm.tile(window, rect, { skipAnim: true }); break; } case 'tile-bottom-half': { Twm.untile(window); break; } default: { const rect = Twm.getTileFor(shortcutName, workArea, window.get_monitor()); Twm.toggleTiling(window, rect); } } return; } else if (!window.isTiled) { switch (shortcutName) { case 'tile-bottom-half': { if (isWindowsStyle) { window.minimize(); break; } // falls through } default: { const rect = Twm.getTileFor(shortcutName, workArea, window.get_monitor()); Twm.toggleTiling(window, rect); } } return; } const wRect = window.tiledRect; const isLeftHalf = wRect.x === workArea.x && wRect.y === workArea.y && wRect.width !== workArea.width && wRect.height === workArea.height; const isRightHalf = wRect.x !== workArea.x && wRect.y === workArea.y && wRect.x2 === workArea.x2 && wRect.height === workArea.height; const isTopHalf = wRect.x === workArea.x && wRect.y === workArea.y && wRect.width === workArea.width && wRect.height !== workArea.height; const isBottomHalf = wRect.x === workArea.x && wRect.y !== workArea.y && wRect.width === workArea.width && wRect.y2 === workArea.y2; const isTopLeftQuarter = wRect.x === workArea.x && wRect.y === workArea.y && wRect.width !== workArea.width && wRect.height !== workArea.height; const isTopRightQuarter = wRect.x !== workArea.x && wRect.y === workArea.y && wRect.x2 === workArea.x2 && wRect.height !== workArea.height; const isBottomLeftQuarter = wRect.x === workArea.x && wRect.y !== workArea.y && wRect.width !== workArea.width && wRect.y2 === workArea.y2; const isBottomRightQuarter = wRect.x !== workArea.x && wRect.y !== workArea.y && wRect.x2 === workArea.x2 && wRect.y2 === workArea.y2; let rect; if (isLeftHalf) { switch (shortcutName) { case 'tile-top-half': case 'tile-maximize': rect = Twm.getTileFor('tile-topleft-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-bottom-half': rect = Twm.getTileFor('tile-bottomleft-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-right-half': Twm.untile(window); return; } } else if (isRightHalf) { switch (shortcutName) { case 'tile-top-half': case 'tile-maximize': rect = Twm.getTileFor('tile-topright-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-bottom-half': rect = Twm.getTileFor('tile-bottomright-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-left-half': Twm.untile(window); return; } } else if (isTopHalf) { switch (shortcutName) { case 'tile-top-half': rect = Twm.getTileFor('tile-maximize', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-left-half': rect = Twm.getTileFor('tile-topleft-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-right-half': rect = Twm.getTileFor('tile-topright-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-bottom-half': Twm.untile(window); return; } } else if (isBottomHalf) { switch (shortcutName) { case 'tile-left-half': rect = Twm.getTileFor('tile-bottomleft-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-right-half': rect = Twm.getTileFor('tile-bottomright-quarter', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-top-half': case 'tile-maximize': Twm.untile(window); return; case 'tile-bottom-half': rect = Twm.getTileFor('tile-bottom-half', workArea, window.get_monitor()); isWindowsStyle ? window.minimize() : Twm.toggleTiling(window, rect); return; } } else if (isTopLeftQuarter) { switch (shortcutName) { case 'tile-right-half': rect = Twm.getTileFor('tile-top-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-bottom-half': rect = Twm.getTileFor('tile-left-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; } } else if (isTopRightQuarter) { switch (shortcutName) { case 'tile-left-half': rect = Twm.getTileFor('tile-top-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-bottom-half': rect = Twm.getTileFor('tile-right-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; } } else if (isBottomLeftQuarter) { switch (shortcutName) { case 'tile-top-half': case 'tile-maximize': rect = Twm.getTileFor('tile-left-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-right-half': rect = Twm.getTileFor('tile-bottom-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-bottom-half': rect = Twm.getTileFor('tile-bottom-half', workArea, window.get_monitor()); isWindowsStyle ? window.minimize() : Twm.toggleTiling(window, rect); return; } } else if (isBottomRightQuarter) { switch (shortcutName) { case 'tile-top-half': case 'tile-maximize': rect = Twm.getTileFor('tile-right-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-left-half': rect = Twm.getTileFor('tile-bottom-half', workArea, window.get_monitor()); Twm.toggleTiling(window, rect); return; case 'tile-bottom-half': rect = Twm.getTileFor('tile-bottom-half', workArea, window.get_monitor()); isWindowsStyle ? window.minimize() : Twm.toggleTiling(window, rect); return; } } Twm.toggleTiling(window, Twm.getTileFor(shortcutName, workArea, window.get_monitor())); } _dynamicFavoriteLayout(window, shortcutName) { const workArea = new Rect(window.get_work_area_current_monitor()); const toggleTiling = () => { const rect = Twm.getTileFor(shortcutName, workArea, window.get_monitor()); Twm.toggleTiling(window, rect); }; if (!window.isTiled) { toggleTiling(); return; } const favoriteLayout = Util.getFavoriteLayout(window.get_monitor()); if (favoriteLayout.length <= 1) { toggleTiling(); return; } let direction; switch (shortcutName) { case 'tile-top-half': case 'tile-maximize': direction = Direction.N; break; case 'tile-bottom-half': direction = Direction.S; break; case 'tile-left-half': direction = Direction.W; break; case 'tile-right-half': direction = Direction.E; } if (direction) { const neighbor = window.tiledRect.getNeighbor(direction, favoriteLayout); Twm.tile(window, neighbor, { openTilingPopup: false }); } else { toggleTiling(); } } } Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/layoutsManager.js000066400000000000000000000516031500466572600313310ustar00rootroot00000000000000import { Clutter, Gio, GObject, Meta, Shell, St } from '../dependencies/gi.js'; import { _, Extension, Main, PanelMenu, PopupMenu } from '../dependencies/shell.js'; import { Layout, Settings } from '../common.js'; import { Rect, Util } from './utility.js'; import { TilingWindowManager as Twm } from './tilingWindowManager.js'; /** * Here are the classes to handle PopupLayouts on the shell / extension side. * See src/prefs/layoutsPrefs.js for more details and general info about layouts. * In summary, a Layout is an array of LayoutItems. A LayoutItem is a JS Object * and has a rect, an appId and a loopType. Only the rect is mandatory. AppId may * be null or a String. Same for the LoopType. If a layout is activated, we will * loop / step through each LayoutItem and spawn a Tiling Popup one after the * other for the rects and offer to tile a window to that rect. If an appId is * defined, instead of calling the Tiling Popup, we tile (a new Instance of) * the app to the rect. If a LoopType is defined, instead of going to the next * item / rect, we spawn a Tiling Popup on the same item / rect and all the * tiled windows will share that spot evenly (a la 'Master and Stack'). * * Additionally, there the user can select a 'favorite' layout among the * PopupLayouts. That layout will then be used as an fixed alternative mode to * the Edge Tiling. */ export default class TilingLayoutsManager { constructor() { // this._items is an array of LayoutItems (see explanation above). // this._currItem is 1 LayoutItem. A LayoutItem's rect only hold ratios // from 0 - 1. this._currRect is a Rect scaled to the workArea. this._items = []; this._currItem = null; this._currRect = null; // Preview to show where the window will tile to, similar // to the tile preview when dnding to the screen edges this._rectPreview = null; // Keep track of the windows which were already tiled with the current // layout and the remaining windows. Special-case windows, which were tiled // within a loop since they need to be re-adjusted for each new window // tiled to the same spot. The looped array is cleared after each 'step' / // LayoutItem change. this._tiledWithLayout = []; this._tiledWithLoop = []; this._remainingWindows = []; // Bind the keyboard shortcuts for each layout and the layout searchers this._keyBindings = []; for (let i = 0; i < 20; i++) { this._keyBindings.push(`activate-layout${i}`); Main.wm.addKeybinding( `activate-layout${i}`, Settings.getGioObject(), Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, Shell.ActionMode.NORMAL, this.startLayouting.bind(this, i) ); } this._keyBindings.push('search-popup-layout'); Main.wm.addKeybinding( 'search-popup-layout', Settings.getGioObject(), Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, Shell.ActionMode.NORMAL, this.openPopupSearch.bind(this) ); // Add panel indicator this._panelIndicator = new PanelIndicator(); Main.panel.addToStatusArea( 'tiling-assistant@leleat-on-github', this._panelIndicator); this._settingsId = Settings.changed('show-layout-panel-indicator', () => { this._panelIndicator.visible = Settings.getBoolean('show-layout-panel-indicator'); }); this._panelIndicator.visible = Settings.getBoolean('show-layout-panel-indicator'); this._panelIndicator.connect('layout-activated', (src, idx) => this.startLayouting(idx)); } destroy() { Settings.disconnect(this._settingsId); this._finishLayouting(); this._keyBindings.forEach(key => Main.wm.removeKeybinding(key)); this._panelIndicator.destroy(); this._panelIndicator = null; } /** * Opens a popup window so the user can activate a layout by name * instead of the keyboard shortcut. */ openPopupSearch() { const layouts = Util.getLayouts(); if (!layouts.length) { // Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. Main.notify('Tiling Assistant', _('No valid layouts defined.')); return; } const search = new LayoutSearch(layouts); search.connect('item-activated', (s, index) => this.startLayouting(index)); } /** * Starts tiling to a Popup Layout. * * @param {number} index the index of the layout we start tiling to. */ startLayouting(index) { const layout = Util.getLayouts()?.[index]; if (!layout) return; const allWs = Settings.getBoolean('tiling-popup-all-workspace'); this._remainingWindows = Twm.getWindows(allWs); this._items = new Layout(layout).getItems(); this._currItem = null; const activeWs = global.workspace_manager.get_active_workspace(); const monitor = global.display.get_current_monitor(); const workArea = activeWs.get_work_area_for_monitor(monitor); this._rectPreview?.destroy(); this._rectPreview = new St.Widget({ style_class: 'tile-preview', opacity: 0, x: workArea.x + workArea.width / 2, y: workArea.y + workArea.height / 2 }); Main.layoutManager.addChrome(this._rectPreview); this._step(); } _finishLayouting() { this._items = []; this._currItem = null; this._currRect = null; this._rectPreview?.destroy(); this._rectPreview = null; this._tiledWithLayout = []; this._tiledWithLoop = []; this._remainingWindows = []; } _step(loopType = null) { // If we aren't looping on the current item, we need to prepare for the // step by getting the next item / rect. If we are looping, we stay on // the current item / rect and open a new Tiling Popup for that rect. if (!loopType) { // We're at the last item and not looping, so there are no more items. if (this._currItem === this._items.at(-1)) { this._finishLayouting(); return; } const currIdx = this._items.indexOf(this._currItem); this._currItem = this._items[currIdx + 1]; // Scale the item's rect to the workArea const activeWs = global.workspace_manager.get_active_workspace(); const monitor = global.display.get_current_monitor(); const workArea = new Rect(activeWs.get_work_area_for_monitor(monitor)); const rectRatios = this._currItem.rect; this._currRect = new Rect( workArea.x + Math.floor(rectRatios.x * workArea.width), workArea.y + Math.floor(rectRatios.y * workArea.height), Math.ceil(rectRatios.width * workArea.width), Math.ceil(rectRatios.height * workArea.height) ); // Try to compensate possible rounding errors when scaling up the // rect by aligning it with the rects, which were already tiled // using this layout and the workArea. this._tiledWithLayout.forEach(w => this._currRect.tryAlignWith(w.tiledRect)); this._currRect.tryAlignWith(workArea); } const appId = this._currItem.appId; appId ? this._openAppTiled(appId) : this._openTilingPopup(); } _openAppTiled(appId) { const app = Shell.AppSystem.get_default().lookup_app(appId); if (!app) { // Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. Main.notify('Tiling Assistant', _('Popup Layouts: App not found.')); this._finishLayouting(); return; } const winTracker = Shell.WindowTracker.get_default(); const idx = this._remainingWindows.findIndex(w => winTracker.get_window_app(w) === app); const window = this._remainingWindows[idx]; idx !== -1 && this._remainingWindows.splice(idx, 1); if (window) { Twm.tile(window, this._currRect, { openTilingPopup: false, skipAnim: true }); } else if (app.can_open_new_window()) { Twm.openAppTiled(app, this._currRect); } this._step(); } async _openTilingPopup() { // There are no open windows left to tile using the Tiling Popup. // However there may be items with appIds, which we want to open. // So continue... if (!this._remainingWindows.length) { this._step(); return; } // Animate the rect preview this._rectPreview.ease({ x: this._currRect.x, y: this._currRect.y, width: this._currRect.width, height: this._currRect.height, opacity: 255, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD }); // Create the Tiling Popup const TilingPopup = await import('./tilingPopup.js'); const popup = new TilingPopup.TilingSwitcherPopup( this._remainingWindows, this._currRect, // If this._currItem is the last item and we don't loop over it, // allow the Tiling Popup itself to spawn another instance of // a Tiling Popup, if there is free screen space. this._currItem === this._items.at(-1) && !this._currItem.loopType, true ); const stacked = global.display.sort_windows_by_stacking(this._tiledWithLayout); const tileGroup = stacked.reverse(); if (!popup.show(tileGroup)) { popup.destroy(); this._finishLayouting(); return; } popup.connect('closed', this._onTilingPopupClosed.bind(this)); } _onTilingPopupClosed(tilingPopup, canceled) { if (canceled) { if (this._currItem.loopType) { this._tiledWithLoop = []; this._step(); } else { this._finishLayouting(); } } else { const tiledWindow = tilingPopup.tiledWindow; this._tiledWithLayout.push(tiledWindow); const i = this._remainingWindows.indexOf(tiledWindow); this._remainingWindows.splice(i, 1); // Make all windows, which were tiled during the current loop, // share the current rect evenly -> like the 'Stack' part of a // 'Master and Stack' if (this._currItem.loopType) { this._tiledWithLoop.push(tiledWindow); this._tiledWithLoop.forEach((w, idx) => { const rect = this._currRect.copy(); const [pos, dimension] = this._currItem.loopType === 'h' ? ['y', 'height'] : ['x', 'width']; rect[dimension] /= this._tiledWithLoop.length; rect[pos] += idx * rect[dimension]; Twm.tile(w, rect, { openTilingPopup: false, skipAnim: true }); }); } this._step(this._currItem.loopType); } } } /** * The GUI class for the Layout search. */ const LayoutSearch = GObject.registerClass({ Signals: { 'item-activated': { param_types: [GObject.TYPE_INT] } } }, class TilingLayoutsSearch extends St.Widget { _init(layouts) { const activeWs = global.workspace_manager.get_active_workspace(); super._init({ reactive: true, x: Main.uiGroup.x, y: Main.uiGroup.y, width: Main.uiGroup.width, height: Main.uiGroup.height }); Main.uiGroup.add_child(this); const grab = Main.pushModal(this); // We expect at least a keyboard grab here if ((grab.get_seat_state() & Clutter.GrabState.KEYBOARD) === 0) { Main.popModal(grab); return false; } this._grab = grab; this._haveModal = true; this._focused = -1; this._items = []; this.connect('button-press-event', () => this.destroy()); const popup = new St.BoxLayout({ style_class: 'switcher-list', vertical: true, width: 500 }); this.add_child(popup); const fontSize = 16; const entry = new St.Entry({ style: `font-size: ${fontSize}px;\ border-radius: 16px; margin-bottom: 12px;`, // Translators: This is the placeholder text for a search field. hint_text: ` ${_('Type to search...')}` }); const entryClutterText = entry.get_clutter_text(); entryClutterText.connect('key-press-event', this._onKeyPressed.bind(this)); entryClutterText.connect('text-changed', this._onTextChanged.bind(this)); popup.add_child(entry); this._items = layouts.map(layout => { const item = new SearchItem(layout._name, fontSize); item.connect('button-press-event', this._onItemClicked.bind(this)); popup.add_child(item); return item; }); if (!this._items.length) { this.destroy(); return; } const monitor = global.display.get_current_monitor(); const workArea = activeWs.get_work_area_for_monitor(monitor); popup.set_position(workArea.x + workArea.width / 2 - popup.width / 2, workArea.y + workArea.height / 2 - popup.height / 2); entry.grab_key_focus(); this._focus(0); } destroy() { if (this._haveModal) { Main.popModal(this._grab); this._haveModal = false; } super.destroy(); } _onKeyPressed(clutterText, event) { const keySym = event.get_key_symbol(); if (keySym === Clutter.KEY_Escape) { this.destroy(); return Clutter.EVENT_STOP; } else if (keySym === Clutter.KEY_Return || keySym === Clutter.KEY_KP_Enter || keySym === Clutter.KEY_ISO_Enter) { this._activate(); return Clutter.EVENT_STOP; } else if (keySym === Clutter.KEY_Down) { this._focusNext(); return Clutter.EVENT_STOP; } else if (keySym === Clutter.KEY_Up) { this._focusPrev(); return Clutter.EVENT_STOP; } return Clutter.EVENT_PROPAGATE; } _onTextChanged(clutterText) { const filterText = clutterText.get_text(); this._items.forEach(item => { item.text.toLowerCase().includes(filterText.toLowerCase()) ? item.show() : item.hide(); }); const nextVisibleIdx = this._items.findIndex(item => item.visible); this._focus(nextVisibleIdx); } _onItemClicked(item) { this._focused = this._items.indexOf(item); this._activate(); } _focusPrev() { this._focus((this._focused + this._items.length - 1) % this._items.length); } _focusNext() { this._focus((this._focused + 1) % this._items.length); } _focus(newIdx) { const prevItem = this._items[this._focused]; const newItem = this._items[newIdx]; this._focused = newIdx; prevItem?.remove_style_class_name('tiling-layout-search-highlight'); newItem?.add_style_class_name('tiling-layout-search-highlight'); } _activate() { this._focused !== -1 && this.emit('item-activated', this._focused); this.destroy(); } }); /** * An Item representing a Layout within the Popup Layout search. */ const SearchItem = GObject.registerClass( class TilingLayoutsSearchItem extends St.Label { _init(text, fontSize) { super._init({ // Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. text: ` ${text || _('Nameless layout...')}`, style: `font-size: ${fontSize}px;\ text-align: left;\ padding: 8px\ margin-bottom: 2px`, reactive: true }); } }); /** * A panel indicator to activate and favoritize a layout. */ const PanelIndicator = GObject.registerClass({ Signals: { 'layout-activated': { param_types: [GObject.TYPE_INT] } } }, class PanelIndicator extends PanelMenu.Button { _init() { super._init(0.0, 'Layout Indicator (Tiling Assistant)'); const path = Extension.lookupByURL(import.meta.url) .dir .get_child('media/preferences-desktop-apps-symbolic.svg') .get_path(); const gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(path) }); this.add_child(new St.Icon({ gicon, style_class: 'system-status-icon' })); const menuAlignment = 0.0; this.setMenu(new PopupMenu.PopupMenu(this, menuAlignment, St.Side.TOP)); } vfunc_event(event) { if (this.menu && (event.type() === Clutter.EventType.TOUCH_BEGIN || event.type() === Clutter.EventType.BUTTON_PRESS) ) { this._updateItems(); this.menu.toggle(); } return Clutter.EVENT_PROPAGATE; } _updateItems() { this.menu.removeAll(); const layouts = Util.getLayouts(); if (!layouts.length) { // Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. const item = new PopupMenu.PopupMenuItem(_('No valid layouts defined.')); item.setSensitive(false); this.menu.addMenuItem(item); } else { // Update favorites with monitor count and fill with '-1', if necessary const tmp = Settings.getStrv('favorite-layouts'); const count = Math.max(Main.layoutManager.monitors.length, tmp.length); const favorites = [...new Array(count)].map((m, monitorIndex) => { return tmp[monitorIndex] ?? '-1'; }); Settings.setStrv('favorite-layouts', favorites); // Create popup menu items layouts.forEach((layout, idx) => { const name = layout._name || `Layout ${idx + 1}`; const item = new PopupFavoriteMenuItem(name, idx); item.connect('activate', () => { Main.overview.hide(); this.emit('layout-activated', idx); }); item.connect('favorite-changed', this._updateItems.bind(this)); this.menu.addMenuItem(item); }); } this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); const settingsButton = new PopupMenu.PopupImageMenuItem(_('Preferences'), 'emblem-system-symbolic'); // Center button without changing the size (for the hover highlight) settingsButton._icon.set_x_expand(true); settingsButton.label.set_x_expand(true); settingsButton.connect('activate', () => Extension.lookupByURL(import.meta.url).openPreferences()); this.menu.addMenuItem(settingsButton); } }); /** * A PopupMenuItem for the PopupMenu of the PanelIndicator. */ const PopupFavoriteMenuItem = GObject.registerClass({ Signals: { 'favorite-changed': { param_types: [GObject.TYPE_INT] } } }, class PopupFavoriteMenuItem extends PopupMenu.PopupBaseMenuItem { _init(text, layoutIndex) { super._init(); this.add_child(new St.Label({ text, x_expand: true })); const favorites = Settings.getStrv('favorite-layouts'); Main.layoutManager.monitors.forEach((m, monitorIndex) => { const favoriteButton = new St.Button({ child: new St.Icon({ icon_name: favorites[monitorIndex] === `${layoutIndex}` ? 'starred-symbolic' : 'non-starred-symbolic', style_class: 'popup-menu-icon' }) }); this.add_child(favoriteButton); // Update gSetting with new Favorite (act as a toggle button) favoriteButton.connect('clicked', () => { const currFavorites = Settings.getStrv('favorite-layouts'); currFavorites[monitorIndex] = currFavorites[monitorIndex] === `${layoutIndex}` ? '-1' : `${layoutIndex}`; Settings.setStrv('favorite-layouts', currFavorites); this.emit('favorite-changed', monitorIndex); }); }); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/moveHandler.js000066400000000000000000001144241500466572600306030ustar00rootroot00000000000000import { Clutter, GLib, GObject, Gio, Meta, Mtk } from '../dependencies/gi.js'; import { Main, WindowManager } from '../dependencies/shell.js'; import { WINDOW_ANIMATION_TIME } from '../dependencies/unexported/windowManager.js'; import { Orientation, MoveModes, Settings } from '../common.js'; import { Rect, Util } from './utility.js'; import { TilingWindowManager as Twm } from './tilingWindowManager.js'; /** * This class gets to handle the move events (grab & monitor change) of windows. * If the moved window is tiled at the start of the grab, untile it. This is * done by releasing the grab via code, resizing the window, and then restarting * the grab via code. On Wayland this may not be reliable. As a workaround there * is a setting to restore a tiled window's size on the actual grab end. */ export default class TilingMoveHandler { constructor() { const moveOps = [Meta.GrabOp.MOVING, Meta.GrabOp.KEYBOARD_MOVING]; global.display.connectObject( 'grab-op-begin', (src, window, grabOp) => { grabOp &= ~1024; // META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED if (window && moveOps.includes(grabOp)) this._onMoveStarted(window, grabOp); }, this ); global.display.connectObject( 'window-entered-monitor', this._onMonitorEntered.bind(this), this ); // Save the windows, which need to make space for the // grabbed window (this is for the so called 'adaptive mode'): // { window1: newTileRect1, window2: newTileRect2, ... } this._splitRects = new Map(); // The rect the grabbed window will tile to // (it may differ from the tilePreview's rect) this._tileRect = null; this._favoritePreviews = []; this._tilePreview = new TilePreview(); // The mouse button mod to move/resize a window may be changed to Alt. // So switch Alt and Super in our own prefs, if the user switched from // Super to Alt. const modKeys = [ 'move-adaptive-tiling-mod', 'move-favorite-layout-mod', 'ignore-ta-mod' ]; const handleWindowActionKeyConflict = () => { const currMod = this._wmPrefs.get_string('mouse-button-modifier'); if (currMod === '') { for (const key of modKeys) { const mod = Settings.getInt(key); if (mod === 2) // Alt Settings.setInt(key, 0); } } else if (currMod === '') { for (const key of modKeys) { const mod = Settings.getInt(key); if (mod === 4) // Super Settings.setInt(key, 0); } } }; this._wmPrefs = new Gio.Settings({ schema_id: 'org.gnome.desktop.wm.preferences' }); this._wmPrefs.connectObject( 'changed::mouse-button-modifier', () => handleWindowActionKeyConflict(), this ); handleWindowActionKeyConflict(); } destroy() { this._wmPrefs.disconnectObject(this); this._wmPrefs = null; global.display.disconnectObject(this); this._tilePreview.destroy(); if (this._latestMonitorLockTimerId) { GLib.Source.remove(this._latestMonitorLockTimerId); this._latestMonitorLockTimerId = null; } if (this._latestPreviewTimerId) { GLib.Source.remove(this._latestPreviewTimerId); this._latestPreviewTimerId = null; } if (this._restoreSizeTimerId) { GLib.Source.remove(this._restoreSizeTimerId); this._restoreSizeTimerId = null; } if (this._movingTimerId) { GLib.Source.remove(this._movingTimerId); this._movingTimerId = null; } } _onMonitorEntered(src, monitorNr, window) { if (this._isGrabOp) // Reset preview mode: // Currently only needed to grab the favorite layout for the new monitor. this._preparePreviewModeChange(this._currPreviewMode, window); } _onMoveStarted(window, grabOp) { if (window.is_skip_taskbar()) return; // Also work with a window, which was maximized by GNOME natively // because it may have been tiled with this extension before being // maximized so we need to restore its size to pre-tiling. this._wasMaximizedOnStart = window.get_maximized(); const [x, y] = global.get_pointer(); // Try to restore the window size if (window.tiledRect || this._wasMaximizedOnStart) { let counter = 0; this._restoreSizeTimerId && GLib.Source.remove(this._restoreSizeTimerId); this._restoreSizeTimerId = GLib.timeout_add(GLib.PRIORITY_HIGH_IDLE, 10, () => { if (!global.display.is_grabbed()) { this._restoreSizeTimerId = null; return GLib.SOURCE_REMOVE; } counter += 10; if (counter >= 400) { this._restoreSizeAndRestartGrab(window, grabOp); this._restoreSizeTimerId = null; return GLib.SOURCE_REMOVE; } const [currX, currY] = global.get_pointer(); const currPoint = { x: currX, y: currY }; const oldPoint = { x, y }; const moveDist = Util.getDistance(currPoint, oldPoint); if (moveDist > 10) { this._restoreSizeAndRestartGrab(window, grabOp); this._restoreSizeTimerId = null; return GLib.SOURCE_REMOVE; } return GLib.SOURCE_CONTINUE; }); // Tile preview } else { this._isGrabOp = true; this._monitorNr = global.display.get_current_monitor(); this._lastMonitorNr = this._monitorNr; this._lastPointerPos = { x, y }; this._pointerDidntMove = false; this._movingTimerDuration = 20; this._movingTimeoutsSinceUpdate = 0; this._topTileGroup = Twm.getTopTileGroup({ skipTopWindow: true }); // When low performance mode is enabled we use a timer to periodically // update the tile previews so that we don't update the tile preview // as often when compared to the position-changed signal. if (Settings.getBoolean('low-performance-move-mode')) { this._movingTimerId = GLib.timeout_add( GLib.PRIORITY_DEFAULT_IDLE, this._movingTimerDuration, this._onMoving.bind( this, grabOp, window, true ) ); const id = global.display.connect('grab-op-end', () => { global.display.disconnect(id); // 'Quick throws' of windows won't create a tile preview since // the timeout for onMoving may not have happened yet. So force // 1 call of the tile preview updates for those quick actions. this._onMoving(grabOp, window); this._onMoveFinished(window); }); // Otherwise we will update the tile preview whenever the window is // moved as often as necessary. } else { this._posChangedId = window.connect('position-changed', this._onMoving.bind( this, grabOp, window, false ) ); const id = global.display.connect('grab-op-end', () => { global.display.disconnect(id); this._onMoveFinished(window); }); } } } _onMoveFinished(window) { try { window.assertExistence(); if (this._tileRect) { // Ctrl-drag to replace some windows in a tile group / create a new tile group // with at least 1 window being part of multiple tile groups. let isCtrlReplacement = false; const ctrlReplacedTileGroup = []; const topTileGroup = Twm.getTopTileGroup({ skipTopWindow: true }); const pointerPos = { x: global.get_pointer()[0], y: global.get_pointer()[1] }; const twHovered = topTileGroup.some(w => w.tiledRect.containsPoint(pointerPos)); if (this._currPreviewMode === MoveModes.ADAPTIVE_TILING && !this._splitRects.size && twHovered) { isCtrlReplacement = true; ctrlReplacedTileGroup.push(window); topTileGroup.forEach(w => { if (!this._tileRect.containsRect(w.tiledRect)) ctrlReplacedTileGroup.push(w); }); } this._splitRects.forEach((rect, w) => Twm.tile(w, rect, { openTilingPopup: false })); this._splitRects.clear(); Twm.tile(window, this._tileRect, { monitorNr: this._monitorNr, openTilingPopup: this._currPreviewMode !== MoveModes.ADAPTIVE_TILING, ignoreTA: this._ignoreTA }); this._tileRect = null; // Create a new tile group, in which some windows are already part // of a different tile group, with ctrl-(super)-drag. The window may // be maximized by ctrl-super-drag. isCtrlReplacement && window.isTiled && Twm.updateTileGroup(ctrlReplacedTileGroup); } } finally { if (this._posChangedId) { window.disconnect(this._posChangedId); this._posChangedId = 0; } this._favoriteLayout = []; this._favoritePreviews?.forEach(p => p.destroy()); this._favoritePreviews = []; this._freeScreenRects = []; this._anchorRect = null; this._topTileGroup = null; this._tilePreview.close(); this._currPreviewMode = MoveModes.ADAPTIVE_TILING; this._isGrabOp = false; } } // If lowPerfMode is enabled in the settings: // Called periodically (~ every 20 ms) with a timer after a window was grabbed. // However this function will only update the tile previews fully after about // 500 ms. Force an earlier update, if the pointer movement state changed // (e.g. pointer came to a stop after a movement). This Detection is done // naively by comparing the pointer position of the previous timeout with // the current position. // Without the lowPerfMode enabled this will be called whenever the window is // moved (by listening to the position-changed signal) _onMoving(grabOp, window, lowPerfMode = false) { const [x, y] = global.get_pointer(); const currPointerPos = { x, y }; if (lowPerfMode) { if (!this._isGrabOp) { this._movingTimerId = null; return GLib.SOURCE_REMOVE; } const movementDist = Util.getDistance(this._lastPointerPos, currPointerPos); const movementDetectionThreshold = 10; let forceMoveUpdate = false; this._movingTimeoutsSinceUpdate++; // Force an early update if the movement state changed // i. e. moving -> stand still or stand still -> moving if (this._pointerDidntMove) { if (movementDist > movementDetectionThreshold) { this._pointerDidntMove = false; forceMoveUpdate = true; } } else if (movementDist < movementDetectionThreshold) { this._pointerDidntMove = true; forceMoveUpdate = true; } // Only update the tile preview every 500 ms for better performance. // Force an early update, if the pointer movement state changed. const updateInterval = 500; const timeSinceLastUpdate = this._movingTimerDuration * this._movingTimeoutsSinceUpdate; if (timeSinceLastUpdate < updateInterval && !forceMoveUpdate) return GLib.SOURCE_CONTINUE; this._movingTimeoutsSinceUpdate = 0; } this._lastPointerPos = currPointerPos; const ctrl = Clutter.ModifierType.CONTROL_MASK; const altL = Clutter.ModifierType.MOD1_MASK; const altGr = Clutter.ModifierType.MOD5_MASK; const meta = Clutter.ModifierType.MOD4_MASK; const rmb = Meta.is_wayland_compositor() ? Clutter.ModifierType.BUTTON2_MASK : Clutter.ModifierType.BUTTON3_MASK; const pressed = [ // idxs come from settings false, // Dummy for disabled state so that we can use the correct idxs Util.isModPressed(ctrl), Util.isModPressed(altL) || Util.isModPressed(altGr), Util.isModPressed(rmb), Util.isModPressed(meta) ]; const defaultMode = Settings.getInt('default-move-mode'); const adaptiveMod = Settings.getInt('move-adaptive-tiling-mod'); const favMod = Settings.getInt('move-favorite-layout-mod'); const ignoreTAMod = Settings.getInt('ignore-ta-mod'); const noMod = !pressed[adaptiveMod] && !pressed[ignoreTAMod] && !pressed[ignoreTAMod]; const useAdaptiveTiling = defaultMode !== MoveModes.ADAPTIVE_TILING && pressed[adaptiveMod] || noMod && defaultMode === MoveModes.ADAPTIVE_TILING; const usefavLayout = defaultMode !== MoveModes.FAVORITE_LAYOUT && pressed[favMod] || noMod && defaultMode === MoveModes.FAVORITE_LAYOUT; const useIgnoreTa = defaultMode !== MoveModes.IGNORE_TA && pressed[ignoreTAMod] || noMod && defaultMode === MoveModes.IGNORE_TA; let newMode; if (useAdaptiveTiling) newMode = MoveModes.ADAPTIVE_TILING; else if (usefavLayout) newMode = MoveModes.FAVORITE_LAYOUT; else if (useIgnoreTa) newMode = MoveModes.IGNORE_TA; else newMode = MoveModes.EDGE_TILING; if (this._currPreviewMode !== newMode) this._preparePreviewModeChange(newMode, window); switch (newMode) { case MoveModes.IGNORE_TA: case MoveModes.EDGE_TILING: this._edgeTilingPreview(window, grabOp); break; case MoveModes.ADAPTIVE_TILING: this._adaptiveTilingPreview(window, grabOp); break; case MoveModes.FAVORITE_LAYOUT: this._favoriteLayoutTilingPreview(window); } this._currPreviewMode = newMode; return GLib.SOURCE_CONTINUE; } _preparePreviewModeChange(newMode, window) { this._tileRect = null; this._ignoreTA = false; this._topTileGroup = Twm.getTopTileGroup({ skipTopWindow: true }); const activeWs = global.workspace_manager.get_active_workspace(); const monitor = global.display.get_current_monitor(); const workArea = new Rect(activeWs.get_work_area_for_monitor(monitor)); const tRects = this._topTileGroup.map(w => w.tiledRect); this._freeScreenRects = workArea.minus(tRects); switch (this._currPreviewMode) { case MoveModes.ADAPTIVE_TILING: this._monitorNr = global.display.get_current_monitor(); this._splitRects.clear(); this._anchorRect = null; break; case MoveModes.FAVORITE_LAYOUT: this._monitorNr = global.display.get_current_monitor(); this._favoritePreviews.forEach(p => { p.ease({ opacity: 0, duration: 100, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => p.destroy() }); }); this._favoritePreviews = []; this._anchorRect = null; } switch (newMode) { case MoveModes.IGNORE_TA: this._ignoreTA = true; break; case MoveModes.FAVORITE_LAYOUT: this._favoriteLayout = Util.getFavoriteLayout(); this._favoriteLayout.forEach(rect => { const tilePreview = new TilePreview(); tilePreview.open(window, rect, this._monitorNr, { opacity: 255, duration: 150 }); this._favoritePreviews.push(tilePreview); }); } } _restoreSizeAndRestartGrab(window, grabOp) { Twm.untile(window, { restoreFullPos: false, skipAnim: this._wasMaximizedOnStart }); this._onMoveStarted(window, grabOp); } /** * Previews the rect the `window` will tile to when moving along the * screen edges. * * @param {Meta.Window} window the grabbed Meta.Window. * @param {Meta.GrabOp} grabOp the current Meta.GrabOp. */ _edgeTilingPreview(window, grabOp) { // When switching monitors, provide a short grace period // in which the tile preview will stick to the old monitor so that // the user doesn't have to slowly inch the mouse to the monitor edge // just because there is another monitor at that edge. const currMonitorNr = global.display.get_current_monitor(); const useGracePeriod = Settings.getBoolean('monitor-switch-grace-period'); if (useGracePeriod) { if (this._lastMonitorNr !== currMonitorNr) { this._monitorNr = this._lastMonitorNr; let timerId = 0; this._latestMonitorLockTimerId && GLib.Source.remove(this._latestMonitorLockTimerId); this._latestMonitorLockTimerId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, () => { // Only update the monitorNr, if the latest timer timed out. if (timerId === this._latestMonitorLockTimerId) { this._monitorNr = global.display.get_current_monitor(); if (global.display.is_grabbed()) this._edgeTilingPreview(window, grabOp); } this._latestMonitorLockTimerId = null; return GLib.SOURCE_REMOVE; }); timerId = this._latestMonitorLockTimerId; } } else { this._monitorNr = global.display.get_current_monitor(); } this._lastMonitorNr = currMonitorNr; const wRect = window.get_frame_rect(); const workArea = new Rect(window.get_work_area_for_monitor(this._monitorNr)); const vDetectionSize = Settings.getInt('vertical-preview-area'); const pointerAtTopEdge = this._lastPointerPos.y <= workArea.y + vDetectionSize; const pointerAtBottomEdge = this._lastPointerPos.y >= workArea.y2 - vDetectionSize; const hDetectionSize = Settings.getInt('horizontal-preview-area'); const pointerAtLeftEdge = this._lastPointerPos.x <= workArea.x + hDetectionSize; const pointerAtRightEdge = this._lastPointerPos.x >= workArea.x2 - hDetectionSize; // Also use window's pos for top and bottom area detection for quarters // because global.get_pointer's y isn't accurate (no idea why...) when // grabbing the titlebar & slowly going from the left/right sides to // the top/bottom corners. const titleBarGrabbed = this._lastPointerPos.y - wRect.y < 50; const windowAtTopEdge = titleBarGrabbed && wRect.y === workArea.y; const windowAtBottomEdge = wRect.y >= workArea.y2 - 75; const tileTopLeftQuarter = pointerAtLeftEdge && (pointerAtTopEdge || windowAtTopEdge); const tileTopRightQuarter = pointerAtRightEdge && (pointerAtTopEdge || windowAtTopEdge); const tileBottomLeftQuarter = pointerAtLeftEdge && (pointerAtBottomEdge || windowAtBottomEdge); const tileBottomRightQuarter = pointerAtRightEdge && (pointerAtBottomEdge || windowAtBottomEdge); if (tileTopLeftQuarter) { this._tileRect = Twm.getTileFor('tile-topleft-quarter', workArea, this._monitorNr); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } else if (tileTopRightQuarter) { this._tileRect = Twm.getTileFor('tile-topright-quarter', workArea, this._monitorNr); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } else if (tileBottomLeftQuarter) { this._tileRect = Twm.getTileFor('tile-bottomleft-quarter', workArea, this._monitorNr); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } else if (tileBottomRightQuarter) { this._tileRect = Twm.getTileFor('tile-bottomright-quarter', workArea, this._monitorNr); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } else if (pointerAtTopEdge) { // Switch between maximize & top tiling when keeping the mouse at the top edge. const monitorRect = global.display.get_monitor_geometry(this._monitorNr); const isLandscape = monitorRect.width >= monitorRect.height; const shouldMaximize = isLandscape && !Settings.getBoolean('enable-hold-maximize-inverse-landscape') || !isLandscape && !Settings.getBoolean('enable-hold-maximize-inverse-portrait'); const tileRect = shouldMaximize ? workArea : Twm.getTileFor('tile-top-half', workArea, this._monitorNr); const holdTileRect = shouldMaximize ? Twm.getTileFor('tile-top-half', workArea, this._monitorNr) : workArea; // Dont open preview / start new timer if preview was already one for the top if (this._tilePreview._rect && (holdTileRect.equal(this._tilePreview._rect) || this._tilePreview._rect.equal(tileRect.meta))) return; this._tileRect = tileRect; this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); let timerId = 0; this._latestPreviewTimerId && GLib.Source.remove(this._latestPreviewTimerId); this._latestPreviewTimerId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, Settings.getInt('toggle-maximize-tophalf-timer'), () => { // Only open the alternative preview, if the timeout-ed timer // is the same as the one which started last if (timerId === this._latestPreviewTimerId && this._tilePreview._showing && this._tilePreview._rect.equal(tileRect.meta)) { this._tileRect = holdTileRect; this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } this._latestPreviewTimerId = null; return GLib.SOURCE_REMOVE; }); timerId = this._latestPreviewTimerId; } else if (pointerAtBottomEdge) { this._tileRect = Twm.getTileFor('tile-bottom-half', workArea, this._monitorNr); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } else if (pointerAtLeftEdge) { this._tileRect = Twm.getTileFor('tile-left-half', workArea, this._monitorNr); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } else if (pointerAtRightEdge) { this._tileRect = Twm.getTileFor('tile-right-half', workArea, this._monitorNr); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr); } else { this._tileRect = null; this._tilePreview.close(); } } /** * Activates the secondary preview mode. By default, it's activated with * `Ctrl`. When tiling using this mode, it will not only affect the grabbed * window but possibly others as well. It's split into a 'single' and a * 'group' mode. Take a look at _adaptiveTilingPreviewSingle() and * _adaptiveTilingPreviewGroup() for details. * * @param {Meta.Window} window * @param {Meta.GrabOp} grabOp */ _adaptiveTilingPreview(window, grabOp) { if (!this._topTileGroup.length) { this._edgeTilingPreview(window, grabOp); return; } const screenRects = this._topTileGroup .map(w => w.tiledRect) .concat(this._freeScreenRects); const hoveredRect = screenRects.find(r => r.containsPoint(this._lastPointerPos)); if (!hoveredRect) { this._tilePreview.close(); this._tileRect = null; return; } const isSuperPressed = Util.isModPressed(Clutter.ModifierType.MOD4_MASK); if (isSuperPressed) { this._anchorRect = this._anchorRect ?? hoveredRect; this._tileRect = hoveredRect.union(this._anchorRect); this._splitRects.clear(); this._tilePreview.open(window, this._tileRect.meta, this._monitorNr, { x: this._tileRect.x, y: this._tileRect.y, width: this._tileRect.width, height: this._tileRect.height, opacity: 200 }); } else { this._anchorRect = null; const edgeRadius = 50; const atTopEdge = this._lastPointerPos.y < hoveredRect.y + edgeRadius; const atBottomEdge = this._lastPointerPos.y > hoveredRect.y2 - edgeRadius; const atLeftEdge = this._lastPointerPos.x < hoveredRect.x + edgeRadius; const atRightEdge = this._lastPointerPos.x > hoveredRect.x2 - edgeRadius; atTopEdge || atBottomEdge || atLeftEdge || atRightEdge ? this._adaptiveTilingPreviewGroup(window, hoveredRect, { atTopEdge, atBottomEdge, atLeftEdge, atRightEdge }) : this._adaptiveTilingPreviewSingle(window, hoveredRect); } } /** * In this mode, when moving a window over a tiled window, the tilePreview * will appear and (partly) cover the tiled window. If your pointer is at * the center, the grabbed window will just tile over the hovered tiled * window. If your pointer is hovering over the sides (but not the very * edges) of the tiled window, the tilePreview will only cover half of the * tiled window. Once the grabbed window is tiled, the previously hovered * tiled window, will make space for the grabbed window by halving its size. * * @param {Meta.Window} window * @param {Rect} hoveredRect */ _adaptiveTilingPreviewSingle(window, hoveredRect) { const atTop = this._lastPointerPos.y < hoveredRect.y + hoveredRect.height * .25; const atBottom = this._lastPointerPos.y > hoveredRect.y + hoveredRect.height * .75; const atRight = this._lastPointerPos.x > hoveredRect.x + hoveredRect.width * .75; const atLeft = this._lastPointerPos.x < hoveredRect.x + hoveredRect.width * .25; const splitVertically = atTop || atBottom; const splitHorizontally = atLeft || atRight; if (splitHorizontally || splitVertically) { const idx = atTop && !atRight || atLeft ? 0 : 1; const size = splitHorizontally ? hoveredRect.width : hoveredRect.height; const orientation = splitHorizontally ? Orientation.V : Orientation.H; this._tileRect = hoveredRect.getUnitAt(idx, size / 2, orientation); } else { this._tileRect = hoveredRect.copy(); } if (!this._tilePreview.needsUpdate(this._tileRect)) return; const monitor = global.display.get_current_monitor(); this._tilePreview.open(window, this._tileRect.meta, monitor); this._splitRects.clear(); const hoveredWindow = this._topTileGroup.find(w => { return w.tiledRect.containsPoint(this._lastPointerPos); }); if (!hoveredWindow) return; // Don't halve the window, if we compelety cover it i. e. // the user is hovering the tiled window at the center. if (hoveredWindow.tiledRect.equal(this._tileRect)) return; const splitRect = hoveredWindow.tiledRect.minus(this._tileRect)[0]; this._splitRects.set(hoveredWindow, splitRect); } /** * Similar to _adaptiveTilingPreviewSingle(). But it's activated by hovering * the very edges of a tiled window. And instead of affecting just 1 window * it can possibly re-tile multiple windows. A tiled window will be affected, * if it aligns with the edge that is being hovered. It's probably easier * to understand, if you see it in action first rather than reading about it. * * @param {Meta.Window} window * @param {Rect} hoveredRect * @param {object} hovered contains booleans at which position the * `hoveredRect` is hovered. */ _adaptiveTilingPreviewGroup(window, hoveredRect, hovered) { // Find the smallest window that will be affected and use it to calculate // the sizes of the preview. Determine the new tileRects for the rest // of the tileGroup via Rect.minus(). const smallestWindow = this._topTileGroup.reduce((smallest, w) => { if (hovered.atTopEdge) { if (w.tiledRect.y === hoveredRect.y || w.tiledRect.y2 === hoveredRect.y) return w.tiledRect.height < smallest.tiledRect.height ? w : smallest; } else if (hovered.atBottomEdge) { if (w.tiledRect.y === hoveredRect.y2 || w.tiledRect.y2 === hoveredRect.y2) return w.tiledRect.height < smallest.tiledRect.height ? w : smallest; } else if (hovered.atLeftEdge) { if (w.tiledRect.x === hoveredRect.x || w.tiledRect.x2 === hoveredRect.x) return w.tiledRect.width < smallest.tiledRect.width ? w : smallest; } else if (hovered.atRightEdge) { if (w.tiledRect.x === hoveredRect.x2 || w.tiledRect.x2 === hoveredRect.x2) return w.tiledRect.width < smallest.tiledRect.width ? w : smallest; } return smallest; }); const monitor = global.display.get_current_monitor(); const workArea = new Rect(window.get_work_area_for_monitor(monitor)); // This factor is used in combination with the smallestWindow to // determine the final size of the grabbed window. Use half of the size // factor, if we are at the screen edges. The cases for the bottom and // right screen edges are covered further down. const factor = hovered.atLeftEdge && hoveredRect.x === workArea.x || hovered.atTopEdge && hoveredRect.y === workArea.y ? 1 / 3 : 2 / 3; // The grabbed window will be horizontal. The horizontal size (x1 - x2) // is determined by the furthest left- and right-reaching windows that // align with the hovered rect. The vertical size (height) is a fraction // of the smallestWindow. if (hovered.atTopEdge || hovered.atBottomEdge) { const getX1X2 = alignsAt => { return this._topTileGroup.reduce((x1x2, w) => { const currX = x1x2[0]; const currX2 = x1x2[1]; return alignsAt(w) ? [Math.min(w.tiledRect.x, currX), Math.max(w.tiledRect.x2, currX2)] : x1x2; }, [hoveredRect.x, hoveredRect.x2]); }; const alignTopEdge = w => { return hoveredRect.y === w.tiledRect.y || hoveredRect.y === w.tiledRect.y2; }; const alignBottomEdge = w => { return hoveredRect.y2 === w.tiledRect.y2 || hoveredRect.y2 === w.tiledRect.y; }; const [x1, x2] = getX1X2(hovered.atTopEdge ? alignTopEdge : alignBottomEdge); const size = Math.ceil(smallestWindow.tiledRect.height * factor); // Keep within workArea bounds. const y = Math.max(workArea.y, Math.floor(hovered.atTopEdge ? hoveredRect.y - size / 2 : hoveredRect.y2 - size / 2 )); const height = Math.min(size, workArea.y2 - y); this._tileRect = new Rect(x1, y, x2 - x1, height); // The grabbed window will be vertical. The vertical size (y1 - y2) is // determined by the furthest top- and bottom-reaching windows that align // with the hovered rect. The horizontal size (width) is a fraction of // the smallestWindow. } else { const getY1Y2 = alignsAt => { return this._topTileGroup.reduce((y1y2, w) => { const currY = y1y2[0]; const currY2 = y1y2[1]; return alignsAt(w) ? [Math.min(w.tiledRect.y, currY), Math.max(w.tiledRect.y2, currY2)] : y1y2; }, [hoveredRect.y, hoveredRect.y2]); }; const alignLeftEdge = w => { return hoveredRect.x === w.tiledRect.x || hoveredRect.x === w.tiledRect.x2; }; const alignRightEdge = w => { return hoveredRect.x2 === w.tiledRect.x2 || hoveredRect.x2 === w.tiledRect.x; }; const [y1, y2] = getY1Y2(hovered.atLeftEdge ? alignLeftEdge : alignRightEdge); const size = Math.ceil(smallestWindow.tiledRect.width * factor); // Keep within workArea bounds. const x = Math.max(workArea.x, Math.floor(hovered.atLeftEdge ? hoveredRect.x - size / 2 : hoveredRect.x2 - size / 2 )); const width = Math.min(size, workArea.x2 - x); this._tileRect = new Rect(x, y1, width, y2 - y1); } this._tileRect.tryAlignWith(workArea); if (!this._tilePreview.needsUpdate(this._tileRect)) return; this._tilePreview.open(window, this._tileRect.meta, monitor); this._splitRects.clear(); this._topTileGroup.forEach(w => { const leftOver = w.tiledRect.minus(this._tileRect); const splitRect = leftOver[0]; // w isn't an affected window. if (splitRect?.equal(this._tileRect) ?? true) return; this._splitRects.set(w, splitRect); }); } _favoriteLayoutTilingPreview(window) { // Holding Super will make the window span multiple rects of the favorite // layout starting from the rect, which the user starting holding Super in. const isSuperPressed = Util.isModPressed(Clutter.ModifierType.MOD4_MASK); for (const rect of this._favoriteLayout) { if (rect.containsPoint(this._lastPointerPos)) { if (isSuperPressed) { this._anchorRect = this._anchorRect ?? rect; this._tileRect = rect.union(this._anchorRect); } else { this._tileRect = rect.copy(); this._anchorRect = null; } this._tilePreview.open(window, this._tileRect.meta, this._monitorNr, { x: this._tileRect.x, y: this._tileRect.y, width: this._tileRect.width, height: this._tileRect.height, opacity: 200 }); return; } } this._tileRect = null; this._tilePreview.close(); } } const TilePreview = GObject.registerClass( class TilePreview extends WindowManager.TilePreview { _init() { super._init(); this.set_style_class_name('tile-preview'); } needsUpdate(rect) { return !this._rect || !rect.equal(this._rect); } // Added param for animation and removed style for rounded corners open(window, tileRect, monitorIndex, animateTo = undefined) { const windowActor = window.get_compositor_private(); if (!windowActor) return; global.window_group.set_child_below_sibling(this, windowActor); if (this._rect && this._rect.equal(tileRect)) return; const changeMonitor = this._monitorIndex === -1 || this._monitorIndex !== monitorIndex; this._monitorIndex = monitorIndex; this._rect = tileRect; const monitor = Main.layoutManager.monitors[monitorIndex]; if (!this._showing || changeMonitor) { const monitorRect = new Mtk.Rectangle({ x: monitor.x, y: monitor.y, width: monitor.width, height: monitor.height }); const [, rect] = window.get_frame_rect().intersect(monitorRect); this.set_size(rect.width, rect.height); this.set_position(rect.x, rect.y); this.opacity = 0; } this._showing = true; this.show(); if (!animateTo) { animateTo = { x: tileRect.x, y: tileRect.y, width: tileRect.width, height: tileRect.height, opacity: 255, duration: WINDOW_ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD }; } else { animateTo.x === undefined && this.set_x(tileRect.x); animateTo.y === undefined && this.set_y(tileRect.y); animateTo.width === undefined && this.set_width(tileRect.width); animateTo.height === undefined && this.set_height(tileRect.height); animateTo.opacity === undefined && this.set_opacity(255); animateTo.duration = animateTo.duration ?? WINDOW_ANIMATION_TIME; animateTo.mode = animateTo.mode ?? Clutter.AnimationMode.EASE_OUT_QUAD; } this.ease(animateTo); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/resizeHandler.js000066400000000000000000000571021500466572600311350ustar00rootroot00000000000000import { Clutter, Meta } from '../dependencies/gi.js'; import { Orientation } from '../common.js'; import { Rect, Util } from './utility.js'; import { TilingWindowManager as Twm } from './tilingWindowManager.js'; const Side = { NONE: 0, SAME_H: 1, OPPOSING_H: 2, SAME_V: 4, OPPOSING_V: 8 }; /** * This class gets to handle the resize events of windows (whether they are * tiled or not). If a window isn't tiled, nothing happens. If the resized * window is tiled, auto-resize the complementing tiled windows. Intercardinal * resizing is split into its [H]orizontal and [V]ertical components. */ export default class TilingResizeHandler { constructor() { const isResizing = grabOp => { switch (grabOp) { case Meta.GrabOp.RESIZING_N: case Meta.GrabOp.RESIZING_NW: case Meta.GrabOp.RESIZING_NE: case Meta.GrabOp.RESIZING_S: case Meta.GrabOp.RESIZING_SW: case Meta.GrabOp.RESIZING_SE: case Meta.GrabOp.RESIZING_E: case Meta.GrabOp.RESIZING_W: return true; default: return false; } }; global.display.connectObject( 'grab-op-begin', (d, window, grabOp) => { grabOp &= ~1024; // META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED if (window && isResizing(grabOp)) this._onResizeStarted(window, grabOp); }, this ); global.display.connectObject( 'grab-op-end', (d, window, grabOp) => { grabOp &= ~1024; // META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED if (window && isResizing(grabOp)) this._onResizeFinished(window, grabOp); }, this ); this._preGrabRects = new Map(); // Save the windows, which are to be resized (passively) along the // actively grabbed one, and a resizeOp. A resizeOp saves the side // of the window, which will be passively resized, relative to the // actively resized window. this._resizeOps = new Map(); } destroy() { global.display.disconnectObject(this); } _onResizeStarted(window, grabOp) { if (!window.isTiled) return; // Use the same margin for the alignment and equality check below. const margin = 5; let topTileGroup = Twm.getTopTileGroup(); topTileGroup.forEach(w => { this._preGrabRects.set(w, new Rect(w.get_frame_rect())); if (w !== window) // There is no snapping for tiled windows, if the user set a window // gap. So the windows may not align properly, if the user tried // to manually resize them to be edge to edge. In that case, assume // that windows that are within a certain margin distance to each // other are meant to align and resize them together. w.tiledRect.tryAlignWith(window.tiledRect, margin); }); // Windows can be part of multiple tile groups. We however only resize // the top most visible tile group. That means a tile group in a lower // stack position may share windows with the top tile group and after // the resize op those windows will no longer match with the lower tile // group's tiles. So remove the shared windows from the lower tile group. const allWindows = Twm.getWindows(); allWindows.forEach(w => { if (!w.isTiled) return; if (topTileGroup.includes(w)) return; // Gets a tile group of windows without the ones // which are about to be resized const group = Twm.getTileGroupFor(w); const newGroup = group.reduce((gr, win) => { !topTileGroup.includes(win) && gr.push(win); return gr; }, []); // Tile groups are the same if (group.length === newGroup.length) return; // Remove old tile group and create new one Twm.clearTilingProps(w.get_id()); Twm.updateTileGroup(newGroup); }); // Remove the actively resizing window to get the windows, which will // be passively resized. topTileGroup.splice(topTileGroup.indexOf(window), 1); const grabbedRect = window.tiledRect; // Holding Ctrl allows resizing windows which only directly (or transitively) // border the window being actively resized (instead of the entire tileGroup) const isCtrlPressed = Util.isModPressed(Clutter.ModifierType.CONTROL_MASK); const singleEdgeResizeOp = [ Meta.GrabOp.RESIZING_N, Meta.GrabOp.RESIZING_S, Meta.GrabOp.RESIZING_W, Meta.GrabOp.RESIZING_E ]; if (isCtrlPressed && singleEdgeResizeOp.includes(grabOp)) topTileGroup = this._getWindowsForIndividualResize(window, topTileGroup, grabOp); switch (grabOp) { // Resizing cardinal directions case Meta.GrabOp.RESIZING_N: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( Util.equal(grabbedRect.y, otherRect.y, margin), Util.equal(grabbedRect.y, otherRect.y2, margin), false, false ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, grabOp, null), this ); break; case Meta.GrabOp.RESIZING_S: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( Util.equal(grabbedRect.y2, otherRect.y2, margin), Util.equal(grabbedRect.y2, otherRect.y, margin), false, false ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, grabOp, null), this ); break; case Meta.GrabOp.RESIZING_E: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( false, false, Util.equal(grabbedRect.x2, otherRect.x2, margin), Util.equal(grabbedRect.x2, otherRect.x, margin) ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, null, grabOp), this ); break; case Meta.GrabOp.RESIZING_W: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( false, false, Util.equal(grabbedRect.x, otherRect.x, margin), Util.equal(grabbedRect.x, otherRect.x2, margin) ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, null, grabOp), this ); break; // Resizing intercardinal directions: case Meta.GrabOp.RESIZING_NW: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( Util.equal(grabbedRect.y, otherRect.y, margin), Util.equal(grabbedRect.y, otherRect.y2, margin), Util.equal(grabbedRect.x, otherRect.x, margin), Util.equal(grabbedRect.x, otherRect.x2, margin) ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, Meta.GrabOp.RESIZING_N, Meta.GrabOp.RESIZING_W), this ); break; case Meta.GrabOp.RESIZING_NE: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( Util.equal(grabbedRect.y, otherRect.y, margin), Util.equal(grabbedRect.y, otherRect.y2, margin), Util.equal(grabbedRect.x2, otherRect.x2, margin), Util.equal(grabbedRect.x2, otherRect.x, margin) ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, Meta.GrabOp.RESIZING_N, Meta.GrabOp.RESIZING_E), this ); break; case Meta.GrabOp.RESIZING_SW: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( Util.equal(grabbedRect.y2, otherRect.y2, margin), Util.equal(grabbedRect.y2, otherRect.y, margin), Util.equal(grabbedRect.x, otherRect.x, margin), Util.equal(grabbedRect.x, otherRect.x2, margin) ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, Meta.GrabOp.RESIZING_S, Meta.GrabOp.RESIZING_W), this ); break; case Meta.GrabOp.RESIZING_SE: for (const otherWindow of topTileGroup) { const otherRect = otherWindow.tiledRect; const resizeOp = ResizeOp.createResizeOp( Util.equal(grabbedRect.y2, otherRect.y2, margin), Util.equal(grabbedRect.y2, otherRect.y, margin), Util.equal(grabbedRect.x2, otherRect.x2, margin), Util.equal(grabbedRect.x2, otherRect.x, margin) ); resizeOp && this._resizeOps.set(otherWindow, resizeOp); } window.connectObject( 'size-changed', this._onResizing.bind(this, window, Meta.GrabOp.RESIZING_S, Meta.GrabOp.RESIZING_E), this ); } } // Update the windows' tiledRects _onResizeFinished(window, grabOp) { window.disconnectObject(this); if (!window.isTiled) return; const monitor = window.get_monitor(); const screenTopGap = Util.useIndividualGaps(monitor) ? Util.getScaledGap('screen-top-gap', monitor) : Util.getScaledGap('single-screen-gap', monitor); const screenLeftGap = Util.useIndividualGaps(monitor) ? Util.getScaledGap('screen-left-gap', monitor) : Util.getScaledGap('single-screen-gap', monitor); const windowGap = Util.getScaledGap('window-gap', monitor); const workArea = window.get_work_area_for_monitor(monitor); // First calculate the new tiledRect for window: // The new x / y coord for the window's tiledRect can be calculated by // a simple difference because resizing on the E / S side won't change // x / y and resizing on the N or W side will translate into a 1:1 shift const grabbedsNewRect = new Rect(window.get_frame_rect()); const grabbedsOldRect = this._preGrabRects.get(window); const isResizingW = (grabOp & Meta.GrabOp.RESIZING_W) > 1; // Shift the tiledRect by the resize amount let newGrabbedTiledRectX = window.tiledRect.x + (grabbedsNewRect.x - grabbedsOldRect.x); // Switch the screenGap for a windowGap if (isResizingW && window.tiledRect.x === workArea.x) newGrabbedTiledRectX = newGrabbedTiledRectX + screenLeftGap - windowGap / 2; // Same as W but different orientation const isResizingN = (grabOp & Meta.GrabOp.RESIZING_N) > 1; let newGrabbedTiledRectY = window.tiledRect.y + (grabbedsNewRect.y - grabbedsOldRect.y); if (isResizingN && window.tiledRect.y === workArea.y) newGrabbedTiledRectY = newGrabbedTiledRectY + screenTopGap - windowGap / 2; // If resizing on the E side, you can simply rely on get_frame_rect's // new width else x2 should stick to where it was (manual calc due // special cases like gnome-terminal) const isResizingE = (grabOp & Meta.GrabOp.RESIZING_E) > 1; const newGrabbedTiledRectWidth = isResizingE ? grabbedsNewRect.width + windowGap / 2 + (workArea.x === newGrabbedTiledRectX ? screenLeftGap : windowGap / 2) : window.tiledRect.x2 - newGrabbedTiledRectX; // Same principal applies to the height and resizing on the S side const isResizingS = (grabOp & Meta.GrabOp.RESIZING_S) > 1; const newGrabbedTiledRectHeight = isResizingS ? grabbedsNewRect.height + windowGap / 2 + (workArea.y === newGrabbedTiledRectY ? screenTopGap : windowGap / 2) : window.tiledRect.y2 - newGrabbedTiledRectY; const grabbedsOldTiledRect = window.tiledRect; window.tiledRect = new Rect( newGrabbedTiledRectX, newGrabbedTiledRectY, newGrabbedTiledRectWidth, newGrabbedTiledRectHeight ); Twm.saveTileState(window); // Now calculate the new tiledRects for the windows, which were resized // along the window based on the diff of the window's tiledRect pre // and after the grab. const tiledRectDiffX = window.tiledRect.x - grabbedsOldTiledRect.x; const tiledRectDiffY = window.tiledRect.y - grabbedsOldTiledRect.y; const tiledRectDiffWidth = window.tiledRect.width - grabbedsOldTiledRect.width; const tiledRectDiffHeight = window.tiledRect.height - grabbedsOldTiledRect.height; this._resizeOps.forEach((resizeOp, win) => { if (win === window) return; if (resizeOp.side & Side.SAME_H) { win.tiledRect.x += tiledRectDiffX; win.tiledRect.width += tiledRectDiffWidth; } else if (resizeOp.side & Side.OPPOSING_H) { win.tiledRect.x += isResizingE ? tiledRectDiffWidth : 0; win.tiledRect.width -= tiledRectDiffWidth; } if (resizeOp.side & Side.SAME_V) { win.tiledRect.y += tiledRectDiffY; win.tiledRect.height += tiledRectDiffHeight; } else if (resizeOp.side & Side.OPPOSING_V) { win.tiledRect.y += isResizingS ? tiledRectDiffHeight : 0; win.tiledRect.height -= tiledRectDiffHeight; } Twm.saveTileState(win); }); this._preGrabRects.clear(); this._resizeOps.clear(); } _onResizing(resizedWindow, grabOpV, grabOpH) { this._resizeOps.forEach((resizeOp, window) => { const rectV = this._getPassiveResizedRect(grabOpV, resizedWindow, window, resizeOp.side & Side.SAME_V, resizeOp.side & Side.OPPOSING_V); const rectH = this._getPassiveResizedRect(grabOpH, resizedWindow, window, resizeOp.side & Side.SAME_H, resizeOp.side & Side.OPPOSING_H); if (rectV && rectH) window.move_resize_frame(false, rectH[0], rectV[1], rectH[2], rectV[3]); else if (rectV) window.move_resize_frame(false, ...rectV); else if (rectH) window.move_resize_frame(false, ...rectH); }); } // Gets the rect for the non-grabbed window adapted to the resized // grabbed window *but* only adapted for 1 side (either vertically // or horizontally) at a time based on grabOp _getPassiveResizedRect(grabOp, resizedWindow, window, resizeOnSameSide, resizeOnOpposingSide) { if (!grabOp) return null; if (!resizeOnSameSide && !resizeOnOpposingSide) return null; const resizedRect = new Rect(resizedWindow.get_frame_rect()); const wRect = new Rect(window.get_frame_rect()); const preGrabRect = this._preGrabRects.get(window); const windowGap = Util.getScaledGap('window-gap', window.get_monitor()); switch (grabOp) { case Meta.GrabOp.RESIZING_N: return resizeOnSameSide ? [wRect.x, resizedRect.y, wRect.width, preGrabRect.y2 - resizedRect.y] : [wRect.x, wRect.y, wRect.width, resizedRect.y - wRect.y - windowGap]; case Meta.GrabOp.RESIZING_S: return resizeOnSameSide ? [wRect.x, wRect.y, wRect.width, resizedRect.y2 - preGrabRect.y] : [wRect.x, resizedRect.y2 + windowGap, wRect.width, preGrabRect.y2 - resizedRect.y2 - windowGap]; case Meta.GrabOp.RESIZING_W: return resizeOnSameSide ? [resizedRect.x, wRect.y, preGrabRect.x2 - resizedRect.x, wRect.height] : [wRect.x, wRect.y, resizedRect.x - wRect.x - windowGap, wRect.height]; case Meta.GrabOp.RESIZING_E: return resizeOnSameSide ? [wRect.x, wRect.y, resizedRect.x2 - preGrabRect.x, wRect.height] : [resizedRect.x2 + windowGap, wRect.y, preGrabRect.x2 - resizedRect.x2 - windowGap, wRect.height]; } } /** * Gets the windows which should be resized for the 'individual' resize mode. * That means all windows that directly (or transitively) border the window * being resized at the resized edge. * * @param {Meta.Window} window the window that is actively resized. * @param {Meta.Window[]} tileGroup the top tile group. * @param {Meta.GrabOp} grabOp * @returns {Meta.Window[]} all windows that will resize using the individual resize mode */ _getWindowsForIndividualResize(window, tileGroup, grabOp) { // Resizes on the same side as the one being resized by the user. // Starts with the window that is actively being resized by the user. const sameSide = [window]; // Resizes on the opposite side as the one being resized by the user const oppositeSide = []; const resizeIsNOrW = [Meta.GrabOp.RESIZING_N, Meta.GrabOp.RESIZING_W].includes(grabOp); const orientation = [Meta.GrabOp.RESIZING_N, Meta.GrabOp.RESIZING_S].includes(grabOp) ? Orientation.V : Orientation.H; // Checks if the w1 and w2 border each other at a certain edge. const borders = (w1, w2, w1IsAfterW2) => { const [start, end] = orientation === Orientation.H ? ['x', 'x2'] : ['y', 'y2']; const overlap = orientation === Orientation.H ? 'vertOverlap' : 'horizOverlap'; if (w1IsAfterW2) { return w1.tiledRect[start] === w2.tiledRect[end] && w1.tiledRect[overlap](w2.tiledRect); } else { return w1.tiledRect[end] === w2.tiledRect[start] && w1.tiledRect[overlap](w2.tiledRect); } }; /** * @param {Meta.Window[]} uncheckedWindows windows yet to be checked. * @param {Meta.Window[]} checkingWindows windows, which the bordering windows * are searched for. It initially only starts with the window that is * actively resized by the user. * @param {Meta.Window[]} borderingWindows the windows that border the * checkingWindows on the resized edge. * @param {boolean} sideDeterminant determines which edge the * bordering is checked on. It's the relation of the checkingWindows * to the actively resized windows. */ const findBorderingWindows = (uncheckedWindows, checkingWindows, borderingWindows, sideDeterminant) => { const oldCount = borderingWindows.length; checkingWindows.forEach(w => { uncheckedWindows.forEach(unchecked => { if (borders(w, unchecked, sideDeterminant)) borderingWindows.push(unchecked); }); }); if (oldCount !== borderingWindows.length) { // Find the bordering windows for the newly added windows by // flipping the checkingWindows and borderingWindows arrays as well as // the side that is checked with the borders function. findBorderingWindows( uncheckedWindows.filter(w => !borderingWindows.includes(w)), borderingWindows, checkingWindows, !sideDeterminant ); } }; findBorderingWindows(tileGroup, sameSide, oppositeSide, resizeIsNOrW); return [...sameSide, ...oppositeSide]; } } /** * Saves information on which side a window will resize to complement the * grabbed window. A non-grabbed window can resize on the 'same side', on * the 'opposing side' or not at all. For ex.: Resizing the top-left quarter * on the E side means the bottom-left quarter resizes on the same side (E) * and the top / bottom-right quarters resize on the opposing side (W). If * the bottom window wasn't quartered but instead had its width equal the * workArea.width, then it wouldn't resize at all. */ const ResizeOp = class ResizeOp { /** * @param {number} side */ constructor(side) { this.side = side; } /** * @param {boolean} resizeOnSameSideV * @param {boolean} resizeOnOpposingSideV * @param {boolean} resizeOnSameSideH * @param {boolean} resizeOnOpposingSideH * @returns {ResizeOp|null} */ static createResizeOp(resizeOnSameSideV, resizeOnOpposingSideV, resizeOnSameSideH, resizeOnOpposingSideH) { let verticalResizeSide = Side.NONE; let horizontalResizeSide = Side.NONE; if (resizeOnSameSideV) verticalResizeSide = Side.SAME_V; else if (resizeOnOpposingSideV) verticalResizeSide = Side.OPPOSING_V; if (resizeOnSameSideH) horizontalResizeSide = Side.SAME_H; else if (resizeOnOpposingSideH) horizontalResizeSide = Side.OPPOSING_H; const resizeSide = verticalResizeSide | horizontalResizeSide; return resizeSide ? new ResizeOp(resizeSide) : null; } }; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js000066400000000000000000000656751500466572600314220ustar00rootroot00000000000000import { Clutter, GObject, Meta, St } from '../dependencies/gi.js'; import { _, Main } from '../dependencies/shell.js'; import { Direction, Orientation, Settings } from '../common.js'; import { Rect, Util } from './utility.js'; import { TilingWindowManager as Twm } from './tilingWindowManager.js'; const SCALE_SIZE = 100; const Modes = { DEFAULT: 1, SWAP: 2, RESIZE: 4, MOVE: 8, CLOSE: 16 }; /** * Classes for the 'Tile Editing Mode'. A mode to manage your tiled windows * with your keyboard (and only the keyboard). The Tile Editor gets instanced * as soon as the keyboard shortcut is activated. The Handler classes are * basically modes / states for the Tile Editor each with a 'on key press' and * 'on key released' function. */ export const TileEditor = GObject.registerClass( class TileEditingMode extends St.Widget { _init() { super._init({ reactive: true }); this._haveModal = false; // The windows managed by the Tile Editor, that means the tiled windows // that aren't overlapped by other windows; in other words: the top tile Group this._windows = []; // Indicate the active selection by the user. Added to `this`. this._selectIndicator = null; this._mode = Modes.DEFAULT; // Handler of keyboard events depending on the mode. this._keyHandler = null; Main.uiGroup.add_child(this); this.connect('key-press-event', (__, event) => this._onKeyPressEvent(event)); } open() { this._windows = Twm.getTopTileGroup(); const grab = Main.pushModal(this); // We expect at least a keyboard grab here if ((grab.get_seat_state() & Clutter.GrabState.KEYBOARD) === 0) { Main.popModal(grab); return false; } this._grab = grab; this._haveModal = true; const openWindows = Twm.getWindows(); if (!openWindows.length || !this._windows.length) { // Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. const msg = _("Can't enter 'Tile Editing Mode', if no tiled window is visible."); Main.notify('Tiling Assistant', msg); this.close(); return; } this.monitor = this._windows[0].get_monitor(); const display = global.display.get_monitor_geometry(this.monitor); this.set_position(display.x, display.y); this.set_size(display.width, display.height); // Enter initial state. this._mode = Modes.DEFAULT; this._keyHandler = new DefaultKeyHandler(this); // The windows may not be at the foreground. They just weren't // overlapping other windows. So raise the entire tile group. this._windows.forEach(w => { if (w.raise_and_make_recent_on_workspace) w.raise_and_make_recent_on_workspace(global.workspace_manager.get_active_workspace()); else w.raise_and_make_recent(); }); // Create the active selection indicator. const window = this._windows[0]; const params = { style_class: 'tile-preview' }; this._selectIndicator = new Indicator(window.tiledRect, this.monitor, params); this._selectIndicator.focus(window.tiledRect, window); this.add_child(this._selectIndicator); } close() { if (this._haveModal) { Main.popModal(this._grab); this._haveModal = false; } this._windows = []; this._keyHandler = null; // this._selectIndicator may be undefined, if Tile Editing Mode is // left as soon as it's entered (e. g. when there's no tile group). this._selectIndicator?.window?.activate(global.get_current_time()); this._selectIndicator?.ease({ x: this._selectIndicator.x + SCALE_SIZE / 2, y: this._selectIndicator.y + SCALE_SIZE / 2, width: this._selectIndicator.width - SCALE_SIZE, height: this._selectIndicator.height - SCALE_SIZE, opacity: 0, duration: 150, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => this.destroy() }) ?? this.destroy(); } vfunc_button_press_event() { this._keyHandler.prepareLeave(); this.close(); } async _onKeyPressEvent(keyEvent) { const mods = keyEvent.get_state(); let newMode; // Swap windows if (mods & Clutter.ModifierType.CONTROL_MASK) newMode = Modes.SWAP; // Move group to different workspace / monitor else if (mods & Clutter.ModifierType.SHIFT_MASK) newMode = Modes.MOVE; // Resize windows else if (mods & Clutter.ModifierType.MOD4_MASK) newMode = Modes.RESIZE; // Default keys else newMode = Modes.DEFAULT; // First switch mode, if a new mod is pressed. if (newMode !== this._mode) this._switchMode(newMode); // Handle the key press and get mode depending on that. newMode = await this._keyHandler.handleKeyPress(keyEvent); if (newMode && newMode !== this._mode) this._switchMode(newMode); } vfunc_key_release_event(keyEvent) { const newMode = this._keyHandler.handleKeyRelease(keyEvent); if (newMode && newMode !== this._mode) this._switchMode(newMode); } _switchMode(newMode) { if (!newMode) return; this._mode = newMode; this._keyHandler.prepareLeave(); switch (newMode) { case Modes.DEFAULT: this._keyHandler = new DefaultKeyHandler(this); break; case Modes.SWAP: this._keyHandler = new SwapKeyHandler(this); break; case Modes.MOVE: this._keyHandler = new MoveKeyHandler(this); break; case Modes.RESIZE: this._keyHandler = new ResizeKeyHandler(this); break; case Modes.CLOSE: this.close(); } } }); /** * Indicate the user selection or other stuff. */ const Indicator = GObject.registerClass(class TileEditingModeIndicator extends St.Widget { /** * @param {string} widgetParams * @param {Rect} rect the final rect / pos of the indicator * @param {number} monitor */ _init(rect, monitor, widgetParams = {}) { // Start from a scaled down position. super._init({ ...widgetParams, x: rect.x + SCALE_SIZE / 2, y: rect.y + SCALE_SIZE / 2, width: rect.width - SCALE_SIZE, height: rect.height - SCALE_SIZE, opacity: 0 }); this.rect = null; this.window = null; this._monitor = monitor; } /** * Animate the indicator to a specific position. * * @param {Rect} rect the position the indicator will animate to. * @param {Meta.Window|null} window the window at `rect`'s position. */ focus(rect, window = null) { const display = global.display.get_monitor_geometry(this._monitor); const activeWs = global.workspace_manager.get_active_workspace(); const workArea = new Rect(activeWs.get_work_area_for_monitor(this._monitor)); // Adjusted for window / screen gaps const { x, y, width, height } = rect.addGaps(workArea, this._monitor); this.ease({ x: x - display.x, y: y - display.y, width, height, opacity: 255, duration: 150, mode: Clutter.AnimationMode.EASE_OUT_QUAD }); this.rect = rect; this.window = window; } }); /** * Base class for other keyboard handlers and the default handler itself. * * @param {TileEditingMode} tileEditor */ const DefaultKeyHandler = class DefaultKeyHandler { constructor(tileEditor) { this._tileEditor = tileEditor; } /** * Automatically called when leaving a mode. */ prepareLeave() { } /** * Automatically called on a keyEvent. * * @param {number} keyEvent * @returns {Modes} The mode to enter after the event was handled. */ async handleKeyPress(keyEvent) { const keyVal = keyEvent.get_key_symbol(); // [Directions] to move focus with WASD, hjkl or arrow keys const dir = Util.getDirection(keyVal); if (dir) { this._focusInDir(dir); // [E]xpand to fill the available space } else if (keyVal === Clutter.KEY_e || keyVal === Clutter.KEY_E) { const window = this._selectIndicator.window; if (!window) return Modes.DEFAULT; const tiledRect = this._windows.map(w => w.tiledRect); const tileRect = Twm.getBestFreeRect(tiledRect, { currRect: window.tiledRect }); if (window.tiledRect.equal(tileRect)) return Modes.DEFAULT; const workArea = window.get_work_area_current_monitor(); const maximize = tileRect.equal(workArea); if (maximize && this._windows.length > 1) return Modes.DEFAULT; Twm.tile(window, tileRect, { openTilingPopup: false }); if (maximize) return Modes.CLOSE; this._selectIndicator.focus(window.tiledRect, window); // [C]ycle through halves of the available space around the window } else if (keyVal === Clutter.KEY_c || keyVal === Clutter.KEY_C) { const window = this._selectIndicator.window; if (!window) return Modes.DEFAULT; const tiledRects = this._windows.map(w => w.tiledRect); const fullRect = Twm.getBestFreeRect(tiledRects, { currRect: window.tiledRect }); const topHalf = fullRect.getUnitAt(0, fullRect.height / 2, Orientation.H); const rightHalf = fullRect.getUnitAt(1, fullRect.width / 2, Orientation.V); const bottomHalf = fullRect.getUnitAt(1, fullRect.height / 2, Orientation.H); const leftHalf = fullRect.getUnitAt(0, fullRect.width / 2, Orientation.V); const rects = [topHalf, rightHalf, bottomHalf, leftHalf]; const currIdx = rects.findIndex(r => r.equal(window.tiledRect)); const newIndex = (currIdx + 1) % 4; Twm.tile(window, rects[newIndex], { openTilingPopup: false }); this._selectIndicator.focus(window.tiledRect, window); // [Q]uit a window } else if (keyVal === Clutter.KEY_q || keyVal === Clutter.KEY_Q) { const window = this._selectIndicator.window; if (!window) return Modes.DEFAULT; this._windows.splice(this._windows.indexOf(window), 1); window.delete(global.get_current_time()); const newWindow = this._windows[0]; if (!newWindow) return Modes.CLOSE; this._selectIndicator.focus(newWindow.tiledRect, newWindow); // [R]estore a window's size } else if (keyVal === Clutter.KEY_r || keyVal === Clutter.KEY_R) { const window = this._selectIndicator.window; if (!window) return Modes.DEFAULT; const selectedRect = window.tiledRect.copy(); this._windows.splice(this._windows.indexOf(window), 1); Twm.untile(window); if (!this._windows.length) return Modes.CLOSE; // Re-raise tile group, so it isn't below the just-untiled window if (this._windows[0].raise_and_make_recent_on_workspace) this._windows[0].raise_and_make_recent_on_workspace(global.workspace_manager.get_active_workspace()); else this._windows[0].raise_and_make_recent(); this._selectIndicator.focus(selectedRect, null); // [Enter] / [Esc]ape Tile Editing Mode } else if (keyVal === Clutter.KEY_Escape || keyVal === Clutter.KEY_Return) { return Modes.CLOSE; // [Space] to activate the Tiling Popup } else if (keyVal === Clutter.KEY_space) { const allWs = Settings.getBoolean('tiling-popup-all-workspace'); const openWindows = Twm.getWindows(allWs).filter(w => !this._windows.includes(w)); const TilingPopup = await import('./tilingPopup.js'); const tilingPopup = new TilingPopup.TilingSwitcherPopup( openWindows, this._selectIndicator.rect, false ); if (!tilingPopup.show(this._windows)) { tilingPopup.destroy(); return Modes.DEFAULT; } tilingPopup.connect('closed', (popup, canceled) => { if (canceled) return; const { tiledWindow } = popup; const replaced = this._windows.findIndex(w => w.tiledRect.equal(tiledWindow.tiledRect)); replaced !== -1 && this._windows.splice(replaced, 1); // Create the new tile group to allow 1 window to be part of multiple tile groups Twm.updateTileGroup([tiledWindow, ...this._windows]); this._windows.unshift(tiledWindow); this._selectIndicator.focus(tiledWindow.tiledRect, tiledWindow); }); } return Modes.DEFAULT; } /** * Automatically called on a keyEvent. * * @param {number} keyEvent * @returns {Modes|undefined} The mode to enter after the event was handled. */ handleKeyRelease() { return undefined; } /** * Move the the selection indicator towards direction of `dir`. * * @param {Direction} dir */ _focusInDir(dir) { const activeWs = global.workspace_manager.get_active_workspace(); const workArea = new Rect(activeWs.get_work_area_for_monitor(this._tileEditor.monitor)); const tiledRects = this._windows.map(w => w.tiledRect); const screenRects = tiledRects.concat(workArea.minus(tiledRects)); const nearestRect = this._selectIndicator.rect.getNeighbor(dir, screenRects); if (!nearestRect) return; const newWindow = this._windows.find(w => w.tiledRect.equal(nearestRect)); this._selectIndicator.focus(newWindow?.tiledRect ?? nearestRect, newWindow); } get _windows() { return this._tileEditor._windows; } get _selectIndicator() { return this._tileEditor._selectIndicator; } }; /** * Move the selected window to a different position. If there is a window at * the new position, the 2 windows will swap their positions. * * @param {TileEditingMode} tileEditor */ const SwapKeyHandler = class SwapKeyHandler extends DefaultKeyHandler { constructor(tileEditor) { super(tileEditor); // Create an 'anchor indicator' to indicate the window that will be swapped const color = this._selectIndicator.get_theme_node().get_background_color(); const { red, green, blue, alpha } = color; this._anchorIndicator = new Indicator(this._selectIndicator.rect, tileEditor.monitor, { style: `background-color: rgba(${red}, ${green}, ${blue}, ${alpha / 255})` }); this._anchorIndicator.focus(this._selectIndicator.rect, this._selectIndicator.window); this._tileEditor.add_child(this._anchorIndicator); } prepareLeave() { this._anchorIndicator.destroy(); } handleKeyPress(keyEvent) { const direction = Util.getDirection(keyEvent.get_key_symbol()); // [Directions] to choose a window to swap with WASD, hjkl or arrow keys if (direction) this._focusInDir(direction); // [Esc]ape Tile Editing Mode else if (keyEvent.get_key_symbol() === Clutter.KEY_Escape) return Modes.DEFAULT; return Modes.SWAP; } handleKeyRelease(keyEvent) { const keyVal = keyEvent.get_key_symbol(); const ctrlKeys = [Clutter.KEY_Control_L, Clutter.KEY_Control_R]; if (ctrlKeys.includes(keyVal)) { this._swap(); return Modes.DEFAULT; } return Modes.SWAP; } _swap() { if (this._anchorIndicator.window) { Twm.tile(this._anchorIndicator.window, this._selectIndicator.rect, { openTilingPopup: false }); } if (this._selectIndicator.window) { Twm.tile(this._selectIndicator.window, this._anchorIndicator.rect, { openTilingPopup: false }); } this._selectIndicator.focus(this._selectIndicator.rect, this._anchorIndicator.window); } }; /** * Move the tile group to a different workspace / monitor. * * @param {TileEditingMode} tileEditor */ const MoveKeyHandler = class MoveKeyHandler extends DefaultKeyHandler { handleKeyPress(keyEvent) { const direction = Util.getDirection(keyEvent.get_key_symbol()); const moveWorkspace = keyEvent.get_state() & Clutter.ModifierType.MOD1_MASK; // [Directions] to move the tile group if (direction) { // To new workspace if (moveWorkspace) { let metaDir = Meta.MotionDirection.UP; if (direction === Direction.N) metaDir = Meta.MotionDirection.UP; else if (direction === Direction.S) metaDir = Meta.MotionDirection.DOWN; else if (direction === Direction.W) metaDir = Meta.MotionDirection.LEFT; else if (direction === Direction.E) metaDir = Meta.MotionDirection.RIGHT; const activeWs = global.workspace_manager.get_active_workspace(); const newWs = activeWs.get_neighbor(metaDir); if (activeWs === newWs) return Modes.MOVE; Twm.moveGroupToWorkspace(this._tileEditor._windows, newWs); // To new monitor } else { let metaDir = Meta.DisplayDirection.UP; if (direction === Direction.N) metaDir = Meta.DisplayDirection.UP; else if (direction === Direction.S) metaDir = Meta.DisplayDirection.DOWN; else if (direction === Direction.W) metaDir = Meta.DisplayDirection.LEFT; else if (direction === Direction.E) metaDir = Meta.DisplayDirection.RIGHT; // get_current_monitor isn't accurate for our case const currMonitor = this._tileEditor.monitor; const newMonitor = global.display.get_monitor_neighbor_index(currMonitor, metaDir); if (newMonitor === -1) return Modes.MOVE; Twm.moveGroupToMonitor(this._tileEditor._windows, currMonitor, newMonitor); } return Modes.CLOSE; // [Esc] to return to default mode } else if (keyEvent.get_key_symbol() === Clutter.KEY_Escape) { return Modes.DEFAULT; } return Modes.MOVE; } }; /** * Handler to resize the highlighted window. * * @param {TileEditor} tileEditor */ const ResizeKeyHandler = class ResizeKeyHandler extends DefaultKeyHandler { constructor(tileEditor) { super(tileEditor); // The edge that is currently being resized. this._currEdge = null; this._resizeSideIndicator = null; } prepareLeave() { this._resizeSideIndicator?.destroy(); } handleKeyPress(keyEvent) { // [Directions] to resize with WASD, hjkl or arrow keys const direction = Util.getDirection(keyEvent.get_key_symbol()); if (direction) { const window = this._selectIndicator.window; if (!window) return Modes.DEFAULT; // First call: Go to an edge. if (!this._currEdge) { this._currEdge = direction; this._createResizeIndicator(); return Modes.RESIZE; // Change resize orientation from H to V } else if ([Direction.N, Direction.S].includes(this._currEdge)) { if ([Direction.W, Direction.E].includes(direction)) { this._currEdge = direction; this._createResizeIndicator(); return Modes.RESIZE; } // Change resize orientation from V to H } else if ([Direction.W, Direction.E].includes(this._currEdge)) { if ([Direction.N, Direction.S].includes(direction)) { this._currEdge = direction; this._createResizeIndicator(); return Modes.RESIZE; } } this._resize(window, direction); // Update the selection indicator. this._selectIndicator.focus(window.tiledRect, window); // Update resize side indicator this._resizeSideIndicator.updatePos(window.tiledRect); // [Esc]ape Tile Editing Mode } else if (keyEvent.get_key_symbol() === Clutter.KEY_Escape) { return Modes.CLOSE; } return Modes.RESIZE; } handleKeyRelease(keyEvent) { const keyVal = keyEvent.get_key_symbol(); const superKeys = [Clutter.KEY_Super_L, Clutter.KEY_Super_R]; return superKeys.includes(keyVal) ? Modes.DEFAULT : Modes.RESIZE; } _resize(window, keyDir) { // Rect, which is being resized by the user. But it still has // its original / pre-resize dimensions const resizedRect = window.tiledRect; const workArea = new Rect(window.get_work_area_current_monitor()); let resizeAmount = 50; // Limit resizeAmount to the workArea if (this._currEdge === Direction.N && keyDir === Direction.N) resizeAmount = Math.min(resizeAmount, resizedRect.y - workArea.y); else if (this._currEdge === Direction.S && keyDir === Direction.S) resizeAmount = Math.min(resizeAmount, workArea.y2 - resizedRect.y2); else if (this._currEdge === Direction.W && keyDir === Direction.W) resizeAmount = Math.min(resizeAmount, resizedRect.x - workArea.x); else if (this._currEdge === Direction.E && keyDir === Direction.E) resizeAmount = Math.min(resizeAmount, workArea.x2 - resizedRect.x2); if (resizeAmount <= 0) return; // Function to update the passed rect by the resizeAmount depending on // the edge that is resized. Some windows will resize on the same edge // as the one the user is resizing. Other windows will resize on the // opposite edge. const updateRectSize = (rect, resizeOnEdge) => { const growDir = keyDir === resizeOnEdge ? 1 : -1; switch (resizeOnEdge) { case Direction.N: rect.y -= resizeAmount * growDir; // falls through case Direction.S: rect.height += resizeAmount * growDir; break; case Direction.W: rect.x -= resizeAmount * growDir; // falls through case Direction.E: rect.width += resizeAmount * growDir; } }; // Actually resize the windows here. this._windows.forEach(w => { // The window, which is resized by the user, is included in this. if (this._isSameSide(resizedRect, w.tiledRect)) { const newRect = w.tiledRect.copy(); updateRectSize(newRect, this._currEdge); Twm.tile(w, newRect, { openTilingPopup: false }); } else if (this._isOppositeSide(resizedRect, w.tiledRect)) { const newRect = w.tiledRect.copy(); updateRectSize(newRect, Direction.opposite(this._currEdge)); Twm.tile(w, newRect, { openTilingPopup: false }); } }); } _isOppositeSide(rect1, rect2) { switch (this._currEdge) { case Direction.N: return rect1.y === rect2.y2; case Direction.S: return rect1.y2 === rect2.y; case Direction.W: return rect1.x === rect2.x2; case Direction.E: return rect1.x2 === rect2.x; } return false; } _isSameSide(rect1, rect2) { switch (this._currEdge) { case Direction.N: return rect1.y === rect2.y; case Direction.S: return rect1.y2 === rect2.y2; case Direction.W: return rect1.x === rect2.x; case Direction.E: return rect1.x2 === rect2.x2; } return false; } _createResizeIndicator() { this._resizeSideIndicator?.destroy(); this._resizeSideIndicator = new ResizeSideIndicator( this._currEdge, this._selectIndicator.rect); Main.uiGroup.add_child(this._resizeSideIndicator); } }; const ResizeSideIndicator = GObject.registerClass( class ResizeSideIndicator extends St.Widget { _init(edge, activeRect) { const [width, height] = [Direction.N, Direction.S].includes(edge) ? [200, 20] : [20, 200]; super._init({ width, height, opacity: 0, style: 'background-color: black;\ border-radius: 999px;' }); this._edge = edge; this._moveDist = 100; this.updatePos(activeRect); // Inner pill const innerWidth = this.width < this.height ? 4 : 75; const innerHeight = this.width < this.height ? 75 : 4; this.add_child(new St.Widget({ x: this.width / 2 - innerWidth / 2, y: this.height / 2 - innerHeight / 2, width: innerWidth, height: innerHeight, style: 'background-color: #ebebeb;\ border-radius: 999px;' })); } destroy() { this.ease({ opacity: 0, duration: 100, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => super.destroy() }); } updatePos(rect) { let x, y; switch (this._edge) { case Direction.N: x = rect.center.x - this.width / 2; y = rect.y - this.height / 2; break; case Direction.S: x = rect.center.x - this.width / 2; y = rect.y2 - this.height / 2; break; case Direction.W: x = rect.x - this.width / 2; y = rect.center.y - this.height / 2; break; case Direction.E: x = rect.x2 - this.width / 2; y = rect.center.y - this.height / 2; } this.ease({ x, y, opacity: 255, duration: 150, mode: Clutter.AnimationMode.EASE_OUT_QUAD }); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/tilingPopup.js000066400000000000000000000332211500466572600306440ustar00rootroot00000000000000import { Clutter, GObject, Meta, St } from '../dependencies/gi.js'; import { Main } from '../dependencies/shell.js'; import * as SwitcherPopup from '../dependencies/unexported/switcherPopup.js'; import { Direction, Orientation } from '../common.js'; import { Util } from './utility.js'; import { TilingWindowManager as Twm } from './tilingWindowManager.js'; import * as AltTab from './altTab.js'; /** * Classes for the Tiling Popup, which opens when tiling a window * and there is free screen space to fill with other windows. * Mostly based on GNOME's altTab.js */ export const TilingSwitcherPopup = GObject.registerClass({ Signals: { // Bool indicates whether the Tiling Popup was canceled // (or if a window was tiled with this popup) 'closed': { param_types: [GObject.TYPE_BOOLEAN] } } }, class TilingSwitcherPopup extends AltTab.TilingAppSwitcherPopup { /** * @param {Meta.Window[]} openWindows an array of Meta.Windows, which this * popup offers to tile. * @param {Rect} freeScreenRect the Rect, which the popup will tile a window * to. The popup will be centered in this rect. * @param {boolean} allowConsecutivePopup allow the popup to create another * Tiling Popup, if there is still unambiguous free screen space after * this popup tiled a window. * @param {boolean} skipAnim */ _init(openWindows, freeScreenRect, allowConsecutivePopup = true, skipAnim = false) { this._freeScreenRect = freeScreenRect; this._shadeBG = null; this._monitor = -1; SwitcherPopup.SwitcherPopup.prototype._init.call(this); this._thumbnails = null; this._thumbnailTimeoutId = 0; this._currentWindow = -1; this.thumbnailsVisible = false; // The window, which was tiled with the Tiling Popup after it's closed // or null, if the popup was closed with tiling a window this.tiledWindow = null; this._allowConsecutivePopup = allowConsecutivePopup; this._skipAnim = skipAnim; this._switcherList = new TSwitcherList(this, openWindows); this._items = this._switcherList.icons; // Destroy popup when touching outside of popup this.connect('touch-event', () => { if (Meta.is_wayland_compositor()) this.fadeAndDestroy(); return Clutter.EVENT_PROPAGATE; }); } /** * @param {Array} tileGroup an array of Meta.Windows. When the popup * appears it will shade the background. These windows will won't * be affected by that. * @returns if the popup was successfully shown. */ show(tileGroup) { this._monitor = tileGroup[0]?.get_monitor() ?? global.display.get_current_monitor(); if (!this._items.length) return false; const grab = Main.pushModal(this); // We expect at least a keyboard grab here if ((grab.get_seat_state() & Clutter.GrabState.KEYBOARD) === 0) { Main.popModal(grab); return false; } this._grab = grab; this._haveModal = true; this._switcherList.connect('item-activated', this._itemActivated.bind(this)); this._switcherList.connect('item-entered', this._itemEntered.bind(this)); this._switcherList.connect('item-removed', this._itemRemoved.bind(this)); this.add_child(this._switcherList); // Need to force an allocation so we can figure out // whether we need to scroll when selecting this.visible = true; this.get_allocation_box(); this._select(0); Main.osdWindowManager.hideAll(); this._shadeBackground(tileGroup); this.opacity = 0; this.ease({ opacity: 255, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD }); return true; } _shadeBackground(tileGroup) { const tiledWindow = tileGroup[0]; const activeWs = global.workspace_manager.get_active_workspace(); const workArea = activeWs.get_work_area_for_monitor(this._monitor); this._shadeBG = new St.Widget({ style: 'background-color : black', x: workArea.x, y: workArea.y, width: workArea.width, height: workArea.height, opacity: 0 }); global.window_group.add_child(this._shadeBG); this._shadeBG.ease({ opacity: 180, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD }); if (!tiledWindow) return; // Clones to correctly shade the background for consecutive tiling. for (let i = 1; i < tileGroup.length; i++) { const wActor = tileGroup[i].get_compositor_private(); const clone = new Clutter.Clone({ source: wActor, x: wActor.x, y: wActor.y }); global.window_group.add_child(clone); wActor.hide(); this.connect('destroy', () => { wActor.show(); clone.destroy(); }); } const tActor = tiledWindow.get_compositor_private(); global.window_group.set_child_above_sibling(tActor, this._shadeBG); } vfunc_allocate(box) { this.set_allocation(box); const freeScreenRect = this._freeScreenRect; const childBox = new Clutter.ActorBox(); const leftPadding = this.get_theme_node().get_padding(St.Side.LEFT); const rightPadding = this.get_theme_node().get_padding(St.Side.RIGHT); const hPadding = leftPadding + rightPadding; const [, childNaturalHeight] = this._switcherList.get_preferred_height( freeScreenRect.width - hPadding); const [, childNaturalWidth] = this._switcherList.get_preferred_width(childNaturalHeight); childBox.x1 = Math.max(freeScreenRect.x + leftPadding, freeScreenRect.x + Math.floor((freeScreenRect.width - childNaturalWidth) / 2)); childBox.x2 = Math.min(freeScreenRect.x2 - rightPadding, childBox.x1 + childNaturalWidth); childBox.y1 = freeScreenRect.y + Math.floor((freeScreenRect.height - childNaturalHeight) / 2); childBox.y2 = childBox.y1 + childNaturalHeight; this._switcherList.allocate(childBox); if (this._thumbnails) { const cbox = this._switcherList.get_allocation_box(); const monitor = global.display.get_monitor_geometry(this._monitor); const leftPadd = this.get_theme_node().get_padding(St.Side.LEFT); const rightPadd = this.get_theme_node().get_padding(St.Side.RIGHT); const bottomPadding = this.get_theme_node().get_padding(St.Side.BOTTOM); const hPadd = leftPadd + rightPadd; const icon = this._items[this._selectedIndex]; const [posX] = icon.get_transformed_position(); const thumbnailCenter = posX + icon.width / 2; const [, cNatWidth] = this._thumbnails.get_preferred_width(-1); cbox.x1 = Math.max(monitor.x + leftPadd, Math.floor(thumbnailCenter - cNatWidth / 2) ); if (cbox.x1 + cNatWidth > monitor.x + monitor.width - hPadd) { const offset = cbox.x1 + cNatWidth - monitor.width + hPadd; cbox.x1 = Math.max(monitor.x + leftPadd, cbox.x1 - offset - hPadd); } const spacing = this.get_theme_node().get_length('spacing'); cbox.x2 = cbox.x1 + cNatWidth; if (cbox.x2 > monitor.x + monitor.width - rightPadd) cbox.x2 = monitor.x + monitor.width - rightPadd; cbox.y1 = this._switcherList.allocation.y2 + spacing; this._thumbnails.addClones(monitor.y + monitor.height - bottomPadding - cbox.y1); const [, cNatHeight] = this._thumbnails.get_preferred_height(-1); cbox.y2 = cbox.y1 + cNatHeight; this._thumbnails.allocate(cbox); } } vfunc_button_press_event(buttonEvent) { const btn = buttonEvent.get_button(); if (btn === Clutter.BUTTON_MIDDLE || btn === Clutter.BUTTON_SECONDARY) { this._finish(global.get_current_time()); return Clutter.EVENT_PROPAGATE; } return super.vfunc_button_press_event(buttonEvent); } _keyPressHandler(keysym) { const moveUp = Util.isDirection(keysym, Direction.N); const moveDown = Util.isDirection(keysym, Direction.S); const moveLeft = Util.isDirection(keysym, Direction.W); const moveRight = Util.isDirection(keysym, Direction.E); if (this._thumbnailsFocused) { if (moveLeft) this._select(this._selectedIndex, this._previousWindow()); else if (moveRight) this._select(this._selectedIndex, this._nextWindow()); else if (moveUp || moveDown) this._select(this._selectedIndex, null, true); else return Clutter.EVENT_PROPAGATE; } else if (moveLeft) { this._select(this._previous()); } else if (moveRight) { this._select(this._next()); } else if (moveDown || moveUp) { this._select(this._selectedIndex, 0); } else { return Clutter.EVENT_PROPAGATE; } return Clutter.EVENT_STOP; } _windowActivated(thumbnailSwitcher, n) { const window = this._items[this._selectedIndex].cachedWindows[n]; this._tileWindow(window); this.fadeAndDestroy(); } _finish(timestamp) { const appIcon = this._items[this._selectedIndex]; const window = appIcon.cachedWindows[Math.max(0, this._currentWindow)]; this._tileWindow(window); SwitcherPopup.SwitcherPopup.prototype._finish.call(this, timestamp); } fadeAndDestroy() { if (this._alreadyDestroyed) return; this._alreadyDestroyed = true; const canceled = !this.tiledWindow; this.emit('closed', canceled); this._shadeBG?.destroy(); this._shadeBG = null; super.fadeAndDestroy(); } _tileWindow(window) { let rect = this._freeScreenRect; // Halve the tile rect. // If isShiftPressed, then put the window at the top / left side; // if isAltPressed, then put it at the bottom / right side. // The orientation depends on the available screen space. const isShiftPressed = Util.isModPressed(Clutter.ModifierType.SHIFT_MASK); const isAltPressed = Util.isModPressed(Clutter.ModifierType.MOD1_MASK); if (isShiftPressed || isAltPressed) { // Prefer vertical a bit more (because screens are usually horizontal) const vertical = rect.width >= rect.height * 1.25; const size = vertical ? 'width' : 'height'; const orientation = vertical ? Orientation.V : Orientation.H; const idx = isShiftPressed ? 0 : 1; rect = rect.getUnitAt(idx, rect[size] / 2, orientation); } this.tiledWindow = window; window.change_workspace(global.workspace_manager.get_active_workspace()); // We want to activate/focus the window after it was tiled with the // Tiling Popup. Calling activate/focus() after tile() doesn't seem to // work for GNOME Terminal if it is maximized before trying to tile it. // It won't be tiled properly in that case for some reason... Instead // activate first but clear the tiling signals before so that the old // tile group won't be accidentally raised. Twm.clearTilingProps(window.get_id()); window.activate(global.get_current_time()); Twm.tile(window, rect, { monitorNr: this._monitor, openTilingPopup: this._allowConsecutivePopup, skipAnim: this._skipAnim }); } // Dont _finish(), if no mods are pressed _resetNoModsTimeout() { } }); const TSwitcherList = GObject.registerClass( class TilingSwitcherList extends AltTab.TilingAppSwitcher { _setIconSize() { let j = 0; while (this._items.length > 1 && this._items[j].style_class !== 'item-box') j++; const themeNode = this._items[j].get_theme_node(); this._list.ensure_style(); const iconPadding = themeNode.get_horizontal_padding(); const iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT); const [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1); const iconSpacing = labelNaturalHeight + iconPadding + iconBorder; const totalSpacing = this._list.spacing * (this._items.length - 1); const freeScreenRect = this._altTabPopup._freeScreenRect; const parentPadding = this.get_parent().get_theme_node().get_horizontal_padding(); const availWidth = freeScreenRect.width - parentPadding - this.get_theme_node().get_horizontal_padding(); const scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; const baseIconSizes = [96, 64, 48, 32, 22]; const iconSizes = baseIconSizes.map(s => s * scaleFactor); let iconSize = baseIconSizes[0]; if (this._items.length > 1) { for (let i = 0; i < baseIconSizes.length; i++) { iconSize = baseIconSizes[i]; const height = iconSizes[i] + iconSpacing; const w = height * this._items.length + totalSpacing; if (w <= availWidth) break; } } this._iconSize = iconSize; for (let i = 0; i < this.icons.length; i++) this.icons[i].set_size(iconSize); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/tilingWindowManager.js000066400000000000000000001673451500466572600323220ustar00rootroot00000000000000import { GLib, Meta, Mtk, Shell } from '../dependencies/gi.js'; import { Main } from '../dependencies/shell.js'; import { getWindows } from '../dependencies/unexported/altTab.js'; import { Orientation, Settings } from '../common.js'; import { Rect, Util } from './utility.js'; /** * Singleton responsible for tiling. Implement the signals in a separate Clutter * class so this doesn't need to be instanced. */ export class TilingWindowManager { static initialize() { this._signals = new TilingSignals(); /** * @type {Map} - { * windowId1: [windowIdX, windowIdY, ...], * windowId2: [...], * } */ this._tileGroups = new Map(); /** * {windowId: {isTiled: boolean, tiledRect: {}, untiledRect: {}}} */ this._tileStates = new Map(); const assertExistenceFor = window => { window.assertExistence = () => {}; window.connectObject( 'unmanaging', () => { window.assertExistence = () => { throw new Error( 'Trying to operate on an unmanaging window!' ); }; }, this ); }; global.display.list_all_windows().forEach(w => assertExistenceFor(w)); global.display.connectObject( 'window-created', (_, window) => assertExistenceFor(window), this ); global.workspace_manager.connectObject( 'workspace-added', this._onWorkspaceAdded.bind(this), this ); global.workspace_manager.connectObject( 'workspace-removed', this._onWorkspaceRemoved.bind(this), this ); } static destroy() { this._signals.destroy(); this._signals = null; global.workspace_manager.disconnectObject(this); global.display.disconnectObject(this); global.display.list_all_windows().forEach(w => { w.disconnectObject(this); delete w.assertExistence; }); this._tileGroups.clear(); this._tileStates.clear(); if (this._openAppTiledTimerId) { GLib.Source.remove(this._openAppTiledTimerId); this._openAppTiledTimerId = null; } if (this._wsAddedTimer) { GLib.Source.remove(this._wsAddedTimer); this._wsAddedTimer = null; } if (this._wsRemovedTimer) { GLib.Source.remove(this._wsRemovedTimer); this._wsRemovedTimer = null; } } /** * Gets windows, which can be tiled * * @param {boolean} [allWorkspaces=false] determines whether we only want * the windows from the current workspace. * @returns {Meta.Window[]} an array of of the open Meta.Windows in * stacking order. */ static getWindows(allWorkspaces = false) { const activeWs = global.workspace_manager.get_active_workspace(); const openWindows = getWindows(allWorkspaces ? null : activeWs); // The open windows are not sorted properly when tiling with the Tiling // Popup because altTab sorts by focus. const sorted = global.display.sort_windows_by_stacking(openWindows); return sorted.reverse().filter(w => { // I don't think this should normally happen but if it does, this // extension can crash GNOME Shell.. so guard against it. A way to // have a window's monitor be -1, for example, is explained here: // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4713 if (w.get_monitor() === -1) return false; // Assumption: a maximized window can also resize (once unmaximized) const canResize = w.allows_move() && w.allows_resize() || this.isMaximized(w); return canResize; }); } /** * @param {Meta.Window} window a Meta.Window. * @param {Mtk.Rectangle|Rect|null} workArea useful for the grace period * @returns whether the window is maximized. Be it using GNOME's native * maximization or the maximization by this extension when using gaps. */ static isMaximized(window, workArea = null) { const area = workArea ?? window.get_work_area_current_monitor(); return window.get_maximized() === Meta.MaximizeFlags.BOTH || window.tiledRect?.equal(area); } /** * Tiles a window to a specific spot and setup all tiling properties. * * @param {Meta.Window} window a Meta.Window to tile. * @param {Rect} newRect the Rect the `window` will be tiled to. * @param {object} [param] the Rect the `window` will be tiled to. * @param {boolean} [param.openTilingPopup=true] decides, if we open a Tiling * Popup after the window is tiled and there is unambiguous free * screen space. * @param {boolean} [param.ignoreTA=false] * @param {number} [param.monitorNr=null] * @param {boolean} [param.skipAnim=false] decides, if we skip the tile animation. * @param {boolean} [param.tileGroup=null] forces the creation of this tile group. * @param {boolean} [param.fakeTile=false] don't create a new tile group, don't * emit 'tiled' signal or open the Tiling Popup */ static async tile(window, newRect, { openTilingPopup = true, ignoreTA = false, monitorNr = null, skipAnim = false, fakeTile = false } = {}) { if (!window || window.is_skip_taskbar()) return; const wasTiled = window.isTiled; const wasMaximized = window.get_maximized(); if (wasMaximized) window.unmaximize(wasMaximized); window.unmake_fullscreen(); if (!window.allows_resize() || !window.allows_move()) return; // Remove window from the other windows' tileGroups so it // doesn't falsely get raised with them. this.clearTilingProps(window.get_id()); window.unmake_above(); window.unminimize(); // Raise window since tiling with the popup means that // the window can be below others. if (window.raise_and_make_recent_on_workspace) window.raise_and_make_recent_on_workspace(global.workspace_manager.get_active_workspace()); else window.raise_and_make_recent(); const oldRect = new Rect(window.get_frame_rect()); const monitor = monitorNr ?? window.get_monitor(); const workArea = new Rect(window.get_work_area_for_monitor(monitor)); const maximize = newRect.equal(workArea); window.isTiled = !maximize; if (!window.untiledRect) window.untiledRect = oldRect; if (maximize && !Settings.getBoolean('maximize-with-gap')) { window.tiledRect = null; // It's possible for a window to maximize() to the wrong monitor. // This is very easy to reproduce when dragging a window on the // lower half with Super + LMB. window.move_to_monitor(monitor); window.maximize(Meta.MaximizeFlags.BOTH); return; } // Save the intended tiledRect for accurate operations later. // Workaround for windows which can't be resized freely... // For ex. which only resize in full rows/columns like gnome-terminal window.tiledRect = newRect.copy(); const { x, y, width, height } = newRect.addGaps(workArea, monitor); // Animations const wActor = window.get_compositor_private(); if ( Settings.getBoolean('enable-tile-animations') && wActor && !wasTiled && !skipAnim ) { wActor.remove_all_transitions(); // HACK => journalctl: 'error in size change accounting'...? // TODO: no animation if going from maximized -> tiled and back to back multiple times? Main.wm._prepareAnimationInfo( global.window_manager, wActor, oldRect.meta, Meta.SizeChange.MAXIMIZE ); } // See issue #137. // Under some circumstances it's possible that windows will tile to the wrong // monitor. I can't reproduce it but I suspect that it's because of passing // false as the user_op to move_resize_frame. user_op is meant to determine if // the window should be clamped to the monitor. A user operation (user_op = true) // won't be clamped. So I think there is something unexpected happening. // Someone in the issue mentioned that passing true as the user_op fixes the // multi-monitor bug. // // The reason why I set user_op as false originally is that GNOME Terminal (and // some other Terminals) will only resize but not move with user_op as true. Try // to workaround that by first only moving the window and then resizing it. That // workaround was already necessary under Wayland because of some apps. E. g. // first tiling Nautilus and then Firefox using the Tiling Popup. window.move_to_monitor(monitor); window.move_frame(true, x, y); window.move_resize_frame(true, x, y, width, height); // Maximized with gaps if (maximize) { this._updateGappedMaxWindowSignals(window); this.saveTileState(window); // Tiled window } else if (!fakeTile) { // Make the tile group only consist of the window itself to stop // resizing or raising together. Also don't call the Tiling Popup. if (Settings.getBoolean('disable-tile-groups') || ignoreTA) { this.updateTileGroup([window]); this.saveTileState(window); return; } // Setup the (new) tileGroup to raise tiled windows as a group const topTileGroup = this._getWindowsForBuildingTileGroup(monitor); this.updateTileGroup(topTileGroup); this.saveTileState(window); if (openTilingPopup) await this.tryOpeningTilingPopup(); } } /** * Untiles a tiled window and delete all tiling properties. * * @param {Meta.Window} window a Meta.Window to untile. * @param {object} [params] * @param {boolean} [params.restoreFullPos=true] decides, if we restore the * pre-tile position or whether the size while keeping the titlebar * at the relative same position. * @param {boolean} [params.skipAnim=false] decides, if we skip the until animation. * @param {boolean} [params.clampToWorkspace=false] */ static untile(window, { restoreFullPos = true, skipAnim = false, clampToWorkspace = false } = {}) { const wasMaximized = window.get_maximized(); if (wasMaximized) window.unmaximize(wasMaximized); if (!window.untiledRect || !window.allows_resize() || !window.allows_move()) return; // If you tiled a window and then used the popup to tile more // windows, the consecutive windows will be raised above the first // one. So untiling the initial window after tiling more windows with // the popup (without re-focusing the initial window), means the // untiled window will be below the others. if (window.raise_and_make_recent_on_workspace) window.raise_and_make_recent_on_workspace(global.workspace_manager.get_active_workspace()); else window.raise_and_make_recent(); // Animation const untileAnim = Settings.getBoolean('enable-untile-animations'); const wActor = window.get_compositor_private(); if (untileAnim && !wasMaximized && wActor && !skipAnim) { wActor.remove_all_transitions(); Main.wm._prepareAnimationInfo( global.window_manager, wActor, window.get_frame_rect(), Meta.SizeChange.UNMAXIMIZE ); } // userOp means that the window won't clamp to the workspace. For DND // we don't want to clamp to the workspace, so it's false by default. const userOp = !clampToWorkspace; const oldRect = window.untiledRect; if (restoreFullPos) { window.move_resize_frame(userOp, oldRect.x, oldRect.y, oldRect.width, oldRect.height); } else { // Resize the window while keeping the relative x pos (of the pointer) const currWindowFrame = new Rect(window.get_frame_rect()); window.move_resize_frame(userOp, currWindowFrame.x, currWindowFrame.y, oldRect.width, oldRect.height); } this.clearTilingProps(window.get_id()); window.isTiled = false; window.tiledRect = null; window.untiledRect = null; this.deleteTilingState(window); } /** * Moves the tile group to a different workspace * * @param {Meta.Window[]} tileGroup * @param {Meta.Workspace} workspace */ static moveGroupToWorkspace(tileGroup, workspace) { tileGroup.forEach(w => { this._blockTilingSignalsFor(w); w.change_workspace(workspace); this._unblockTilingSignalsFor(w); }); } /** * Moves the tile group to a different monitor * * @param {Meta.Window[]} tileGroup * @param {number} oldMon * @param {number} newMon */ static moveGroupToMonitor(tileGroup, oldMon, newMon) { const activeWs = global.workspace_manager.get_active_workspace(); const oldWorkArea = new Rect(activeWs.get_work_area_for_monitor(oldMon)); const newWorkArea = new Rect(activeWs.get_work_area_for_monitor(newMon)); const hScale = oldWorkArea.width / newWorkArea.width; const vScale = oldWorkArea.height / newWorkArea.height; tileGroup.forEach((w, idx) => { const newTile = w.tiledRect.copy(); newTile.x = newWorkArea.x + Math.floor(newWorkArea.width * ((w.tiledRect.x - oldWorkArea.x) / oldWorkArea.width)); newTile.y = newWorkArea.y + Math.floor(newWorkArea.height * ((w.tiledRect.y - oldWorkArea.y) / oldWorkArea.height)); newTile.width = Math.floor(w.tiledRect.width * (1 / hScale)); newTile.height = Math.floor(w.tiledRect.height * (1 / vScale)); // Try to align with all previously scaled tiles and the workspace to prevent gaps for (let i = 0; i < idx; i++) newTile.tryAlignWith(tileGroup[i].tiledRect); newTile.tryAlignWith(newWorkArea, 10); this.tile(w, newTile, { skipAnim: true, fakeTile: true }); }); // The tiling signals got disconnected during the tile() call but not // (re-)connected with it since it may have been possible that wrong tile // groups would have been created when moving one window after the other // to the new monitor. So update the tileGroup now with the full/old group. this.updateTileGroup(tileGroup); } static getTileStates() { return this._tileStates; } /** * @param {Map} states - */ static setTileStates(states) { this._tileStates = states; } /** * @returns {Map} */ static getTileGroups() { return this._tileGroups; } /** * @param {Map} tileGroups */ static setTileGroups(tileGroups) { this._tileGroups = tileGroups; } /** * Creates a tile group of windows to raise them together, if one of them * is raised by (re)connecting signals. Usually, this is done automatically * by calling tile() and thus shouldn't be done manually. tile() only allows * unique/non-overlapping tile groups, so 1 window can't be part of multiple * tile groups. But we specifically allow the user to do that sometimes * (i. e. ctrl-drag or tile editing mode+space). So manually create the * tile group in those cases. * * @param {Meta.Window[]} tileGroup an array of Meta.Windows to group * together. */ static updateTileGroup(tileGroup) { tileGroup.forEach(window => { const windowId = window.get_id(); const signals = this._signals.getSignalsFor(windowId); this._tileGroups.set(windowId, tileGroup.map(w => w.get_id())); /** * clearTilingProps may have been called before this function, * so we need to reconnect all the signals on the tileGroup. * Just in case, also try to disconnect old signals... */ // Reconnect unmanaging signal const unmanagingSignal = signals.get(TilingSignals.UNMANAGING); unmanagingSignal && window.disconnect(unmanagingSignal); const umId = window.connect('unmanaging', () => { this.clearTilingProps(windowId); }); signals.set(TilingSignals.UNMANAGING, umId); // Reconnect ws-changed signal const wsChangeSignal = signals.get(TilingSignals.WS_CHANGED); wsChangeSignal && window.disconnect(wsChangeSignal); const wsId = window.connect('workspace-changed', () => this._onWindowWorkspaceChanged(window)); signals.set(TilingSignals.WS_CHANGED, wsId); // Reconnect raise signal const raiseSignal = signals.get(TilingSignals.RAISE); raiseSignal && window.disconnect(raiseSignal); const raiseId = window.connect('raised', raisedWindow => { const raisedWindowId = raisedWindow.get_id(); if (Settings.getBoolean('enable-raise-tile-group')) { const raisedWindowsTileGroup = this._tileGroups.get(raisedWindowId); raisedWindowsTileGroup.forEach(wId => { const w = this._getWindow(wId); const otherRaiseId = this._signals.getSignalsFor(wId).get(TilingSignals.RAISE); // May be undefined, if w was just closed. This would // automatically call clearTilingProps() with the signal // but in case I missed / don't know about other cases where // w may be nullish, dissolve the tileGroups anyway. if (!w || !otherRaiseId) { this.clearTilingProps(wId); return; } // Prevent an infinite loop of windows raising each other w.block_signal_handler(otherRaiseId); if (w.raise_and_make_recent_on_workspace) w.raise_and_make_recent_on_workspace(global.workspace_manager.get_active_workspace()); else w.raise_and_make_recent(); w.unblock_signal_handler(otherRaiseId); }); // Re-raise the just raised window so it may not be below // other tiled windows otherwise when untiling via keyboard // it may be below other tiled windows. const signalId = this._signals.getSignalsFor(raisedWindowId).get(TilingSignals.RAISE); raisedWindow.block_signal_handler(signalId); if (raisedWindow.raise_and_make_recent_on_workspace) raisedWindow.raise_and_make_recent_on_workspace(global.workspace_manager.get_active_workspace()); else raisedWindow.raise_and_make_recent(); raisedWindow.unblock_signal_handler(signalId); } // Update the tileGroup (and reconnect the raised signals) to allow windows // to be part of multiple tileGroups: for ex.: tiling a window over another // tiled window with ctrl-drag will replace the overlapped window in the old // tileGroup but the overlapped window will remember its old tile group to // raise them as well, if it is raised. const raisedTileGroup = this.getTileGroupFor(raisedWindow); this.updateTileGroup(raisedTileGroup); }); signals.set(TilingSignals.RAISE, raiseId); }); } /** * Deletes the tile group of a window and remove that window from other * tiled windows' tile groups. Also disconnects the signals for windows * which are maximized-with-gaps. * * @param {number} windowId the id of a Meta.Window. */ static clearTilingProps(windowId) { const window = this._getWindow(windowId); const signals = this._signals.getSignalsFor(windowId); if (signals.get(TilingSignals.RAISE)) { window && window.disconnect(signals.get(TilingSignals.RAISE)); signals.set(TilingSignals.RAISE, 0); } if (signals.get(TilingSignals.WS_CHANGED)) { window && window.disconnect(signals.get(TilingSignals.WS_CHANGED)); signals.set(TilingSignals.WS_CHANGED, 0); } if (signals.get(TilingSignals.UNMANAGING)) { window && window.disconnect(signals.get(TilingSignals.UNMANAGING)); signals.set(TilingSignals.UNMANAGING, 0); } if (!this._tileGroups.has(windowId)) return; // Delete window's tileGroup this._tileGroups.delete(windowId); // Delete window from other windows' tileGroup this._tileGroups.forEach(tileGroup => { const idx = tileGroup.indexOf(windowId); idx !== -1 && tileGroup.splice(idx, 1); }); } /** * @param {Meta.Window} window a Meta.Window. * @returns {Meta.Window[]} an array of Meta.Windows, which are in `window`'s * tile group (including the `window` itself). */ static getTileGroupFor(window) { const tileGroup = this._tileGroups.get(window.get_id()); if (!tileGroup) return []; return this._getAllWindows().filter(w => tileGroup.includes(w.get_id())); } /** * Gets the top most tiled window group; that means they complement each * other and don't intersect. This may differ from the TileGroupManager's * *tracked* tile groups since floating windows may overlap some tiled * windows *at the moment* when this function is called. * * @param {object} [params] * @param {boolean} [params.skipTopWindow=true] whether we ignore the focused window * in the active search for the top tile group. The focused window may * still be part of the returned array if it is part of another high- * stacked window's tile group. This is mainly only useful, if the * focused window isn't tiled (for example when dnd-ing a window). * @param {number} [params.monitor=null] get the group for the monitor number. * * @returns {Meta.Window[]} an array of tiled Meta.Windows. */ static getTopTileGroup({ skipTopWindow = false, monitor = null } = {}) { // 'Raise Tile Group' setting is enabled so we just return the tracked // tile group. Same thing for the setting 'Disable Tile Groups' because // it's implemented by just making the tile groups consist of single // windows (the tiled window itself). if (Settings.getBoolean('enable-raise-tile-group') || Settings.getBoolean('disable-tile-groups') ) { const openWindows = this.getWindows(); if (!openWindows.length) return []; if (skipTopWindow) { // the focused window isn't necessarily the top window due to always // on top windows. const idx = openWindows.indexOf(global.display.focus_window); idx !== -1 && openWindows.splice(idx, 1); } const ignoredWindows = []; const mon = monitor ?? global.display.focus_window?.get_monitor() ?? openWindows[0].get_monitor(); for (const window of openWindows) { if (window.get_monitor() !== mon) continue; // Ignore non-tiled windows, which are always-on-top, for the // calculation since they are probably some utility apps etc. if (window.is_above() && !window.isTiled) continue; // Find the first not overlapped tile group, if it exists if (window.isTiled) { const overlapsIgnoredWindow = ignoredWindows.some(w => { const rect = w.tiledRect ?? new Rect(w.get_frame_rect()); return rect.overlap(window.tiledRect); }); if (overlapsIgnoredWindow) ignoredWindows.push(window); else return this.getTileGroupFor(window); } else { ignoredWindows.push(window); } } return []; // 'Raise Tile Group' setting is disabled so we get thetop most // non-overlapped/ing tiled windows ignoring the tile groups. } else { return this._getTopTiledWindows({ skipTopWindow, monitor }); } } /** * Gets the free screen space (1 big Rect). If the free screen space * is ambiguous that means it consists of multiple (unaligned) rectangles * (for ex.: 2 diagonally opposing quarters). In that case we return null. * * @param {Rect[]} rectList an array of Rects, which occupy the screen. * @param {number|null} [monitorNr] useful for the grace period during dnd. * Defaults to pointer monitor. * @returns {Rect|null} a Rect, which represent the free screen space. */ static getFreeScreen(rectList, monitorNr = null) { const activeWs = global.workspace_manager.get_active_workspace(); const monitor = monitorNr ?? global.display.get_current_monitor(); const workArea = new Rect(activeWs.get_work_area_for_monitor(monitor)); const freeScreenRects = workArea.minus(rectList); if (!freeScreenRects.length) return null; // Create the union of all freeScreenRects and calculate the sum // of their areas. If the area of the union-rect equals the area // of the individual rects, the individual rects align properly. const startRect = new Rect(freeScreenRects[0].x, freeScreenRects[0].y, 0, 0); const { checkSum, combinedRect } = freeScreenRects.reduce((result, rect) => { result.checkSum += rect.area; result.combinedRect = result.combinedRect.union(rect); return result; }, { checkSum: 0, combinedRect: startRect }); if (combinedRect.area !== checkSum) return null; // Random min. size requirement if (combinedRect.width < 250 || combinedRect.height < 250) return null; return combinedRect; } /** * Gets the best available free screen rect. If a `currRect` is passed, * instead this will return an expanded copy of that rect filling all * the available space around it. * * @param {Rect[]} rectList an array of Rects, which occupy the screen. * Like usual, they shouldn't overlap each other. * @param {object} [params] * @param {Rect} [params.currRect=null] a Rect, which may be expanded. * @param {Orientation} [params.orientation=null] The orientation we want to expand * `currRect` into. If `null`, expand in both orientations. * @param {number} [params.monitorNr=null] defaults to pointer monitor. * @returns {Rect} a new Rect. */ static getBestFreeRect(rectList, { currRect = null, orientation = null, monitorNr = null } = {}) { const activeWs = global.workspace_manager.get_active_workspace(); const monitor = monitorNr ?? global.display.get_current_monitor(); const workArea = new Rect(activeWs.get_work_area_for_monitor(monitor)); const freeRects = workArea.minus(rectList); if (!freeRects.length) return currRect ?? new Rect(workArea); // Try to expand the currRect to fill the rest of the space // that is available around it. if (currRect) { const isVert = (orientation ?? Orientation.V) === Orientation.V; const [xpndPos1, xpndPos2] = isVert ? ['y', 'y2'] : ['x', 'x2']; const [unxpndPos1, unxpndPos2] = isVert ? ['x', 'x2'] : ['y', 'y2']; // Filter the rects to only keep the ones directly bordering the // currRect and sort the array so that the free rects are ordered // from the left to the right or from the top to the bottom. See // below for the reasoning. const borderingRects = freeRects.filter(r => { const axis1 = currRect[xpndPos1] === r[xpndPos2] || currRect[xpndPos2] === r[xpndPos1]; const axis2 = isVert ? currRect.horizOverlap(r) : currRect.vertOverlap(r); return axis1 && axis2; }).sort((a, b) => a[unxpndPos1] - b[unxpndPos1]); // Separate the rects into the ones that come before (left / top) // or after (right / bottom) the current rect. const { before, after } = borderingRects.reduce((result, r) => { if (currRect[xpndPos1] === r[xpndPos2]) result.before.push(r); else if (currRect[xpndPos2] === r[xpndPos1]) result.after.push(r); return result; }, { before: [], after: [] }); // If we want to check whether the current rect can expand on a certain // side (let's say we expand the height), we need to check the *other* // (unexpanded) side. So whether the current rect is bordering the free // screen rects along its *entire width*. We do this by 'union-ing' the // free screen rects along the relevant side (our ex.: width). For this // reason we needed to sort the free rects in ascending order before // to make sure they overlap before trying to 'union' them. After the // union-ing, we just check, if the union-ed rect contains the current // rects unexpanded side. // Orientation doesn't matter here since we are always comparing sides // of the same orientation. So just make the side always horizontal. const makeSide = (startPoint, endPoint) => new Mtk.Rectangle({ x: startPoint, width: endPoint - startPoint, height: 1 }); const freeRectsContainCurrRectSide = rects => { const currRectSide = makeSide(currRect[unxpndPos1], currRect[unxpndPos2]); const linkedSides = rects.reduce((linked, r) => { const side = makeSide(r[unxpndPos1], r[unxpndPos2]); return linked.overlap(side) ? linked.union(side) : linked; }, makeSide(rects[0][unxpndPos1], rects[0][unxpndPos2])); return linkedSides.contains_rect(currRectSide); }; const newRect = currRect.copy(); // Expand to the left / top. if (before.length) { if (freeRectsContainCurrRectSide(before)) { const expandStartTo = before.reduce((currSize, rect) => { return Math.max(currSize, rect[xpndPos1]); }, before[0][xpndPos1]); newRect[xpndPos2] += newRect[xpndPos1] - expandStartTo; newRect[xpndPos1] = expandStartTo; } } // Expand to the right / bottom. if (after.length) { if (freeRectsContainCurrRectSide(after)) { const expandEndTo = after.reduce((currSize, rect) => { return Math.min(currSize, rect[xpndPos2]); }, after[0][xpndPos2]); newRect[xpndPos2] = expandEndTo; } } if (!orientation) { // if orientation is null, we expanded vertically. Now we want // to expand horizontally as well. rectList = [...rectList]; const currRectIdx = rectList.findIndex(r => r.equal(currRect)); rectList.splice(currRectIdx, 1); rectList.push(newRect); return newRect.union( this.getBestFreeRect(rectList, { currRect: newRect, orientation: Orientation.H, monitorNr: monitor })); } else { return newRect; } // No currRect was passed, so we just choose the single biggest free rect // and expand it using this function. This is a naive approach and doesn't // guarantee that we get the best combination of free screen rects... but // it should be good enough. } else { const biggestSingle = freeRects.reduce((currBiggest, rect) => { return currBiggest.area >= rect.area ? currBiggest : rect; }); rectList.push(biggestSingle); return this.getBestFreeRect(rectList, { currRect: biggestSingle }); } } /** * Gets the nearest Meta.Window in the direction of `dir`. * * @param {Meta.Window} currWindow the Meta.Window that the search starts * from. * @param {Meta.Window[]} windows an array of the available Meta.Windows. * It may contain the current window itself. The windows shouldn't * overlap each other. * @param {Direction} dir the direction that is look into. * @param {boolean} [wrap=true] whether we wrap around, * if there is no Meta.Window in the direction of `dir`. * @returns {Meta.Window|null} the nearest Meta.Window. */ static getNearestWindow(currWindow, windows, dir, wrap = true) { const getRect = w => w.tiledRect ?? new Rect(w.get_frame_rect()); const rects = windows.map(w => getRect(w)); const nearestRect = getRect(currWindow).getNeighbor(dir, rects, wrap); if (!nearestRect) return null; return windows.find(w => getRect(w).equal(nearestRect)); } /** * Gets the rectangle for special positions adapted to the surrounding * rectangles. The position is determined by `shortcut` but this function * isn't limited to just keyboard shortcuts. This is also used when * dnd-ing a window. * * Examples: 'tile-left-half' gets the left-most rectangle with the height * of the workArea. 'tile-bottomleft-quarter' gets the rectangle touching the * bottom left screen corner etc... If there is no other rect to adapt to * we default to half the workArea. * * @param {string} shortcut the side / quarter to get the tile rect for. * @param {Rect} workArea the workArea. * @param {number} [monitor=null] the monitor number we want to get the * rect for. This may not always be the current monitor. It is only * used to implement the 'grace period' to enable quickly tiling a * window using the screen edges even if there is another monitor * at that edge. * @returns a Rect. */ static getTileFor(shortcut, workArea, monitor = null) { // Don't try to adapt a tile rect if (Settings.getBoolean('disable-tile-groups')) return this.getDefaultTileFor(shortcut, workArea); const topTileGroup = this.getTopTileGroup({ skipTopWindow: true, monitor }); // getTileFor is used to get the adaptive tiles for dnd & tiling keyboard // shortcuts. That's why the top most window needs to be ignored when // calculating the new tile rect. The top most window is already ignored // for dnd in the getTopTileGroup() call. While the top most window will // be ignored for the active search in getTopTileGroup, it may still be // part of the returned array if it's part of another high-stackeing // window's tile group. const idx = topTileGroup.indexOf(global.display.focus_window); idx !== -1 && topTileGroup.splice(idx, 1); const favLayout = Util.getFavoriteLayout(monitor); const useFavLayout = favLayout.length && Settings.getBoolean('adapt-edge-tiling-to-favorite-layout'); const twRects = useFavLayout && favLayout || topTileGroup.map(w => w.tiledRect); if (!twRects.length) return this.getDefaultTileFor(shortcut, workArea); // Return the adapted rect only if it doesn't overlap an existing tile. // Ignore an overlap, if a fav layout is used since we always prefer the // user set layout in that case. const getTile = rect => { if (useFavLayout) return rect; const overlapsTiles = twRects.some(r => r.overlap(rect)); return overlapsTiles ? this.getDefaultTileFor(shortcut, workArea) : rect; }; const screenRects = twRects.concat(workArea.minus(twRects)); switch (shortcut) { case 'tile-maximize': { return workArea.copy(); } case 'tile-left-half': { const left = screenRects.find(r => r.x === workArea.x && r.width !== workArea.width); const { width } = left ?? workArea.getUnitAt(0, workArea.width / 2, Orientation.V); const result = new Rect(workArea.x, workArea.y, width, workArea.height); return getTile(result); } case 'tile-right-half': { const right = screenRects.find(r => r.x2 === workArea.x2 && r.width !== workArea.width); const { width } = right ?? workArea.getUnitAt(1, workArea.width / 2, Orientation.V); const result = new Rect(workArea.x2 - width, workArea.y, width, workArea.height); return getTile(result); } case 'tile-top-half': { const top = screenRects.find(r => r.y === workArea.y && r.height !== workArea.height); const { height } = top ?? workArea.getUnitAt(0, workArea.height / 2, Orientation.H); const result = new Rect(workArea.x, workArea.y, workArea.width, height); return getTile(result); } case 'tile-bottom-half': { const bottom = screenRects.find(r => r.y2 === workArea.y2 && r.height !== workArea.height); const { height } = bottom ?? workArea.getUnitAt(1, workArea.height / 2, Orientation.H); const result = new Rect(workArea.x, workArea.y2 - height, workArea.width, height); return getTile(result); } case 'tile-topleft-quarter': { const left = screenRects.find(r => r.x === workArea.x && r.width !== workArea.width); const { width } = left ?? workArea.getUnitAt(0, workArea.width / 2, Orientation.V); const top = screenRects.find(r => r.y === workArea.y && r.height !== workArea.height); const { height } = top ?? workArea.getUnitAt(0, workArea.height / 2, Orientation.H); const result = new Rect(workArea.x, workArea.y, width, height); return getTile(result); } case 'tile-topright-quarter': { const right = screenRects.find(r => r.x2 === workArea.x2 && r.width !== workArea.width); const { width } = right ?? workArea.getUnitAt(1, workArea.width / 2, Orientation.V); const top = screenRects.find(r => r.y === workArea.y && r.height !== workArea.height); const { height } = top ?? workArea.getUnitAt(0, workArea.height / 2, Orientation.H); const result = new Rect(workArea.x2 - width, workArea.y, width, height); return getTile(result); } case 'tile-bottomleft-quarter': { const left = screenRects.find(r => r.x === workArea.x && r.width !== workArea.width); const { width } = left ?? workArea.getUnitAt(0, workArea.width / 2, Orientation.V); const bottom = screenRects.find(r => r.y2 === workArea.y2 && r.height !== workArea.height); const { height } = bottom ?? workArea.getUnitAt(1, workArea.height / 2, Orientation.H); const result = new Rect(workArea.x, workArea.y2 - height, width, height); return getTile(result); } case 'tile-bottomright-quarter': { const right = screenRects.find(r => r.x2 === workArea.x2 && r.width !== workArea.width); const { width } = right ?? workArea.getUnitAt(1, workArea.width / 2, Orientation.V); const bottom = screenRects.find(r => r.y2 === workArea.y2 && r.height !== workArea.height); const { height } = bottom ?? workArea.getUnitAt(1, workArea.height / 2, Orientation.H); const result = new Rect(workArea.x2 - width, workArea.y2 - height, width, height); return getTile(result); } } } /** * @param {string} shortcut determines, which half/quarter to get the tile for * @param {Rect} workArea * @returns */ static getDefaultTileFor(shortcut, workArea) { switch (shortcut) { case 'tile-maximize': return workArea.copy(); case 'tile-left-half': case 'tile-left-half-ignore-ta': return workArea.getUnitAt(0, workArea.width / 2, Orientation.V); case 'tile-right-half': case 'tile-right-half-ignore-ta': return workArea.getUnitAt(1, workArea.width / 2, Orientation.V); case 'tile-top-half': case 'tile-top-half-ignore-ta': return workArea.getUnitAt(0, workArea.height / 2, Orientation.H); case 'tile-bottom-half': case 'tile-bottom-half-ignore-ta': return workArea.getUnitAt(1, workArea.height / 2, Orientation.H); case 'tile-topleft-quarter': case 'tile-topleft-quarter-ignore-ta': return workArea.getUnitAt(0, workArea.width / 2, Orientation.V).getUnitAt(0, workArea.height / 2, Orientation.H); case 'tile-topright-quarter': case 'tile-topright-quarter-ignore-ta': return workArea.getUnitAt(1, workArea.width / 2, Orientation.V).getUnitAt(0, workArea.height / 2, Orientation.H); case 'tile-bottomleft-quarter': case 'tile-bottomleft-quarter-ignore-ta': return workArea.getUnitAt(0, workArea.width / 2, Orientation.V).getUnitAt(1, workArea.height / 2, Orientation.H); case 'tile-bottomright-quarter': case 'tile-bottomright-quarter-ignore-ta': return workArea.getUnitAt(1, workArea.width / 2, Orientation.V).getUnitAt(1, workArea.height / 2, Orientation.H); } } /** * Opens the Tiling Popup, if there is unambiguous free screen space, * and offer to tile an open window to that spot. */ static async tryOpeningTilingPopup() { if (!Settings.getBoolean('enable-tiling-popup')) return; const allWs = Settings.getBoolean('tiling-popup-all-workspace'); const openWindows = this.getWindows(allWs); const topTileGroup = this.getTopTileGroup(); topTileGroup.forEach(w => openWindows.splice(openWindows.indexOf(w), 1)); if (!openWindows.length) return; const tRects = topTileGroup.map(w => w.tiledRect); const monitor = topTileGroup[0]?.get_monitor(); // for the grace period const freeSpace = this.getFreeScreen(tRects, monitor); if (!freeSpace) return; const TilingPopup = await import('./tilingPopup.js'); const popup = new TilingPopup.TilingSwitcherPopup(openWindows, freeSpace); if (!popup.show(topTileGroup)) popup.destroy(); } /** * Tiles or untiles a window based on its current tiling state. * * @param {Meta.Window} window a Meta.Window. * @param {Rect} rect the Rect the `window` tiles to or untiles from. */ static toggleTiling(window, rect, params = {}) { const workArea = window.get_work_area_current_monitor(); const equalsWA = rect.equal(workArea); const equalsTile = window.tiledRect && rect.equal(window.tiledRect); if (window.isTiled && equalsTile || this.isMaximized(window) && equalsWA) this.untile(window, params); else this.tile(window, rect, params); } /** * Tries to open an app on a tiling state (in a very dumb way...). * * @param {Shell.App} app the Shell.App to open and tile. * @param {Rect} rect the Rect to tile to. * @param {boolean} [openTilingPopup=false] allow the Tiling Popup to * appear, if there is free screen space after the `app` was tiled. */ static openAppTiled(app, rect, openTilingPopup = false) { if (!app?.can_open_new_window()) return; let createId = global.display.connect('window-created', (src, window) => { const wActor = window.get_compositor_private(); let firstFrameId = wActor?.connect('first-frame', () => { wActor.disconnect(firstFrameId); firstFrameId = 0; const winTracker = Shell.WindowTracker.get_default(); const openedWindowApp = winTracker.get_window_app(window); // Check, if the created window is from the app and if it allows // to be moved and resized because, for example, Steam uses a // WindowType.Normal window for their loading screen, which we // don't want to trigger the tiling for. if (createId && openedWindowApp && openedWindowApp === app && (window.allows_resize() && window.allows_move() || window.get_maximized()) ) { global.display.disconnect(createId); createId = 0; this.tile(window, rect, { openTilingPopup, skipAnim: true }); } }); // Don't immediately disconnect the signal in case the launched // window doesn't match the original app. It may be a loading screen // or the user started an app in between etc... but in case the checks/ // signals above fail disconnect the signals after 1 min at the latest this._openAppTiledTimerId && GLib.Source.remove(this._openAppTiledTimerId); this._openAppTiledTimerId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 60000, () => { createId && global.display.disconnect(createId); createId = 0; firstFrameId && wActor.disconnect(firstFrameId); firstFrameId = 0; this._openAppTiledTimerId = null; return GLib.SOURCE_REMOVE; }); }); app.open_new_window(-1); } static saveTileState(window) { const windowState = this._tileStates.get(window.get_id()); const rectToJsObject = rect => { return rect ? { x: rect.x, y: rect.y, width: rect.width, height: rect.height } : undefined; }; if (windowState) { windowState.isTiled = window.isTiled; windowState.tiledRect = rectToJsObject(window.tiledRect); windowState.untiledRect = rectToJsObject(window.untiledRect); } else { this._tileStates.set( window.get_id(), { isTiled: window.isTiled, tiledRect: rectToJsObject(window.tiledRect), untiledRect: rectToJsObject(window.untiledRect) } ); } } static deleteTilingState(window) { this._tileStates.delete(window.get_id()); } /** * Gets the top windows, which are supposed to be in a tile group. That * means windows, which are tiled, and don't overlap each other. */ static _getWindowsForBuildingTileGroup(monitor = null) { const openWindows = this.getWindows(); if (!openWindows.length) return []; const ignoredWindows = []; const result = []; const mon = monitor ?? global.display.focus_window?.get_monitor() ?? openWindows[0].get_monitor(); for (const window of openWindows) { if (window.get_monitor() !== mon) continue; if (window.is_above() && !window.isTiled) continue; if (window.isTiled) { // Window was already checked as part of another's tileGroup. if (ignoredWindows.includes(window) || result.includes(window)) continue; // Check for the other windows in the tile group as well regardless // of the 'raise tile group' setting so that once the setting is // enabled the tile groups are already set properly. const tileGroup = this.getTileGroupFor(window); // This means `window` is the window that was just tiled and // thus has no tileGroup set at this point yet. if (!tileGroup.length) { result.push(window); continue; } const tileGroupOverlaps = tileGroup.some(w => result.some(r => r.tiledRect.overlap(w.tiledRect)) || ignoredWindows.some(r => (r.tiledRect ?? new Rect(r.get_frame_rect())).overlap(w.tiledRect))); tileGroupOverlaps ? tileGroup.forEach(w => ignoredWindows.push(w)) : tileGroup.forEach(w => result.push(w)); } else { // The window is maximized, so all windows below it can't belong // to this group anymore. if (this.isMaximized(window)) break; ignoredWindows.push(window); } } return result; } /** * Gets the top most non-overlapped/ing tiled windows ignoring * the stacking order and tile groups. * * @param {object} [param] * @param {boolean} [param.skipTopWindow=false] * @param {number} [param.monitor=null] */ static _getTopTiledWindows({ skipTopWindow = false, monitor = null } = {}) { const openWindows = this.getWindows(); if (!openWindows.length) return []; if (skipTopWindow) { // the focused window isn't necessarily the top window due to always // on top windows. const idx = openWindows.indexOf(global.display.focus_window); idx !== -1 && openWindows.splice(idx, 1); } const topTiledWindows = []; const ignoredWindows = []; const mon = monitor ?? global.display.focus_window?.get_monitor() ?? openWindows[0].get_monitor(); for (const window of openWindows) { if (window.get_monitor() !== mon) continue; if (window.is_above() && !window.isTiled) continue; if (window.isTiled) { const wRect = window.tiledRect; // If a ignored window in a higher stack order overlaps the // currently tested tiled window, the currently tested tiled // window isn't part of the top tile group. const overlapsIgnoredWindow = ignoredWindows.some(w => { const rect = w.tiledRect ?? new Rect(w.get_frame_rect()); return rect.overlap(wRect); }); // Same applies for already grouped windows const overlapsTopTiledWindows = topTiledWindows.some(w => w.tiledRect.overlap(wRect)); overlapsIgnoredWindow || overlapsTopTiledWindows ? ignoredWindows.push(window) : topTiledWindows.push(window); } else { // The window is maximized, so all windows below it can't belong // to this group anymore. if (this.isMaximized(window)) break; ignoredWindows.push(window); } } return topTiledWindows; } /** * Blocks all tiling signals for a window. * * @param {Meta.Window} window */ static _blockTilingSignalsFor(window) { const signals = this._signals.getSignalsFor(window.get_id()); const blockedSignals = [TilingSignals.RAISE, TilingSignals.WS_CHANGED, TilingSignals.UNMANAGING]; blockedSignals.forEach(s => { const id = signals.get(s); id && window.block_signal_handler(id); }); } /** * Unblocks all tiling signals for a window. * Should only be called after _blockTilingSignalsFor(). * * @param {Meta.Window} window */ static _unblockTilingSignalsFor(window) { const signals = this._signals.getSignalsFor(window.get_id()); const blockedSignals = [TilingSignals.RAISE, TilingSignals.WS_CHANGED, TilingSignals.UNMANAGING]; blockedSignals.forEach(s => { const id = signals.get(s); id && window.unblock_signal_handler(id); }); } /** * Updates the signals after maximizing a window with gaps. * * @param {Meta.Window} window */ static _updateGappedMaxWindowSignals(window) { const wId = window.get_id(); const signals = this._signals.getSignalsFor(wId); // Refresh 'unmanaging' signal const unmanagingSignal = signals.get(TilingSignals.UNMANAGING); unmanagingSignal && window.disconnect(unmanagingSignal); const umId = window.connect('unmanaging', () => { this.clearTilingProps(window.get_id()); }); signals.set(TilingSignals.UNMANAGING, umId); // Refresh 'workspace-changed' signal const wsId = window.connect('workspace-changed', () => this._onWindowWorkspaceChanged(window)); this._signals.getSignalsFor(wId).set(TilingSignals.WS_CHANGED, wsId); } /** * @returns {Meta.Window[]} an array of *all* windows * (and not just the ones relevant to altTab) */ static _getAllWindows() { return global.display.get_tab_list(Meta.TabList.NORMAL_ALL, null); } /** * Gets the window matching a window id * * @param {number} id * @returns {Meta.Window} */ static _getWindow(id) { return this._getAllWindows().find(w => w.get_id() === id); } /** * A window's workspace-changed signal is used to untile it when the user * changes its workspace. However, dynamic workspaces *may* also trigger a * ws-changed signal. So listen to the workspace-added/removed signals and * 'ignore' the next ws-changed signal. A ws addition/removal doesn't guarantuee * a ws-changed signal (e. g. the workspace is at the end), so reset after * a short timer. */ static _onWorkspaceAdded() { this._ignoreWsChange = true; this._wsAddedTimer && GLib.Source.remove(this._wsAddedTimer); this._wsAddedTimer = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 50, () => { this._ignoreWsChange = false; this._wsAddedTimer = null; return GLib.SOURCE_REMOVE; }); } /** * A window's workspace-changed signal is used to untile it when the user * changes its workspace. However, dynamic workspaces *may* also trigger a * ws-changed signal. So listen to the workspace-added/removed signals and * 'ignore' the next ws-changed signal. A ws addition/removal doesn't guarantuee * a ws-changed signal (e. g. the workspace is at the end), so reset after * a short timer. */ static _onWorkspaceRemoved() { this._ignoreWsChange = true; this._wsRemovedTimer && GLib.Source.remove(this._wsRemovedTimer); this._wsRemovedTimer = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 50, () => { this._ignoreWsChange = false; this._wsRemovedTimer = null; return GLib.SOURCE_REMOVE; }); } /** * This is only called for tiled and maximized (with gaps) windows. * Untile tiled windows. Re-tile maximized windows to fit the whole workArea * since a monitor change will also trigger a workspace-change signal. * Previously, we tried to adapt the tiled window's size to the new monitor * but that is probably too unpredictable. First, it may introduce rounding * errors when moving multiple windows of the same tileGroup and second (and * more importantly) the behavior with regards to tileGroups isn't clear... * Should the entire tileGroup move, if 1 tiled window is moved? If not, * there should probably be a way to just detach 1 window from a group. What * happens on the new monitor, if 1 window is moved? Should it create a new * tileGroup? Should it try to integrate into existing tileGroups on that * monitor etc... there are too many open questions. Instead just untile * and leave it up to the user to re-tile a window. * * @param {Meta.Window} window */ static _onWindowWorkspaceChanged(window) { // Closing a window triggers a ws-changed signal, which may lead to a // crash, if we try to operate on it any further. try { window.assertExistence(); } catch { return; } if (this._ignoreWsChange) return; if (this.isMaximized(window)) { const wA = window.get_work_area_for_monitor(window.get_monitor()); const workArea = new Rect(wA); if (workArea.equal(window.tiledRect)) return; this.tile(window, workArea, { openTilingPopup: false, skipAnim: true }); } else if (window.isTiled) { this.untile(window, { restoreFullPos: false, clampToWorkspace: true, skipAnim: Main.overview.visible }); } } } /** * This is instanced by the 'TilingWindowManager'. It implements the tiling * signals and tracks the signal( id)s, which are relevant for tiling: * Raise: for group raising. * Ws-changed: for untiling a tiled window after its ws changed. * Unmanaging: to remove unmanaging tiled windows from the other tileGroups. */ class TilingSignals { // Relevant 'signal types' (sorta used as an enum / key for the signal map). // Tiled windows use all 3 signals; maximized-with-gaps windows only use the // workspace-changed and unmanaging signal. static RAISE = 'RAISE'; static WS_CHANGED = 'WS_CHANGED'; static UNMANAGING = 'UNMANAGING'; constructor() { // { windowId1: { RAISE: signalId1, WS_CHANGED: signalId2, UNMANAGING: signalId3 }, ... } this._ids = new Map(); } destroy() { // Disconnect remaining signals const allWindows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, null); this._ids.forEach((signals, windowId) => { const window = allWindows.find(w => w.get_id() === windowId); window && signals.forEach(s => s && window.disconnect(s)); }); } /** * Gets the signal ids for the raise, ws-changed and unmanaging signals * for a specific window * * @param {number} windowId Meta.Window's id * @returns {Map} the tiling signal ids for the window (id) * with a 'signal type' as the keys */ getSignalsFor(windowId) { let ret = this._ids.get(windowId); if (!ret) { ret = new Map(); this._ids.set(windowId, ret); } return ret; } }; Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/extension/utility.js000066400000000000000000000646241500466572600300500ustar00rootroot00000000000000import { Clutter, Gio, GLib, Mtk, St } from '../dependencies/gi.js'; import { Main } from '../dependencies/shell.js'; import { Direction, Orientation, Settings } from '../common.js'; /** * Library of commonly used functions for the extension.js' files * (and *not* the prefs files) */ export class Util { /** * Performs an approximate equality check. There will be times when * there will be inaccuracies. For example, the user may enable window * gaps and resize 2 tiled windows and try to line them up manually. * But since the gaps are implemented with this extension, there will * be no window snapping. So the windows won't be aligned pixel * perfectly... in that case we first check approximately and correct * the inaccuracies afterwards. * * @param {number} value * @param {number} value2 * @param {number} [margin=4] * @returns {boolean} whether the values are approximately equal. */ static equal(value, value2, margin = 4) { return Math.abs(value - value2) <= margin; } /** * @param {{x, y}} pointA * @param {{x, y}} pointB * @returns {number} the distance between `pointA` and `pointB`, */ static getDistance(pointA, pointB) { const diffX = pointA.x - pointB.x; const diffY = pointA.y - pointB.y; return Math.sqrt(diffX * diffX + diffY * diffY); } /** * @param {number} keyVal * @param {Direction} direction * @returns {boolean} whether the `keyVal` is considered to be in the * direction of `direction`. */ static isDirection(keyVal, direction) { switch (direction) { case Direction.N: return keyVal === Clutter.KEY_Up || keyVal === Clutter.KEY_w || keyVal === Clutter.KEY_W || keyVal === Clutter.KEY_k || keyVal === Clutter.KEY_K; case Direction.S: return keyVal === Clutter.KEY_Down || keyVal === Clutter.KEY_s || keyVal === Clutter.KEY_S || keyVal === Clutter.KEY_j || keyVal === Clutter.KEY_J; case Direction.W: return keyVal === Clutter.KEY_Left || keyVal === Clutter.KEY_a || keyVal === Clutter.KEY_A || keyVal === Clutter.KEY_h || keyVal === Clutter.KEY_H; case Direction.E: return keyVal === Clutter.KEY_Right || keyVal === Clutter.KEY_d || keyVal === Clutter.KEY_D || keyVal === Clutter.KEY_l || keyVal === Clutter.KEY_L; } return false; } /** * @param {number} keyVal * @returns {Direction} */ static getDirection(keyVal) { if (this.isDirection(keyVal, Direction.N)) return Direction.N; else if (this.isDirection(keyVal, Direction.S)) return Direction.S; else if (this.isDirection(keyVal, Direction.W)) return Direction.W; else if (this.isDirection(keyVal, Direction.E)) return Direction.E; else return null; } /** * Get the window or screen gaps scaled to the monitor scale. * * @param {String} settingsKey the key for the gap * @param {number} monitor the number of the monitor to scale the gap to * @returns {number} the scaled gap as a even number since the window gap * will be divided by 2. */ static getScaledGap(settingsKey, monitor) { const gap = Settings.getInt(settingsKey); const scaledGap = gap * global.display.get_monitor_scale(monitor); return scaledGap % 2 === 0 ? scaledGap : scaledGap + 1; } static useIndividualGaps(monitor) { // Prefer individual gaps over the single one const screenTopGap = this.getScaledGap('screen-top-gap', monitor); const screenLeftGap = this.getScaledGap('screen-left-gap', monitor); const screenRightGap = this.getScaledGap('screen-right-gap', monitor); const screenBottomGap = this.getScaledGap('screen-bottom-gap', monitor); return screenTopGap || screenLeftGap || screenRightGap || screenBottomGap; } /** * @param {number} modMask a Clutter.ModifierType. * @returns whether the current event the modifier at `modMask`. */ static isModPressed(modMask) { return global.get_pointer()[2] & modMask; } /** * @returns {Layout[]} the layouts */ static getLayouts() { const userDir = GLib.get_user_config_dir(); const pathArr = [userDir, '/tiling-assistant/layouts.json']; const path = GLib.build_filenamev(pathArr); const file = Gio.File.new_for_path(path); if (!file.query_exists(null)) return []; const [success, contents] = file.load_contents(null); if (!success || !contents.length) return []; return JSON.parse(new TextDecoder().decode(contents)); } /** * @param {number|null} monitorNr determines which monitor the layout scales * to. Sometimes we want the monitor of the pointer (when using dnd) and * sometimes not (when using layouts with the keyboard shortcuts). * @returns {Rect[]} */ static getFavoriteLayout(monitorNr = null) { // I don't know when the layout may have changed on the disk(?), // so always get it anew. const monitor = monitorNr ?? global.display.get_current_monitor(); const favoriteLayout = []; const layouts = this.getLayouts(); const layout = layouts?.[Settings.getStrv('favorite-layouts')[monitor]]; if (!layout) return []; const activeWs = global.workspace_manager.get_active_workspace(); const workArea = new Rect(activeWs.get_work_area_for_monitor(monitor)); // Scale the rect's ratios to the workArea. Try to align the rects to // each other and the workArea to workaround possible rounding errors // due to the scaling. layout._items.forEach(({ rect: rectRatios }, idx) => { const rect = new Rect( workArea.x + Math.floor(rectRatios.x * workArea.width), workArea.y + Math.floor(rectRatios.y * workArea.height), Math.ceil(rectRatios.width * workArea.width), Math.ceil(rectRatios.height * workArea.height) ); favoriteLayout.push(rect); for (let i = 0; i < idx; i++) rect.tryAlignWith(favoriteLayout[i]); }); favoriteLayout.forEach(rect => rect.tryAlignWith(workArea)); return favoriteLayout; } /** * Shows the tiled rects of the top tile group. * * @returns {St.Widget[]} an array of St.Widgets to indicate the tiled rects. */ static async ___debugShowTiledRects() { const twm = (await import('./tilingWindowManager.js')).TilingWindowManager; const topTileGroup = twm.getTopTileGroup(); if (!topTileGroup.length) { Main.notify('Tiling Assistant', 'No tiled windows / tiled rects.'); return null; } const indicators = []; topTileGroup.forEach(w => { const indicator = new St.Widget({ style_class: 'tile-preview', opacity: 160, x: w.tiledRect.x, y: w.tiledRect.y, width: w.tiledRect.width, height: w.tiledRect.height }); Main.uiGroup.add_child(indicator); indicators.push(indicator); }); return indicators; } /** * Shows the free screen rects based on the top tile group. * * @returns {St.Widget[]} an array of St.Widgets to indicate the free * screen rects. */ static async ___debugShowFreeScreenRects() { const activeWs = global.workspace_manager.get_active_workspace(); const monitor = global.display.get_current_monitor(); const workArea = new Rect(activeWs.get_work_area_for_monitor(monitor)); const twm = (await import('./tilingWindowManager.js')).TilingWindowManager; const topTileGroup = twm.getTopTileGroup(); const tRects = topTileGroup.map(w => w.tiledRect); const freeScreenSpace = twm.getFreeScreen(tRects); const rects = freeScreenSpace ? [freeScreenSpace] : workArea.minus(tRects); if (!rects.length) { Main.notify('Tiling Assistant', 'No free screen rects to show.'); return null; } const indicators = []; rects.forEach(rect => { const indicator = new St.Widget({ style_class: 'tile-preview', x: rect.x, y: rect.y, width: rect.width, height: rect.height }); Main.uiGroup.add_child(indicator); indicators.push(indicator); }); return indicators.length ? indicators : null; } /** * Print the tile groups to the logs. */ static async __debugPrintTileGroups() { log('--- Tiling Assistant: Start ---'); const twm = (await import('./tilingWindowManager.js')).TilingWindowManager; const openWindows = twm.getWindows(); openWindows.forEach(w => { if (!w.isTiled) return; log(`Tile group for: ${w.get_wm_class()}`); const tileGroup = twm.getTileGroupFor(w); tileGroup.forEach(tw => log(tw.get_wm_class())); log('---'); }); log('--- Tiling Assistant: End ---'); } } /** * Wrapper for Mtk.Rectangle to add some more functions. */ export class Rect { /** * @param {...any} params No parameters, 1 Mtk.Rectangle or the x, y, * width and height values should be passed to the constructor. */ constructor(...params) { this._rect = new Mtk.Rectangle(); switch (params.length) { case 0: break; case 1: this._rect.x = params[0].x; this._rect.y = params[0].y; this._rect.width = params[0].width; this._rect.height = params[0].height; break; case 4: this._rect.x = params[0]; this._rect.y = params[1]; this._rect.width = params[2]; this._rect.height = params[3]; break; default: log('Tiling Assistant: Invalid param count for Rect constructor!'); } } /** * Gets a new rectangle where the screen and window gaps were * added/subbed to/from `this`. * * @param {Rect} workArea a tiled Rect * @param {number} monitor the number of the monitor to scale the gap to * @returns {Rect} the rectangle after the gaps were taken into account */ addGaps(workArea, monitor) { const screenTopGap = Util.getScaledGap('screen-top-gap', monitor); const screenLeftGap = Util.getScaledGap('screen-left-gap', monitor); const screenRightGap = Util.getScaledGap('screen-right-gap', monitor); const screenBottomGap = Util.getScaledGap('screen-bottom-gap', monitor); const singleScreenGap = Util.getScaledGap('single-screen-gap', monitor); const windowGap = Util.getScaledGap('window-gap', monitor); const r = this.copy(); // Prefer individual gaps if (Util.useIndividualGaps(monitor)) { [['x', 'width', screenLeftGap, screenRightGap], ['y', 'height', screenTopGap, screenBottomGap]] .forEach(([pos, dim, posGap, dimGap]) => { if (this[pos] === workArea[pos]) { r[pos] = this[pos] + posGap; r[dim] -= posGap; } else { r[pos] = this[pos] + windowGap / 2; r[dim] -= windowGap / 2; } if (this[pos] + this[dim] === workArea[pos] + workArea[dim]) r[dim] -= dimGap; else r[dim] -= windowGap / 2; }); // Use the single screen gap } else { [['x', 'width'], ['y', 'height']].forEach(([pos, dim]) => { if (this[pos] === workArea[pos]) { r[pos] = this[pos] + singleScreenGap; r[dim] -= singleScreenGap; } else { r[pos] = this[pos] + windowGap / 2; r[dim] -= windowGap / 2; } if (this[pos] + this[dim] === workArea[pos] + workArea[dim]) r[dim] -= singleScreenGap; else r[dim] -= windowGap / 2; }); } return r; } /** * Checks whether `this` borders another rectangle on this' east edge. * * @param {Rect} rect * @returns {boolean} */ bordersOnE(rect) { return this.vertOverlap && this.x2 === rect.x; } /** * Checks whether `this` borders another rectangle on this' south edge. * * @param {Rect} rect * @returns {boolean} */ bordersOnS(rect) { return this.horizOverlap && this.y2 === rect.y; } /** * @param {{x: number, y: number}} point * @returns {boolean} */ containsPoint(point) { return point.x >= this.x && point.x <= this.x2 && point.y >= this.y && point.y <= this.y2; } /** * @param {Rect|Mtk.Rectangle} rect * @returns {boolean} */ containsRect(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; return this._rect.contains_rect(rect); } /** * @returns {Rect} */ copy() { return new Rect(this._rect); } /** * @param {Rect|Mtk.Rectangle} rect * @returns {boolean} */ couldFitRect(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; return this._rect.could_fit_rect(rect); } /** * @param {Rect|Mtk.Rectangle} rect * @returns {boolean} */ equal(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; return this._rect.equal(rect); } /** * Gets the neighbor in the direction `dir` within the list of Rects * `rects`. * * @param {Direction} dir the direction that is looked into. * @param {Rect[]} rects an array of the available Rects. It may contain * `this` itself. The rects shouldn't overlap each other. * @param {boolean} [wrap=true] whether wrap is enabled, * if there is no Rect in the direction of `dir`. * @returns {Rect|null} the nearest Rect. */ getNeighbor(dir, rects, wrap = true) { // Since we can only move into 1 direction at a time, we just need // to check 1 axis / property of the rects per movement (...almost). // An example probably makes this clearer. If we want to get the // neighbor in the N direction, we just look at the y's of the rects. // More specifically, we look for the y2's ('cmprProp') of the other // rects which are bigger than the y1 ('startProp') of `this`. The // nearest neighbor has y2 == this.y1. i. e. the neighbor and `this` // share a border. There may be multiple windows with the same distance. // In our example it might happen, if 2 windows are tiled side by side // bordering `this`. In that case we choose the window, which is the // nearest on the non-compared axis ('nonCmprProp'). The x property // in the this example. let startProp, cmprProp, nonCmprProp; if (dir === Direction.N) [startProp, cmprProp, nonCmprProp] = ['y', 'y2', 'x']; else if (dir === Direction.S) [startProp, cmprProp, nonCmprProp] = ['y2', 'y', 'x']; else if (dir === Direction.W) [startProp, cmprProp, nonCmprProp] = ['x', 'x2', 'y']; else if (dir === Direction.E) [startProp, cmprProp, nonCmprProp] = ['x2', 'x', 'y']; // Put rects into a Map with their relevenat pos'es as the keys and // filter out `this`. const posMap = rects.reduce((map, rect) => { if (rect.equal(this)) return map; const pos = rect[cmprProp]; if (!map.has(pos)) map.set(pos, []); map.get(pos).push(rect); return map; }, new Map()); // Sort the pos'es in an ascending / descending order. const goForward = [Direction.S, Direction.E].includes(dir); const sortedPoses = [...posMap.keys()].sort((a, b) => goForward ? a - b : b - a); const neighborPos = goForward ? sortedPoses.find(pos => pos >= this[startProp]) : sortedPoses.find(pos => pos <= this[startProp]); if (!neighborPos && !wrap) return null; // Since the sortedPoses array is in descending order when 'going // backwards', we always wrap by getting the 0-th item, if there // is no actual neighbor. const neighbors = posMap.get(neighborPos ?? sortedPoses[0]); return neighbors.reduce((currNearest, rect) => { return Math.abs(currNearest[nonCmprProp] - this[nonCmprProp]) <= Math.abs(rect[nonCmprProp] - this[nonCmprProp]) ? currNearest : rect; }); } /** * Gets the rectangle at `index`, if `this` is split into equally * sized rects. This function is meant to prevent rounding errors. * Rounding errors may lead to rects not aligning properly and thus * messing up other calculations etc... This solution may lead to the * last rect's size being off by a few pixels compared to the other * rects, if we split `this` multiple times. * * @param {number} index the position of the rectangle we want after * splitting this rectangle. * @param {number} unitSize the size of 1 partial unit of the rectangle. * @param {Orientation} orientation determines the split orientation * (horizontally or vertically). * @returns {Rect} the rectangle at `index` after the split. */ getUnitAt(index, unitSize, orientation) { unitSize = Math.floor(unitSize); const isVertical = orientation === Orientation.V; const lastIndex = Math.round(this[isVertical ? 'width' : 'height'] / unitSize) - 1; const getLastRect = () => { const margin = unitSize * index; return new Rect( isVertical ? this.x + margin : this.x, isVertical ? this.y : this.y + margin, isVertical ? this.width - margin : this.width, isVertical ? this.height : this.height - margin ); }; const getNonLastRect = (remainingRect, idx) => { const firstUnitRect = new Rect( remainingRect.x, remainingRect.y, isVertical ? unitSize : remainingRect.width, isVertical ? remainingRect.height : unitSize ); if (idx <= 0) { return firstUnitRect; } else { const remaining = remainingRect.minus(firstUnitRect)[0]; return getNonLastRect(remaining, idx - 1); } }; if (index === lastIndex) return getLastRect(); else return getNonLastRect(this, index); } /** * @param {Rect|Mtk.Rectangle} rect * @returns {boolean} */ horizOverlap(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; return this._rect.horiz_overlap(rect); } /** * @param {Rect|Mtk.Rectangle} rect * @returns {[boolean, Rect]} */ intersect(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; const [ok, intersection] = this._rect.intersect(rect); return [ok, new Rect(intersection)]; } /** * Get the Rects that remain from `this`, if `r` is cut off from it. * * @param {Rect|Rect[]} r either a single Rect or an array of Rects. * @returns {Rect[]} an array of Rects. */ minus(r) { return Array.isArray(r) ? this._minusRectArray(r) : this._minusRect(r); } /** * Gets the Rects, which remain from `this` after `rect` was cut off * / subtracted from it. * * Original idea from: \ * https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Rectangle_difference \ * No license is given except the general CC-BY-AS (for text) mentioned * in the footer. Since the algorithm seems fairly generic (just a few * additions / substractions), I think I should be good regardless... * I've modified the algorithm to make the left / right result rects bigger * instead of the top / bottom rects since screens usually have horizontal * orientations; so having the vertical rects take priority makes more sense. * * @param {Rect} rect the Rect to cut off from `this`. * @returns {Rect[]} an array of Rects. It contains 0 - 4 rects. */ _minusRect(rect) { rect = rect instanceof Mtk.Rectangle ? new Rect(rect) : rect; if (rect.containsRect(this)) return []; const [intersect] = this.intersect(rect); if (!intersect) return [this.copy()]; const resultRects = []; // Left rect const leftRectWidth = rect.x - this.x; if (leftRectWidth > 0 && this.height > 0) resultRects.push(new Rect(this.x, this.y, leftRectWidth, this.height)); // Right rect const rightRectWidth = this.x2 - rect.x2; if (rightRectWidth > 0 && this.height > 0) resultRects.push(new Rect(rect.x2, this.y, rightRectWidth, this.height)); const vertRectsX1 = rect.x > this.x ? rect.x : this.x; const vertRectsX2 = rect.x2 < this.x2 ? rect.x2 : this.x2; const vertRectsWidth = vertRectsX2 - vertRectsX1; // Top rect const topRectHeight = rect.y - this.y; if (topRectHeight > 0 && vertRectsWidth > 0) resultRects.push(new Rect(vertRectsX1, this.y, vertRectsWidth, topRectHeight)); // Bottom rect const bottomRectHeight = this.y2 - rect.y2; if (bottomRectHeight > 0 && vertRectsWidth > 0) resultRects.push(new Rect(vertRectsX1, rect.y2, vertRectsWidth, bottomRectHeight)); return resultRects; } /** * Gets the Rects that remain from `this`, if a list of rects is cut * off from it. * * @param {Rect[]} rects the list of Rects to cut off from `this`. * @returns {Rect[]} an array of the remaining Rects. */ _minusRectArray(rects) { if (!rects.length) return [this.copy()]; // First cut off all rects individually from `this`. The result is an // array of leftover rects (which are arrays themselves) from `this`. const individualLeftOvers = rects.map(r => this.minus(r)); // Get the final result by intersecting all leftover rects. return individualLeftOvers.reduce((result, currLeftOvers) => { const intersections = []; for (const leftOver of currLeftOvers) { for (const currFreeRect of result) { const [ok, inters] = currFreeRect.intersect(leftOver); ok && intersections.push(new Rect(inters)); } } return intersections; }); } /** * @param {Rect|Mtk.Rectangle} rect * @returns {boolean} */ overlap(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; return this._rect.overlap(rect); } /** * Makes `this` stick to `rect`, if they are close to each other. Use it * as a last resort to prevent rounding errors, if you can't use minus() * or getUnitAt(). * * @param {Rect} rect the rectangle to align `this` with. * @param {number} margin only align, if `this` and the `rect` are at most * this far away. * @returns {Rect} a reference to this. */ tryAlignWith(rect, margin = 4) { rect = rect instanceof Mtk.Rectangle ? new Rect(rect) : rect; const equalApprox = (value1, value2) => Math.abs(value1 - value2) <= margin; if (equalApprox(rect.x, this.x)) this.x = rect.x; else if (equalApprox(rect.x2, this.x)) this.x = rect.x2; if (equalApprox(rect.y, this.y)) this.y = rect.y; else if (equalApprox(rect.y2, this.y)) this.y = rect.y2; if (equalApprox(rect.x, this.x2)) this.width = rect.x - this.x; else if (equalApprox(rect.x2, this.x2)) this.width = rect.x2 - this.x; if (equalApprox(rect.y, this.y2)) this.height = rect.y - this.y; else if (equalApprox(rect.y2, this.y2)) this.height = rect.y2 - this.y; return this; } /** * @param {Rect|Mtk.Rectangle} rect * @returns {Rect} */ union(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; return new Rect(this._rect.union(rect)); } /** * @param {Rect|Mtk.Rectangle} rect * @returns {boolean} */ vertOverlap(rect) { rect = rect instanceof Mtk.Rectangle ? rect : rect.meta; return this._rect.vert_overlap(rect); } /** * Getters */ get meta() { return this._rect.copy(); } get area() { return this._rect.area(); } get x() { return this._rect.x; } get x2() { return this._rect.x + this._rect.width; } get y() { return this._rect.y; } get y2() { return this._rect.y + this._rect.height; } get center() { return { x: this.x + Math.floor(this.width / 2), y: this.y + Math.floor(this.height / 2) }; } get width() { return this._rect.width; } get height() { return this._rect.height; } /** * Setters */ set x(value) { this._rect.x = Math.floor(value); } set x2(value) { this._rect.width = Math.floor(value) - this.x; } set y(value) { this._rect.y = Math.floor(value); } set y2(value) { this._rect.height = Math.floor(value) - this.y; } set width(value) { this._rect.width = Math.floor(value); } set height(value) { this._rect.height = Math.floor(value); } } Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/layouts_example.json000066400000000000000000000051451500466572600300720ustar00rootroot00000000000000[ { "_name": "Master and Stack [V]", "_items": [ { "rect": { "x": 0, "y": 0, "width": 0.5, "height": 1 }, "appId": null, "loopType": null }, { "rect": { "x": 0.5, "y": 0, "width": 0.5, "height": 1 }, "appId": null, "loopType": "h" } ] }, { "_name": "N-Columns", "_items": [ { "rect": { "x": 0, "y": 0, "width": 1, "height": 1 }, "appId": null, "loopType": "v" } ] }, { "_name": "2 : 1 [V]", "_items": [ { "rect": { "x": 0, "y": 0, "width": 0.66, "height": 1 }, "appId": null, "loopType": null }, { "rect": { "x": 0.66, "y": 0, "width": 0.34, "height": 1 }, "appId": null, "loopType": null } ] }, { "_name": "4 Quarters", "_items": [ { "rect": { "x": 0, "y": 0, "width": 0.5, "height": 0.5 }, "appId": null, "loopType": null }, { "rect": { "x": 0.5, "y": 0, "width": 0.5, "height": 0.5 }, "appId": null, "loopType": null }, { "rect": { "x": 0, "y": 0.5, "width": 0.5, "height": 0.5 }, "appId": null, "loopType": null }, { "rect": { "x": 0.5, "y": 0.5, "width": 0.5, "height": 0.5 }, "appId": null, "loopType": null } ] } ]Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/prefs/000077500000000000000000000000001500466572600250765ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/prefs/layoutRow.js000066400000000000000000000174101500466572600274440ustar00rootroot00000000000000import { Gdk, Gtk, GObject } from '../dependencies/prefs/gi.js'; import { _ } from '../dependencies/prefs.js'; import { Layout } from '../common.js'; import { LayoutRowEntry } from './layoutRowEntry.js'; /** * 1 LayoutRow represents 1 Layout in the preference window. It's just instanced * by layoutsPrefs.js (see that file for more details and general information * about layouts). 1 LayoutRow has a bunch of LayoutRowEntries, which each * represent a LayoutItem. A LayoutItem is a simple JS Object and has a * { rect, appId, loopType }. The rect is mandatory, the rest not. */ export const LayoutRow = GObject.registerClass({ GTypeName: 'TilingLayoutRow', Template: import.meta.url.replace(/prefs\/(.*)\.js$/, 'ui/$1.ui'), InternalChildren: [ 'addRowEntryButton', 'deleteButton', 'drawingArea', 'entryBox', 'errorLabel', 'expanderButton', 'nameEntry', 'rectCountLabel', 'shortcut', 'revealer' ], Signals: { 'changed': { param_types: [GObject.TYPE_BOOLEAN] } } }, class TilingLayoutRow extends Gtk.ListBoxRow { // Use a static variable to make sure the indices are unique since just using // something like the child index isn't enough because the user may add *and* // delete rows at random... so 1 child index may appear multiple times static instanceCount = 0; /** * @returns {number} the number of created LayoutRows since the last time * the layouts were loaded into the preference window. */ static getInstanceCount() { return TilingLayoutRow.instanceCount; } static resetInstanceCount() { TilingLayoutRow.instanceCount = 0; } /** * @param {{_name: string, _items: {rect: object, appId: ?string, loopType: ?string}[] * }|null} layout a parsed JS object representing a layout from the * layouts.json file. */ _init(layout, settings) { super._init(); this._settings = settings; this._layout = new Layout(layout); this._idx = TilingLayoutRow.instanceCount++; this._shortcutKey = `activate-layout${this._idx}`; // Initialize shortcut and its clear-button this._shortcut.initialize(this._shortcutKey, this._settings); // Set name. Don't use a placeholder, if there is one because of a bug // when reloading the layouts const name = this._layout.getName(); this._nameEntry.get_buffer().set_text(name, -1); this._nameEntry.set_placeholder_text(name ? '' : 'Nameless Layout...'); // Load the entries with values from the layout const items = this._layout.getItems(); items.forEach((item, idx) => { const rowEntry = new LayoutRowEntry(idx, item); rowEntry.connect('changed', this._onRowEntryChanged.bind(this)); this._entryBox.append(rowEntry); }); // Show the nr of rects for a quicker overview. this._rectCountLabel.set_label(items.length ? `(${items.length})` : ''); // Add one empty entry row this._onAddRowEntryButtonClicked(); // Update the preview / show the errorLabel this._updatePreview(); } destroy() { this.get_parent().remove(this); } activate() { this._nameEntry.grab_focus(); } /** * toggles whether the layout's rects are visible. */ toggleReveal() { this._revealer.reveal_child = !this._revealer.reveal_child; } /** * @returns {number} the index of this layout. */ getIdx() { return this._idx; } /** * @returns {{_name: string, _items: {rect: object, appId: ?string, loopType: ?string}[] * }|null} the layout object represented by this row. */ getLayout() { // First, filter out empty rows (i. e. rows without valid rects) this._layout.setItems(this._layout.getItems()); // Then, remove problematic items, if the rects have problems. E. g., // they may overlap each other, extend outside of the screen etc... // This is irreversible but fine since this function is only called // when the user presses the save button. Before that there will be // error messages shown in the preview area. let [ok, , idx] = this._layout.validate(); while (this._layout.getItemCount() && !ok) { this._layout.removeItem(idx); [ok, , idx] = this._layout.validate(); } return this._layout.getItemCount() ? this._layout : null; } /** * @returns {[boolean, string]} whether the preview was successful and a * potential error message. */ _updatePreview() { const [ok, errMsg] = this._layout.validate(); if (!ok) { // Print error in the preview area this._errorLabel.set_label(errMsg); this._drawingArea.set_draw_func(() => {}); } else { // Draw the actual preview for the rects this._errorLabel.set_label(''); this._drawingArea.set_draw_func((drawingArea, cr) => { const color = new Gdk.RGBA(); const width = drawingArea.get_allocated_width(); const height = drawingArea.get_allocated_height(); cr.setLineWidth(1.0); this._layout.getItems().forEach(item => { // Rects are in a slightly transparent white with a 1px outline // and a 5px gap between the different rects const rect = item.rect; color.parse('rgba(255, 255, 255, .2)'); Gdk.cairo_set_source_rgba(cr, color); cr.moveTo(rect.x * width + 5, rect.y * height + 5); cr.lineTo((rect.x + rect.width) * width - 5, rect.y * height + 5); cr.lineTo((rect.x + rect.width) * width - 5, (rect.y + rect.height) * height - 5); cr.lineTo(rect.x * width + 5, (rect.y + rect.height) * height - 5); cr.lineTo(rect.x * width + 5, rect.y * height + 5); cr.strokePreserve(); // Fill the rects in transparent black. // If the rect is a 'loop', lower the transparency. color.parse(`rgba(0, 0, 0, ${item.loopType ? .1 : .3})`); Gdk.cairo_set_source_rgba(cr, color); cr.fill(); }); cr.$dispose(); }); } this._drawingArea.queue_draw(); return [ok, errMsg]; } _onNameEntryChanged() { const name = this._nameEntry.get_buffer().get_text(); this._nameEntry.set_tooltip_text(name); this._layout.setName(name); const [ok] = this._layout.validate(); this.emit('changed', ok); } _onDeleteButtonClicked() { this._settings.set_strv(this._shortcutKey, []); this.emit('changed', true); this.destroy(); } _onExpanderButtonClicked() { this.toggleReveal(); } _onClearShortcutButtonClicked() { this._settings.set_strv(`activate-layout${this._idx}`, []); } _onAddRowEntryButtonClicked() { const rowEntry = new LayoutRowEntry(this._layout.getItemCount(), this._layout.addItem()); rowEntry.connect('changed', this._onRowEntryChanged.bind(this)); this._entryBox.append(rowEntry); } _onRowEntryChanged(entry, ok) { // ok only is about the change being ok for the *individual* entry // i. e. whether their format is correct if (!ok) { this.emit('changed', ok); return; } // allOk is about whether the guiEntries are also valid as a whole const [allOk] = this._updatePreview(); this.emit('changed', allOk); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js000066400000000000000000000104121500466572600304610ustar00rootroot00000000000000import { Gio, Gtk, GObject } from '../dependencies/prefs/gi.js'; import { _ } from '../dependencies/prefs.js'; /** * Multiple LayoutRowEntries make up a LayoutRow.js. See that file for more info. */ export const LayoutRowEntry = GObject.registerClass({ GTypeName: 'TilingLayoutRowEntry', Template: import.meta.url.replace(/prefs\/(.*)\.js$/, 'ui/$1.ui'), InternalChildren: [ 'rectEntry', 'rectLabel', 'rectAppButton' ], Signals: { 'changed': { param_types: [GObject.TYPE_BOOLEAN] } } }, class TilingLayoutRowEntry extends Gtk.Box { _init(idx, item) { super._init({ orientation: Gtk.Orientation.HORIZONTAL, spacing: 8 }); this._item = item; this._rectLabel.set_label(`Rect ${idx}`); const loop = item.loopType ? `--${item.loopType}` : ''; const rect = item.rect; const text = Object.keys(rect).length !== 0 ? `${rect.x}--${rect.y}--${rect.width}--${rect.height}${loop}` : ''; this._rectEntry.get_buffer().set_text(text, -1); // Show a placeholder on the first entry, if it's empty if (!text) { if (idx === 0) { // Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. const placeholder = _("'User Guide' for help..."); this._rectEntry.set_placeholder_text(placeholder); } else { this._rectEntry.set_placeholder_text('x--y--width--height[--h|v]'); } } const appInfo = item.appId && Gio.DesktopAppInfo.new(item.appId); const iconName = appInfo?.get_icon().to_string() ?? 'list-add-symbolic'; this._rectAppButton.set_icon_name(iconName); } _onAppButtonClicked() { // Reset app button, if it already has an app attached if (this._item.appId) { this._rectAppButton.set_icon_name('list-add-symbolic'); this._item.appId = null; this.emit('changed', true); // Attach app to the button } else { const chooserDialog = new Gtk.AppChooserDialog({ modal: true }); chooserDialog.get_widget().set({ show_all: true, show_other: true }); chooserDialog.connect('response', (dlg, id) => { if (id === Gtk.ResponseType.OK) { const appInfo = chooserDialog.get_widget().get_app_info(); const iconName = appInfo.get_icon().to_string(); this._rectAppButton.set_icon_name(iconName); this._item.appId = appInfo.get_id(); this.emit('changed', true); } chooserDialog.destroy(); }); chooserDialog.show(); } } /** * @param {Gtk.Entry} entry src of the event. */ _onRectEntryChanged(entry) { const text = entry.get_buffer().get_text(); const [ok] = this._validateFormat(text); if (ok) { const values = text.split('--'); this._item.rect = { x: parseFloat(values[0].trim()), y: parseFloat(values[1].trim()), width: parseFloat(values[2].trim()), height: parseFloat(values[3].trim()) }; this._item.loopType = values[4] || null; } else { this._item.rect = {}; this._item.loopType = null; } this.emit('changed', ok); } /** * Validates whether `text` follows the format \ * 'Float--Float--Float--Float[--String]' * * @param {string} text * @returns {[boolean, string]} whether the `text` is valid and a * potential error message. */ _validateFormat(text) { const values = text.split('--'); // 4 -> x, y, width, height; 5 -> additionally, a loopType if (values.length < 4 || values.length > 5) return [false, 'Wrong format: invalid count.']; const notJustNrs = ['x', 'y', 'width', 'height'].some((p, idx) => { return Number.isNaN(parseFloat(values[idx].trim())); }); return notJustNrs ? [false, 'Wrong format: only numbers are allowed.'] : [true, '']; } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/prefs/layoutsPrefs.js000066400000000000000000000230171500466572600301370ustar00rootroot00000000000000import { Gio, GLib } from '../dependencies/prefs/gi.js'; import { LayoutRow } from './layoutRow.js'; /** * This class takes care of everything related to layouts (at least on the * preference side). It's only being instanced by prefs.js. After that, it * loads / saves layouts from / to the disk and loads the gui for managing * layouts. The gui is created by instancing a bunch of Gtk.ListBoxRows from * layoutGui.js for each layout and putting them into a Gtk.ListBox from the * prefs.ui file. * * A popup layout has a name (String) and an array of LayoutItems (JS Objects). * A LayoutItem has a rect (JS Objects), an optional (String) appId and optional * loopType (String). Only the rect is a mandatory. The name lets the user * search for a layout with the 'Search popup layout' keybinding. The rectangle's * properties range from 0 to 1 (-> relative scale to the monitor). After a layout * is activated by the user, the 'Tiling Popup' will appear at every LayoutItem's * rect and ask the user which of the open windows they want to tile to that rect. * If a loopType is set, the Tiling Popup will keep spawning at that spot and * all tiled windows will evenly share that rect until the user cancels the tiling * popup. Only then will we jump to the next LayoutItem. Possible loopTypes: * horizontal ('h') or vertical (any other non-empty string). This allows the * user to create 'Master and Stack' type of layouts. If an appId is defined, * instead of the Tiling Popup appearing, a new instance of the app will be * opened and tiled to that rect (or at least I tried to do that). * * By default, the settings for layouts are hidden behind the 'Advanced / * Experimental' switch because I used a lot of hacks / assumptions... and * I am not even using the layouts myself. However, I don't want to remove * an existing feature... thus it's hidden */ export default class { constructor(settings, builder, path) { // Keep a reference to the settings for the shortcuts this._settings = settings; // The Gtk.ListBox, which LayoutRows are added to this._layoutsListBox = builder.get_object('layouts_listbox'); // Unique button to save changes made to all layouts to the disk. For // simplicity, reload from file after saving to get rid of invalid input. this._saveLayoutsButton = builder.get_object('save_layouts_button'); this._saveLayoutsButton.connect('clicked', () => { this._saveLayouts(); this._loadLayouts(); }); // Unique button to load layouts from the disk // (discarding all tmp changes) without any user prompt this._reloadLayoutsButton = builder.get_object('reload_layouts_button'); this._reloadLayoutsButton.connect('clicked', () => { this._loadLayouts(); }); // Unique button to add a new *tmp* LayoutRow this._addLayoutButton = builder.get_object('add_layout_button'); this._addLayoutButton.connect('clicked', () => { const row = this._createLayoutRow(LayoutRow.getInstanceCount()); row.toggleReveal(); }); // Bind the general layouts keyboard shortcuts. ['search-popup-layout'].forEach(key => { const shortcut = builder.get_object(key.replaceAll('-', '_')); shortcut.initialize(key, this._settings); }); // Finally, load the existing settings. this._loadLayouts(path); } _loadLayouts(path) { this._applySaveButtonStyle(''); this._forEachLayoutRow(row => row.destroy()); LayoutRow.resetInstanceCount(); // Try to load layouts file. const saveFile = this._makeFile(); const [success, contents] = saveFile.load_contents(null); if (!success) return; let layouts = []; // Custom layouts are already defined in the file. if (contents.length) { layouts = JSON.parse(new TextDecoder().decode(contents)); // Ensure at least 1 empty row otherwise the listbox won't have // a height but a weird looking shadow only. layouts.length ? layouts.forEach((layout, idx) => this._createLayoutRow(idx, layout)) : this._createLayoutRow(0); // Otherwise import the examples... but only do it once! // Use a setting as a flag. } else { const importExamples = 'import-layout-examples'; if (!this._settings.get_boolean(importExamples)) return; this._settings.set_boolean(importExamples, false); const exampleFile = this._makeFile(`${path}/src`, 'layouts_example.json'); const [succ, c] = exampleFile.load_contents(null); if (!succ) return; layouts = c.length ? JSON.parse(new TextDecoder().decode(c)) : []; layouts.forEach((layout, idx) => this._createLayoutRow(idx, layout)); this._saveLayouts(); } } _saveLayouts() { this._applySaveButtonStyle(''); const layouts = []; this._forEachLayoutRow(layoutRow => { const lay = layoutRow.getLayout(); if (lay) { layouts.push(lay); // Check, if all layoutRows were valid so far. Use getIdx() // instead of forEach's idx because a layoutRow may have been // deleted by the user. if (layoutRow.getIdx() === layouts.length - 1) return; // Invalid or empty layouts are ignored. For example, the user // defined a valid layout with a keybinding on row idx 3 but left // the row at idx 2 empty. When saving, the layout at idx 2 gets // removed and layout at idx 3 takes its place (i. e. becomes // idx 2). We need to update the keybindings to reflect that. const keys = this._settings.get_strv(`activate-layout${layoutRow.getIdx()}`); this._settings.set_strv(`activate-layout${layouts.length - 1}`, keys); this._settings.set_strv(`activate-layout${layoutRow.getIdx()}`, []); } else { // Remove keyboard shortcuts, if they aren't assigned to a // valid layout, because they won't be visible to the user // since invalid layouts get removed this._settings.set_strv(`activate-layout${layoutRow.getIdx()}`, []); } }); const saveFile = this._makeFile(); saveFile.replace_contents( JSON.stringify(layouts), null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null ); } /** * @param {string} [parentPath=''] path to the parent directory. * @param {string} [fileName=''] name of the layouts file. * @returns {object} the Gio.File. */ _makeFile(parentPath = '', fileName = '') { // Create directory structure, if it doesn't exist. const userConfigDir = GLib.get_user_config_dir(); const dirLocation = parentPath || GLib.build_filenamev([userConfigDir, '/tiling-assistant']); const parentDir = Gio.File.new_for_path(dirLocation); try { parentDir.make_directory_with_parents(null); } catch (e) { if (e.code !== Gio.IOErrorEnum.EXISTS) throw e; } // Create file, if it doesn't exist. const fName = fileName || 'layouts.json'; const filePath = GLib.build_filenamev([dirLocation, '/', fName]); const file = Gio.File.new_for_path(filePath); try { file.create(Gio.FileCreateFlags.NONE, null); } catch (e) { if (e.code !== Gio.IOErrorEnum.EXISTS) throw e; } return file; } /** * @param {string} [actionName=''] possible styles: 'suggested-action' * or 'destructive-action' */ _applySaveButtonStyle(actionName = '') { // The suggested-action is used to indicate that the user made // changes; the destructive-action, if saving will drop changes // (e. g. when changes were invalid) const actions = ['suggested-action', 'destructive-action']; const context = this._saveLayoutsButton.get_style_context(); actions.forEach(a => a === actionName ? context.add_class(a) : context.remove_class(a)); } /** * @param {number} index the index of the new layouts row. * @param {Layout} layout the parsed JS Object from the layouts file. */ _createLayoutRow(index, layout = null) { // Layouts are limited to 20 since there are only // that many keybindings in the schemas.xml file if (index >= 20) return; const layoutRow = new LayoutRow(layout, this._settings); layoutRow.connect('changed', (row, ok) => { // Un / Highlight the save button, if the user made in / valid changes. this._applySaveButtonStyle(ok ? 'suggested-action' : 'destructive-action'); }); this._layoutsListBox.append(layoutRow); return layoutRow; } _forEachLayoutRow(callback) { for (let i = 0, child = this._layoutsListBox.get_first_child(); !!child; i++) { // Get a ref to the next widget in case the curr widget // gets destroyed during the function call. const nxtSibling = child.get_next_sibling(); callback.call(this, child, i); child = nxtSibling; } } } Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js000066400000000000000000000163461500466572600310270ustar00rootroot00000000000000import { Adw, Gdk, GObject, Gtk } from '../dependencies/prefs/gi.js'; import { _ } from '../dependencies/prefs.js'; /** * A Widget to implement the shortcuts in the preference window. * It's an AdwActionRow, which contains a label showing the keybinding(s) * and a shortcut-clear-button. * * Some parts are from https://extensions.gnome.org/extension/2236/night-theme-switcher/. * _isBindingValid & _isKeyvalForbidden are straight up copied from its util.js * https://gitlab.com/rmnvgr/nightthemeswitcher-gnome-shell-extension/-/blob/main/src/utils.js */ export const ShortcutListener = GObject.registerClass({ GTypeName: 'ShortcutListener', Template: import.meta.url.replace(/prefs\/(.*)\.js$/, 'ui/$1.ui'), InternalChildren: ['keybindingLabel', 'clearButton', 'eventKeyController'], Properties: { keybinding: GObject.ParamSpec.string( 'keybinding', 'Keybinding', 'Key sequence', GObject.ParamFlags.READWRITE, null ) } }, class ShortcutListener extends Adw.ActionRow { /** * Only allow 1 active ShortcutListener at a time */ static isListening = false; static isAppendingShortcut = false; static listener = null; static listeningText = 'Press a shortcut...'; static appendingText = 'Append a new shortcut...'; /** * Starts listening for a keyboard shortcut. * * @param {ShortcutListener} shortcutListener the new active ShortcutListener */ static listen(shortcutListener) { if (shortcutListener === ShortcutListener.listener) return; ShortcutListener.stopListening(); shortcutListener.isActive = true; shortcutListener.setKeybindingLabel(ShortcutListener.listeningText); ShortcutListener.listener = shortcutListener; ShortcutListener.isListening = true; } /** * Stops listening for a keyboard shortcut. */ static stopListening() { if (!ShortcutListener.isListening) return; ShortcutListener.isListening = false; ShortcutListener.isAppendingShortcut = false; ShortcutListener.listener.isActive = false; ShortcutListener.listener.setKeybindingLabel(ShortcutListener.listener.getKeybindingLabel()); ShortcutListener.listener = null; } initialize(key, setting) { this._key = key; this._setting = setting; this.isActive = false; this.connect('realize', () => this.get_root().add_controller(this._eventKeyController)); this.keybinding = this._setting.get_strv(key) ?? []; } /* * Sets the label of the keybinding. */ setKeybindingLabel(label) { this._keybindingLabel.set_label(label); } /** * Gets the keybinding in a more pleasant to read format. * For example: [e,a] will become * 'Ctrl+Super+E / Super+A' or 'Disabled' * * @returns {string} */ getKeybindingLabel() { const kbLabel = this.keybinding.reduce((label, kb) => { const [, keyval, mask] = Gtk.accelerator_parse(kb); const l = Gtk.accelerator_get_label(keyval, mask); if (!label) return l; return l ? `${label} / ${l}` : label; }, ''); return kbLabel || _('Disabled'); } _onActivated() { this.isActive ? ShortcutListener.stopListening() : ShortcutListener.listen(this); } _onKeybindingChanged() { this._setting.set_strv(this._key, this.keybinding); this._clearButton.set_sensitive(this.keybinding.length); this.setKeybindingLabel(this.getKeybindingLabel()); } _onClearButtonClicked() { this.keybinding = []; ShortcutListener.stopListening(); } _onKeyPressed(eventControllerKey, keyval, keycode, state) { if (this !== ShortcutListener.listener) return Gdk.EVENT_PROPAGATE; let mask = state & Gtk.accelerator_get_default_mod_mask(); mask &= ~Gdk.ModifierType.LOCK_MASK; if (mask === 0) { switch (keyval) { case Gdk.KEY_BackSpace: this.keybinding = []; // falls through case Gdk.KEY_Escape: ShortcutListener.stopListening(); return Gdk.EVENT_STOP; case Gdk.KEY_KP_Enter: case Gdk.KEY_Return: case Gdk.KEY_space: ShortcutListener.isAppendingShortcut = !ShortcutListener.isAppendingShortcut; this.setKeybindingLabel(ShortcutListener.isAppendingShortcut ? ShortcutListener.appendingText : ShortcutListener.listeningText ); return Gdk.EVENT_STOP; } } if (!this._isBindingValid({ mask, keycode, keyval }) || !Gtk.accelerator_valid(keyval, mask)) return Gdk.EVENT_STOP; const sc = Gtk.accelerator_name_with_keycode(null, keyval, keycode, mask); this.keybinding = ShortcutListener.isAppendingShortcut ? [...this.keybinding, sc] : [sc]; ShortcutListener.stopListening(); return Gdk.EVENT_STOP; } /** * Checks, if the given key combo is a valid binding. * * @param {{mask: number, keycode: number, keyval:number}} combo An object * representing the key combo. * @returns {boolean} `true` if the key combo is a valid binding. */ _isBindingValid({ mask, keycode, keyval }) { if ((mask === 0 || mask === Gdk.ModifierType.SHIFT_MASK) && keycode !== 0) { if ( (keyval >= Gdk.KEY_a && keyval <= Gdk.KEY_z) || (keyval >= Gdk.KEY_A && keyval <= Gdk.KEY_Z) || (keyval >= Gdk.KEY_0 && keyval <= Gdk.KEY_9) || (keyval >= Gdk.KEY_kana_fullstop && keyval <= Gdk.KEY_semivoicedsound) || (keyval >= Gdk.KEY_Arabic_comma && keyval <= Gdk.KEY_Arabic_sukun) || (keyval >= Gdk.KEY_Serbian_dje && keyval <= Gdk.KEY_Cyrillic_HARDSIGN) || (keyval >= Gdk.KEY_Greek_ALPHAaccent && keyval <= Gdk.KEY_Greek_omega) || (keyval >= Gdk.KEY_hebrew_doublelowline && keyval <= Gdk.KEY_hebrew_taf) || (keyval >= Gdk.KEY_Thai_kokai && keyval <= Gdk.KEY_Thai_lekkao) || (keyval >= Gdk.KEY_Hangul_Kiyeog && keyval <= Gdk.KEY_Hangul_J_YeorinHieuh) || (keyval === Gdk.KEY_space && mask === 0) || this._isKeyvalForbidden(keyval) ) return false; } return true; } /** * Checks, if the given keyval is forbidden. * * @param {number} keyval The keyval number. * @returns {boolean} `true` if the keyval is forbidden. */ _isKeyvalForbidden(keyval) { const forbiddenKeyvals = [ Gdk.KEY_Home, Gdk.KEY_Left, Gdk.KEY_Up, Gdk.KEY_Right, Gdk.KEY_Down, Gdk.KEY_Page_Up, Gdk.KEY_Page_Down, Gdk.KEY_End, Gdk.KEY_Tab, Gdk.KEY_KP_Enter, Gdk.KEY_Return, Gdk.KEY_Mode_switch ]; return forbiddenKeyvals.includes(keyval); } }); Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/ui/000077500000000000000000000000001500466572600243745ustar00rootroot00000000000000Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/ui/layoutRow.ui000066400000000000000000000135621500466572600267470ustar00rootroot00000000000000 Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/ui/layoutRowEntry.ui000066400000000000000000000026471500466572600277730ustar00rootroot00000000000000 Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/ui/prefs.ui000066400000000000000000002206671500466572600260670ustar00rootroot00000000000000
Report a Bug prefs.open-bug-report User Guide prefs.open-user-guide License prefs.open-license Changelog prefs.open-changelog Advanced... prefs.open-hidden-settings
info-menu dialog-information-symbolic General view-app-grid-symbolic Tiling Popup Open after tiling a window Include apps from all workspaces False Tile Groups Disable Tile Groups Tiled windows will no longer adapt their size to other tiled windows nor be raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' and the Tiling Popup will also no longer work. Raise together A tile group is created when a window gets tiled. If a tiled window is raised, raise the other windows of its tile group as well App Switcher and Tiling Popup This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You may need to re-enable this or the other extension after toggling this setting Gaps Windows window_gap 500 2 8 Screen Edges single_screen_gap 500 2 8 Screen Edge Top screen_top_gap 500 2 8 Screen Edge Left screen_left_gap 500 2 8 Screen Edge Right screen_right_gap 500 2 8 Screen Edge Bottom screen_bottom_gap 500 2 8 Maximized Windows Dynamic Keybinding Behavior The keybindings to maximize and tile to the top/bottom/left/right may change their behavior based on the window's tiling state Disabled Don't change the keybindings' behavior dynamic_keybinding_disabled_button Window Focus Switch focus to the tiled window in the direction of the pressed shortcut dynamic_keybinding_window_focus_button dynamic_keybinding_disabled_button Tiling State Adapt the tiling state to the pressed shortcut. For instance, a window tiled to the right half will tile to the bottom-right quarter, if 'tile to bottom' is activated dynamic_keybinding_tiling_state_button dynamic_keybinding_disabled_button Tiling State (Windows) Like 'Tiling State' but if the window isn't tiled or is already tiled to the bottom and the 'tile to bottom' shortcut is activated, minimize the window dynamic_keybinding_tiling_state_windows_button dynamic_keybinding_disabled_button Favorite Layout Move the window along your favorite Layout dynamic_keybinding_favorite_layout_button dynamic_keybinding_disabled_button Focus Hint Disabled Do <i>not</i> indicate the focused window 1 disabled-focus-hint-button Outline Animation When the focus changes, temporarily outline the focused window. Maximized and fullscreen windows are exempt from this animated-outline-focus-hint-button disabled-focus-hint-button Upscale Animation When the focus changes, temporarily scale the focused window up. Maximized and fullscreen windows are exempt from this animated-upscale-focus-hint-button disabled-focus-hint-button Static Outline Indicate the focused window with a static outline unless it's maximized or in fullscreen. static-outline-focus-hint-button disabled-focus-hint-button Outline Style 'Border' is recommended if you use transparent windows Solid Background Border Outline Color focus_hint_color_button center Outline Size focus_hint_outline_size 50 1 8 Outline Border Radius focus_hint_outline_border_radius 50 1 8 Animations Tiling Untiling Default Window Movement Mode The movement mode that is activated when no modifier key is pressed Edge Tiling Moving the window to the screen edges or corners will open the default tile preview edge_tiling_checkbutton Adaptive Tiling Releasing the grab on a window while hovering over a tile will push the overlapped window(s) aside adaptive_tiling_checkbutton edge_tiling_checkbutton Favorite Layout The tile preview will stick to your favorite layout from the 'Layouts' page favorite_layout_checkbutton edge_tiling_checkbutton Ignore Tiling Assistant Use Edge Tiling without Tiling Assistant's features ignore_ta_checkbutton edge_tiling_checkbutton Other Monitor Switch Grace Period When a window is dragged to a new monitor the tile preview will stick to the old monitor for a very short time. This way you can tile windows by 'throwing' it towards any screen edge even if a monitor is bordering that edge. Low Performance Movement Mode Use this if there is a lag when moving windows around. This will however decrease the precision of the tile preview updates. Adapt 'Edge Tiling' to your Favorite Layout 'Adaptive Tiling' Move Mode Activator Disabled Ctrl Alt RMB Super 'Favorite Layout' Move Mode Activator Disabled Ctrl Alt RMB Super 'Ignore Tiling Assistant' Mode Activator Disabled Ctrl Alt RMB Super Vertical Edge Preview Trigger Area vertical_preview_area 5 500 5 10 Horizontal Edge Preview Trigger Area horizontal_preview_area 10 500 5 10 Inverse Top Screen Edge Action Timer toggle_maximize_tophalf_timer 300 1500 50 10 Inverse Top Screen Edge Action for Landscape Displays Inverse Top Screen Edge Action for Portrait Displays Keybindings preferences-desktop-keyboard-symbolic General Toggle 'Tiling Popup' Tile Editing Mode A keyboard-driven mode to manage your tiled windows Auto-Tile Un/tile the current window based on the visible tiles Toggle 'Always on Top' Toggle Maximization Toggle Vertical Maximization Toggle Horizontal Maximization Restore Window Size Move Window to Center Edge Tiling Tile to top Tile to bottom Tile to left Tile to right Corner Tiling Tile to top-left Tile to top-right Tile to bottom-left Tile to bottom-right Edge Tiling without Tiling Assistant Tile to top Tile to bottom Tile to left Tile to right Corner Tiling without Tiling Assistant Tile to top-left Tile to top-right Tile to bottom-left Tile to bottom-right Debugging Show Tiled Rects Show Free Screen Rects Layouts video-joined-displays-symbolic General Panel Indicator Search for a Layout Open a popup listing all the available layouts Layouts none center end 100 list-add-symbolic Add a new Layout. 100 media-floppy-symbolic Save the layouts to the disk. Invalid changes will be lost! 100 edit-undo-symbolic Reload the layouts from the disk - discarding all non-saved changes. go-previous-symbolic start start 6 6 center 1 12 vertical 96 dialog-warning-symbolic Advanced / Experimental Settings Show more settings in the main preference window Tiling-Assistant-52/tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui000066400000000000000000000026461500466572600303240ustar00rootroot00000000000000 Tiling-Assistant-52/tiling-assistant@leleat-on-github/stylesheet.css000066400000000000000000000002451500466572600260740ustar00rootroot00000000000000.tiling-layout-search-highlight { background-color: rgba(255, 255, 255, 0.1); border-radius: 20px; } .layout-shortcut .boxed-list { box-shadow: none; } Tiling-Assistant-52/translations/000077500000000000000000000000001500466572600172335ustar00rootroot00000000000000Tiling-Assistant-52/translations/cs.po000066400000000000000000001216521500466572600202070ustar00rootroot00000000000000# Czech translations for PACKAGE package. # Copyright (C) 2021 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Vojtěch Perník , 2021. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2021-08-03 01:02+0200\n" "Last-Translator: Vojtěch Perník \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Poedit 2.4.3\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "" #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Obecné" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Vyskakovací okno dlaždic" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Inverzní časovač akce horního okraje obrazovky" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Klávesové zkratky" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Přepnout \"Vyskakovací okno dlaždic\"" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Režim úprav dlaždic" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Automatické dlaždice" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Přepnout maximalizaci" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Dlaždice nahoře" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Dlaždice dole" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Dlaždice vlevo" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Dlaždice vpravo" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Dlaždice nahoře vlevo" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Dlaždice nahoře vpravo" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Dlaždice dole vlevo" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Dlaždice dole vpravo" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "" #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "" #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "" #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "" #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "" #~ msgid "Restore Window Size on" #~ msgstr "Obnovit velikost okna na" #~ msgid "Grab Start" #~ msgstr "začátku uchopení" #~ msgid "Grab End" #~ msgstr "konci uchopení" #~ msgid "Raise Tile Groups together" #~ msgstr "Zvedání skupin dlaždic dohromady" #~ msgid "Window Gaps" #~ msgstr "Mezery mezi okny" #~ msgid "Gaps on Maximized Windows" #~ msgstr "Mezery kolem maximalizovaných oknen" #~ msgid "" #~ "This setting is intended for Wayland users. Tiled windows may not " #~ "properly restore their size when they are being grabbed on Wayland.\n" #~ "\n" #~ "If that is the case, you can try 'Restore Window Size on Grab End' " #~ "instead." #~ msgstr "" #~ "Toto nastavení je určeno pro uživatele systému Wayland. Dlaždicová okna " #~ "nemusí správně obnovit svou velikost, když jsou uchopována na Waylandu.\n" #~ "\n" #~ "V takovém případě můžete místo toho vyzkoušet \"Obnovit velikost okna na " #~ "konci uchopení\"." #~ msgid "Inverse Top Screen Edge Action:" #~ msgstr "Inverzní akce horního okraje obrazovky:" #~ msgid "Landscape Displays" #~ msgstr "Displeje na šířku" #~ msgid "Portrait Displays" #~ msgstr "Displeje na výšku" #~ msgid "" #~ "The focused window will try to fill the free screen space as good as " #~ "possible based on the tiled windows around it." #~ msgstr "" #~ "Zaměřené okno se bude snažit co nejlépe vyplnit volný prostor na " #~ "obrazovce na základě okolních oken s dlaždicemi." #~ msgid " General " #~ msgstr " Obecné " #~ msgid " Side Tiling " #~ msgstr " Dlaždice na straně " #~ msgid " Corner Tiling " #~ msgstr " Dlaždice v rohu " #~ msgid "Tiling Assistant" #~ msgstr "Asistent dlaždicování" #~ msgid "" #~ "If you want to report a bug or need help,\n" #~ "\n" #~ "please open an issue on Github." #~ msgstr "" #~ "Pokud chcete nahlásit chybu, nebo potřebujete pomoc,\n" #~ "\n" #~ "prosím vytvořte issue na GitHubu." #~ msgid "" #~ "The GUIDE offers a detailed explanation of every " #~ "feature." #~ msgstr "" #~ "GUIDE nabízí detailní vysvětlení každého nastavení a " #~ "funkce." #~ msgid "" #~ "The CHANGELOG lists the differences between each " #~ "extension version." #~ msgstr "" #~ "CHANGELOG obsahuje seznam změn provedené mezi " #~ "jednotlivými verzemi rozšíření." #~ msgid "" #~ "This extension is licensed under the GNU General Public License, version 2 " #~ "or later and comes with NO WARRANTY. A copy of this " #~ "license can be found in the Github repository." #~ msgstr "" #~ "Toto rozšíření je licencováno pod GNU General Public License, verze 2 " #~ "nebo novější a není dodáváno s ŽÁDNOU ZÁRUKOU. Kopii " #~ "této licence naleznete v repozitáři na GitHubu." #~ msgid "Help" #~ msgstr "Nápověda" #~ msgid "Hidden Settings" #~ msgstr "Skrytá nastavení" #~ msgid "Tiling Popup: Current Workspace only" #~ msgstr "Vyskakovací okno dlaždic: Pouze aktuální pracovní plocha" #~ msgid "Tile Editing Mode: Focus Color" #~ msgstr "Režim úpravy dlaždic: Barva zaměření" #~ msgid "Tile Animations" #~ msgstr "Animace dlaždicování" #~ msgid "Untile Animations" #~ msgstr "Animace zrušení dlaždicování" Tiling-Assistant-52/translations/de_CH.po000066400000000000000000001261151500466572600205430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2022-03-19 12:06+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_CH\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Einen Fehler melden" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Benutzerhandbuch" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Lizenz" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Änderungsprotokoll" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Fortgeschrittene..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Allgemein" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Kachel Popup" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Nach dem Kacheln eines Fensters öffnen" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Anwendungen aus allen Arbeitsbereichen einbeziehen" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Kachel Gruppen" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Gemeinsam öffnen" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Eine Kachelgruppe wird erstellt, wenn ein Fenster gekachelt wird. Wenn ein " "gekacheltes Fenster geöffnet wird, werden auch die anderen Fenster der " "Kachelgruppe geöffnet" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "App Switcher und Kachel Popup" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Dies könnte zu Konflikten mit anderen App Switcher (auch bekannt als " "alt+Tab) Erweiterungen führen. Möglicherweise müssen Sie diese oder die " "andere Erweiterung wieder aktivieren, nachdem Sie diese Einstellung " "umgeschaltet haben" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Lücken" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Fenster" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Bildschirmränder" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Maximierte Fenster" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Dynamisches Tastenbindungsverhalten" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Deaktiviert" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Fenster Fokus" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Kachelzustand" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Kachelzustand (Windows)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Wie 'Kachelzustand', aber wenn das Fenster nicht gekachelt ist oder bereits " "bis zum unteren Rand gekachelt ist und die Tastenkombination 'bis zum " "unteren Rand kacheln' aktiviert ist, wird das Fenster minimiert" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Bevorzugtes Layout" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Verschieben Sie das Fenster entlang Ihres bevorzugten Layouts" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animationen" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Kacheln" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Entkacheln" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Standard-Fensterbewegungsmodus" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Kacheln an den Rand" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "Durch Verschieben des Fensters zu den Bildschirmrändern oder -ecken wird die " "Standardkachelvorschau geöffnet" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Adaptive Kacheln" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Das Loslassen eines Fensters, während der Mauszeiger über einer Kachel " "schwebt, schiebt das überlappende Fenster zur Seite" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "Die Kachelvorschau bleibt bei Ihrem bevorzugten Layout von der Seite " "'Layouts'" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "'Kacheln an den Rand' an Ihr bevorzugtes Layout anpassen" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Aktivator für den Verschiebemodus 'Adaptive Kacheln'" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Strg" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "RMB" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Aktivator für den Verschiebemodus 'Favorisiertes Layout'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "Vertikale Randvorschau Auslösebereich" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "Horizontale Randvorschau Auslösebereich" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Umgekehrter Timer für die Aktion am oberen Bildschirmrand" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "Umgekehrter Timer für die Aktion eines querformatigen Displays" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "Umgekehrter Timer für die Aktion eines hochformatigen Displays" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Tastenbindungen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Umschalten 'Kacheln Popup'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Kachelbearbeitungsmodus" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Ein tastaturbasierter Modus zur Verwaltung Ihrer gekachelten Fenster" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Auto-Kacheln" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" "Entkacheln oder kacheln des aktuellen Fensters anhand der sichtbaren Kacheln" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "Umschalten 'Immer oben'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Umschalten Maximierung" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Umschalten vertikale Maximierung" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Umschalten horizontale Maximierung" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Fenstergrösse wiederherstellen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Fenster in die Mitte verschieben" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Kachel nach oben" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Kacheln nach unten" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Kacheln nach links" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Kacheln nach rechts" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Kacheln in die Ecke" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Kacheln nach oben links" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Kacheln nach oben rechts" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Kacheln nach unten links" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Kacheln nach unten rechts" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Fehlersuche" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Gekachelte Rechtecke anzeigen" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Freie Rechtecke anzeigen" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Layouts" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Panel Anzeige" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Suche nach einem Layout" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Öffnet ein Popup mit allen verfügbaren Layouts" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Ein neues Layout hinzufügen." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "" "Das Layout auf der Festplatte speichern. Ungültige Änderungen gehen verloren!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" "Die Layouts werden von der Festplatte neu geladen, wobei alle nicht " "gespeicherten Änderungen verworfen werden." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Erweiterte / Experimentelle Einstellungen" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Ersetzen Sie die Tastenkombinationen. Drücken Sie die Leertaste oder die " "Eingabetaste, wenn Sie nach einer Tastenkombination suchen, um stattdessen " "eine neue an die vorhandenen Tastenkombinationen anzuhängen." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Tastenkombinationen löschen" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Kachel Popup aktiviert" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Kachel Popup wurde deaktiviert" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Keine gültigen Layouts definiert." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Popup Layouts: App nicht gefunden." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Schreiben um zu suchen..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Unbenanntes Layout..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "Der Kachelbearbeitungsmodus kann nicht aufgerufen werden, wenn kein " "Kachelfenster sichtbar ist." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "'Benutzerhandbuch' für Hilfe..." #~ msgid "Restore Window Size on" #~ msgstr "Fenstergrösse wiederherstellen auf" #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Bei gekachelten Fenstern kann es vorkommen, dass die Grösse auf Wayland " #~ "nicht korrekt wiederhergestellt wird. Wenn das der Fall ist, verwenden " #~ "Sie die Funktion 'Fenstergrösse am Greifende wiederherstellen'" #~ msgid "Grab Start" #~ msgstr "Greifen Start" #~ msgid "Grab End" #~ msgstr "Greifen Ende" #~ msgid "" #~ "The keyboard shortcuts to maximize and tile to the top, bottom, left, and " #~ "right won't change their behavior based on the window's tiling state" #~ msgstr "" #~ "Die Tastenkombinationen zum Maximieren und Kacheln nach oben, unten, " #~ "links und rechts ändern ihr Verhalten nicht mehr abhängig vom " #~ "Kachelzustand des Fensters" #~ msgid "" #~ "Switch focus to the tiled window in the direction of the pressed " #~ "shortcut, if there is one" #~ msgstr "" #~ "Den Fokus auf das gekachelte Fenster in Richtung der gedrückten " #~ "Tastenkombination umschalten, sofern eine solche vorhanden ist" #~ msgid "" #~ "Adapt the current window's tiling state to the pressed shortcut. For " #~ "instance, a window tiled to the right half will tile to the bottom-right " #~ "quarter, if 'tile to bottom' is activated" #~ msgstr "" #~ "Passt den Kachelzustand des aktuellen Fensters an das gedrückte " #~ "Tastenkürzel an. Zum Beispiel wird ein Fenster, das in der rechten Hälfte " #~ "gekachelt ist, in das rechte untere Viertel gekachelt, wenn 'Nach unten " #~ "kacheln' aktiviert ist" #~ msgid "Other Window Movement Settings" #~ msgstr "Weitere Einstellungen zur Fensterbewegung" #~ msgid "Show Changelog in Preferences after an Update" #~ msgstr "Changelog nach einem Update in den Voreinstellungen anzeigen" #~ msgid "Tiling Window Switcher" #~ msgstr "Kachel Fenster Umschalter" #~ msgid "Replace App Switcher" #~ msgstr "App Switcher ersetzen" #~ msgid "" #~ "Replace the App Switcher (a. k. a. Alt+Tab) with a window switcher, which " #~ "previews the windows and tile groups" #~ msgstr "" #~ "Ersetzen Sie den App Switcher (auch bekannt als Alt+Tab) durch einen " #~ "Fensterwechsler, der eine Vorschau der Fenster und Kachelgruppen zeigt" #~ msgid "Group Windows by App" #~ msgstr "Fenster nach Anwendung gruppieren" #~ msgid "" #~ "Windows of the same app are displayed as one item and can be cycled " #~ "through with the key above Tab" #~ msgstr "" #~ "Fenster der gleichen Anwendung werden als ein Element angezeigt und " #~ "können mit der Taste oberhalb von Tab durchgeblättert werden" #~ msgid "Hidden Settings" #~ msgstr "Versteckte Einstellungen" Tiling-Assistant-52/translations/de_DE.po000066400000000000000000001352121500466572600205370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2024-06-08 15:03+0200\n" "Last-Translator: Christian Lauinger \n" "Language-Team: \n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.4\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Einen Fehler melden" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Benutzerhandbuch" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Lizenz" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Änderungsprotokoll" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Fortgeschrittene..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Allgemein" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Kachel-Popup" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Nach dem Zuordnen eines Fensters öffnen" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Anwendungen aus allen Arbeitsbereichen einbeziehen" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Kachelgruppen" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Kachelgruppen deaktivieren" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" "Gekachelte Fenster passen ihre Größe nicht mehr an andere gekachelte Fenster " "an und werden nicht mehr gemeinsam vergrößert oder verändert.Die dynamische " "Tastenbindung 'Fensterfokus' und das Kachel-Popup funktionieren dann " "ebenfalls nicht mehr." #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Gemeinsam anheben" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Eine Kachelgruppe wird erstellt, wenn ein Fenster zugeordnet wird. Wenn ein " "zugeordnetes Fenster geöffnet wird, werden auch die anderen Fenster der " "Kachelgruppe geöffnet" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "App Switcher und Kachel-Popup" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Dies könnte zu Konflikten mit anderen App-Switcher-Erweiterungen (Alt+Tab) " "führen. Diese müssen möglicherweise erneut aktiviert werden, wenn diese " "Einstellung angeschaltet wurde" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Zwischenraum" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Fenster" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Bildschirmränder" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Bildschirmrand oben" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Bildschirmrand links" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Bildschirmrand rechts" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Bildschirmrand unten" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Maximierte Fenster" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Dynamisches Tastenbelegungsverhalten" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" "Die Tastenkombinationen zum Maximieren und Kacheln nach oben/unten/links/" "rechts können ihr Verhalten je nach Kachelzustand des Fensters ändern" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Deaktiviert" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "Das Verhalten der Tastenkombinationen nicht ändern" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Fenster-Fokus" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" "Fokus auf das gekachelte Fenster in Richtung des angeklickten Shortcuts " "umschalten" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Kachelzustand" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" "Passt den Kachelzustand an das gedrückte Tastenkürzel an. Beispielsweise " "wird ein zur rechten Hälfte gekacheltes Fenster zum rechten unteren Viertel " "gekachelt, wenn die Option 'Nach unten zuordnen' aktiviert ist" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Kachelzustand (Windows)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Wie 'Kachelzustand', aber wenn das Fenster nicht zugeordnet ist oder bereits " "am unteren Rand angeordnet ist und die Tastenkombination 'Zum unteren Rand " "zuordnen' aktiviert ist, wird das Fenster minimiert" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Favorisiertes Layout" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Verschiebt das Fenster entlang des favorisierten Layouts" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animationen" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Kacheln" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Entkacheln" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Standard-Fensterbewegungsmodus" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" "Der Bewegungsmodus, der aktiviert wird, wenn keine Modifikatortaste gedrückt " "wird" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "An den Rand zuordnen" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "Durch Verschieben des Fensters zu den Bildschirmrändern oder -ecken wird die " "Standardkachelvorschau geöffnet" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Dynamisches Zuordnen" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Das Loslassen eines Fensters, während der Mauszeiger über einer Kachel " "schwebt, schiebt das überlappende Fenster zur Seite" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "Die Kachelvorschau bleibt bei Ihrem bevorzugten Layout von der Seite " "'Layouts'" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Kachelassistent ignorieren" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "Verwendung von Kantenkachelung ohne die Funktionen vom Kachelassistent" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Andere" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Monitorwechsel Wartezeit" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" "Wenn ein Fenster auf einen neuen Monitor gezogen wird, bleibt die " "Kachelvorschau für eine sehr kurze Zeit auf dem alten Monitor aktiv. Auf " "diese Weise können Sie Fenster kacheln, indem Sie sie auf eine beliebige " "Bildschirmkanten 'werfen', selbst wenn ein Monitor an diese Kante angrenzt." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Bewegungsmodus mit geringer Leistung" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" "Verwenden Sie diese Funktion, wenn es beim Verschieben von Fenstern zu " "Verzögerungen kommt. Allerdings wird dadurch die Genauigkeit der " "Kachelvorschauaktualisierungen verringert." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "'An den Rand zuordnen' an Ihr bevorzugtes Layout anpassen" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Aktivator für den Verschiebemodus 'Dynamisches Zuordnen'" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Strg" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "RMB" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "Super" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Aktivator für den Verschiebemodus 'Favorisiertes Layout'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "'Ignoriere Kachel-Assistent' Modus Schalter" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "Vertikale Randvorschau Auslösebereich" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "Horizontale Randvorschau Auslösebereich" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Umgekehrter Timer für die Aktion am oberen Bildschirmrand" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "Umgekehrter Timer für die Aktion eines querformatigen Displays" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "Umgekehrter Timer für die Aktion eines hochformatigen Displays" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Tastenbelegung" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Umschalten 'Kacheln Popup'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Kachelbearbeitungsmodus" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Ein tastaturbasierter Modus zur Verwaltung der gekachelten Fenster" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Auto-Zuordnen" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" "Zuordnen oder Trennen des aktuellen Fensters anhand der sichtbaren Kacheln" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "Umschalten 'Immer oben'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Umschalten Maximierung" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Umschalten vertikale Maximierung" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Umschalten horizontale Maximierung" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Fenstergrösse wiederherstellen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Fenster in die Mitte verschieben" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Nach oben zuordnen" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Nach unten zuordnen" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Nach links zuordnen" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Nach rechts zuordnen" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "In die Ecke zuordnen" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Nach oben links zuordnen" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Nach oben rechts zuordnen" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Nach unten links zuordnen" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Nach unten rechts zuordnen" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Kantenkachelung ohne Assistent" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Eckenkachelung ohne Assistenz" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Debugging" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Gekachelte Rechtecke anzeigen" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Freie Rechtecke anzeigen" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Layouts" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Panel Anzeige" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Suche nach einem Layout" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Öffnet ein Popup mit allen verfügbaren Layouts" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Ein neues Layout hinzufügen." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "" "Das Layout auf der Festplatte speichern. Ungültige Änderungen gehen verloren!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" "Die Layouts werden von der Festplatte neu geladen, wobei alle nicht " "gespeicherten Änderungen verworfen werden." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Erweiterte / Experimentelle Einstellungen" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "Weitere Einstellungen in den Hauptmenü anzeigen" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Ersetzen Sie die Tastenkombinationen. Drücken Sie die Leertaste oder die " "Eingabetaste, wenn Sie nach einer Tastenkombination suchen, um stattdessen " "eine neue an die vorhandenen Tastenkombinationen anzuhängen." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Tastenkombinationen löschen" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Kachel Popup aktiviert" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Kachel Popup wurde deaktiviert" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Keine gültigen Layouts definiert." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Popup Layouts: App nicht gefunden." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Schreiben um zu suchen..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Unbenannte Layout..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "Voreinstellungen" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "Der Kachelbearbeitungsmodus kann nicht aufgerufen werden, wenn kein " "Kachelfenster sichtbar ist." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "'Benutzerhandbuch' für Hilfe..." #~ msgid "Active Window Hint" #~ msgstr "Aktiver Fensterhinweis" #~ msgid "Don't indicate the focused window" #~ msgstr "Das fokussierte Fenster nicht anzeigen" #~ msgid "Minimal" #~ msgstr "Minimal" #~ msgid "" #~ "Temporarily indicate the focused window when switching to a workspace " #~ "with multiple non-overlapping windows" #~ msgstr "" #~ "Vorübergehendes Anzeigen des fokussierten Fensters beim Wechsel zu einem " #~ "Arbeitsbereich mit mehreren sich nicht überlappenden Fenstern" #~ msgid "Always" #~ msgstr "Immer" #~ msgid "" #~ "Always indicate the focused window unless it's maximized or in " #~ "fullscreen. There are issues on Wayland with GTK4 popups" #~ msgstr "" #~ "Zeigt immer das fokussierte Fenster an, es sei denn, es ist maximiert " #~ "oder im Vollbildmodus. Es gibt Probleme unter Wayland mit GTK4 Popups" #~ msgid "Hint Color" #~ msgstr "Hinweisfarbe" #~ msgid "The color of the frame indicating the focused window" #~ msgstr "Die Farbe des Rahmens, der das fokussierte Fenster anzeigt" #~ msgid "Border Size" #~ msgstr "Rahmengröße" #~ msgid "" #~ "The border size of the frame indicating the focused window for the always " #~ "active hint" #~ msgstr "" #~ "Die Größe des Rahmens, der das fokussierte Fenster für den immer aktiven " #~ "Hinweis anzeigt" #~ msgid "Inner Border Size" #~ msgstr "Innere Rahmengröße" #~ msgid "" #~ "The border for the always active hint reaching inside the window frame. " #~ "This is meant to cover rounded corners. However, GTK4 popups on Wayland " #~ "will put the window behind the hint for whatever reason..." #~ msgstr "" #~ "Die Umrandung des immer aktiven Hinweises reicht bis in den " #~ "Fensterrahmen. Dies ist dazu gedacht, abgerundete Ecken abzudecken. " #~ "Allerdings werden GTK4-Popups unter Wayland das Fenster aus irgendeinem " #~ "Grund dahinter setzen..." #~ msgid "Restore Window Size on" #~ msgstr "Fenstergrösse wiederherstellen auf" #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Bei zugeordneten Fenstern kann es vorkommen, dass die Grösse auf Wayland " #~ "nicht korrekt wiederhergestellt wird. Wenn das der Fall ist, muss die " #~ "Funktion 'Fenstergrösse am Greifende wiederherstellen' genutzt werden." #~ msgid "Grab Start" #~ msgstr "Greifen Start" #~ msgid "Grab End" #~ msgstr "Greifen Ende" #~ msgid "" #~ "The keyboard shortcuts to maximize and tile to the top, bottom, left, and " #~ "right won't change their behavior based on the window's tiling state" #~ msgstr "" #~ "Die Tastenkombinationen zum Maximieren und Zuordnen nach oben, unten, " #~ "links und rechts ändern ihr Verhalten nicht mehr abhängig vom Zustand des " #~ "Fensters" #~ msgid "" #~ "Switch focus to the tiled window in the direction of the pressed " #~ "shortcut, if there is one" #~ msgstr "" #~ "Den Fokus auf das angeordnete Fenster in Richtung der gedrückten " #~ "Tastenkombination umschalten, sofern eine Tastenkombination definiert ist" #~ msgid "" #~ "Adapt the current window's tiling state to the pressed shortcut. For " #~ "instance, a window tiled to the right half will tile to the bottom-right " #~ "quarter, if 'tile to bottom' is activated" #~ msgstr "" #~ "Passt den Kachelzustand des aktuellen Fensters an das gedrückte " #~ "Tastenkürzel an. Zum Beispiel wird ein Fenster, das in der rechten Hälfte " #~ "angeordnet ist, in das rechte untere Viertel verschoben, wenn 'Nach unten " #~ "zuordnen' aktiviert ist." #~ msgid "Other Window Movement Settings" #~ msgstr "Weitere Einstellungen zur Fensterbewegung" #~ msgid "Show Changelog in Preferences after an Update" #~ msgstr "Changelog in den Einstellungen nach einem Update anzeigen" #~ msgid "Tiling Window Switcher" #~ msgstr "Kachel-Fenster-Switcher" #~ msgid "Replace App Switcher" #~ msgstr "App Switcher ersetzen" #~ msgid "" #~ "Replace the App Switcher (a. k. a. Alt+Tab) with a window switcher, which " #~ "previews the windows and tile groups" #~ msgstr "" #~ "Ersetzt den App Switcher (Alt+Tab) durch einen Fenster-Switcher, der eine " #~ "Vorschau der Fenster und Kachelgruppen zeigt" #~ msgid "Group Windows by App" #~ msgstr "Fenster nach Anwendung gruppieren" #~ msgid "" #~ "Windows of the same app are displayed as one item and can be cycled " #~ "through with the key above Tab" #~ msgstr "" #~ "Fenster der gleichen Anwendung werden als ein Element angezeigt und " #~ "können mit der Taste oberhalb von Tab durchgeblättert werden" #~ msgid "Hidden Settings" #~ msgstr "Versteckte Einstellungen" Tiling-Assistant-52/translations/es.po000066400000000000000000001316251500466572600202120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2022-12-03 18:38+0200\n" "Last-Translator: Sergio Varela \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 42.0\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Informar de un error" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Guía de usuario" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Licencia" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Registro de cambios" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Avanzado..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "General" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Ventana emergente de distribución en mosaico" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Abrir después de disponer en mosaico una ventana" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Incluir aplicaciones de todos los espacios de trabajo" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Grupos de ventanas en mosaico" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Desactivar los grupos de mosaicos" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Grupo en primer plano" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Se crea un grupo de ventanas cuando una ventana se dispone en mosaico . Si " "una de las ventanas del grupo pasa a primer plano, el resto también lo hacen" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "" "Conmutador de aplicaciones y ventana emergente de disposición en mosaico" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Esto podría entrar en conflicto con otras extensiones de conmutación de " "aplicaciones (también conocidas como Alt+Tab). Es posible que tenga que " "reactivar esta o la otra extensión después de modificar esta configuración" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Espaciado" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Ventanas" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Bordes de pantalla" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Borde de pantalla superior" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Borde de la pantalla izquierda" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Borde de la pantalla derecha" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Borde inferior de la pantalla" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Ventanas maximizadas" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Comportamiento dinámico de los atajos de teclado" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Desactivado" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "No cambie el comportamiento de los enlaces de las teclas" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Enfoque de ventana" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Estado de disposición en mosaico" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Estado de disposición en mosaico (Ventanas)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Igual que 'Estado de disposición en mosaico', con la diferencia de que si el " "atajo ''Disponer en mosaico en la parte inferior\" es activado y la ventana " "no está dispuesta en mosaico o lo está en la parte inferior, minimiza la " "ventana" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Distribución favorita" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Mueve la ventana de acuerdo a tu distribución favorita" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animaciones" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Al disponer la ventana en mosaico" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Al sacar la ventana del mosaico" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Modo de movimiento de la ventana por defecto" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Disposición en mosaico en los bordes de la pantalla" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "Al mover la ventana a los bordes o esquinas de la pantalla se abrirá la " "vista previa de disposición en mosaico por defecto" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Disposición en mosaico adaptativa" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Si se suelta una ventana mientras se pasa por encima de una ventana " "dispuesta en mosaico, se apartará la(s) ventana(s) superpuesta(s)" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "La vista previa de disposición en mosaico se ceñirá a tu distribución " "favorita de la página 'Distribuciones'" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Otro" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "" "Adaptar la 'Disposición en mosaico en el borde' a tu distibución favorita" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Activador del modo de movimiento 'Organización en mosaico adaptativa'" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "Botón derecho del ratón" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Activador del modo de movimiento 'Distribución favorita'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "Área de activación de la vista previa del borde vertical" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "Área de activación de la vista previa del borde horizontal" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Tiempo hasta conmutar la acción del borde superior" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "" "Acción en borde superior invertida para pantallas con disposición apaisada" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "" "Acción en borde superior invertida para pantallas con disposición vertical" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Atajos de teclado" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Activar/desactivar la \"Ventana emergente de disposición en mosaico\"" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Modo de edición de disposición en mosaico" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Un modo de manejo de las ventanas en mosaico mediante el teclado" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Auto-organizar en mosaico" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" "Disponer en mosaico o no la ventana actual en base a las ventanas en mosaico " "visibles" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "Activar/desactivar 'siempre encima'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Activar/desactivar el maximizado de la ventana" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Activar/desactivar el maximizado vertical de la ventana" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Activar/desactivar el maximizado horizontal de la ventana" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Restaurar el tamaño de la ventana" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Mover la ventana al centro" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Disponer en mosaico en el borde superior" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Disponer en mosaico en el borde inferior" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Disponer en mosaico en el borde izquierdo" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Disponer en mosaico en el borde derecho" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Disposición en mosaico en las esquinas de la pantalla" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Disponer en mosaico en la esquina superior izquierda" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Disponer en mosaico en la esquina superior derecha" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Disponer en mosaico en la esquina inferior izquierda" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Disponer en mosaico en la esquina inferior derecha" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Depuración" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Mostrar los rectángulos del mosaico" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Mostrar los rectángulos del espacio libre" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Distribuciones" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Mostrar indicador en el panel" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Buscar una distribución" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "" "Abre una ventana emergente con una lista de todas las distribuciones " "disponibles" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Añadir una nueva distribución." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "" "Guardar las distribuciones en el disco. ¡Los cambios no válidos se perderán!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" "Recargar las distribuciones desde el disco, descartando todos los cambios no " "guardados." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Ajustes avanzados/experimentales" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Reemplazar los atajos de teclado. Pulsa 'espacio' o 'retorno' mientras se " "está grabando un atajo para añadir uno nuevo a los atajos existentes." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Borrar los atajos de teclado" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Ventana emergente de disposición en mosaico habilitada" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "La ventana emergente de disposición en mosaico fue deshabilitada" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "No hay distribuciones válidas definidas." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Ventana emergente de distribuciones: aplicación no encontrada." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Escriba para buscar..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Distribución sin nombre..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "No se puede activar el 'Modo de edición de distribución en mosaico' si no " "hay una ventana en mosaico visible." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "Ver 'Guía de usuario' para obtener ayuda..." #~ msgid "Active Window Hint" #~ msgstr "Sugerencia de ventana activa" #~ msgid "Don't indicate the focused window" #~ msgstr "No indicar la ventana enfocada" #~ msgid "Minimal" #~ msgstr "Mínimo" #~ msgid "Always" #~ msgstr "Siempre" #~ msgid "Hint Color" #~ msgstr "Color del indicio" #~ msgid "The color of the frame indicating the focused window" #~ msgstr "El color del marco que indica la ventana enfocada" #~ msgid "Border Size" #~ msgstr "Tamaño de los bordes" #~ msgid "Inner Border Size" #~ msgstr "Tamaño del borde interior" #~ msgid "Restore Window Size on" #~ msgstr "Restaurar el tamaño de la ventana" #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Puede ocurrir que las ventanas en mosaico no restauraren correctamente su " #~ "tamaño en Wayland. Si ese es el caso, utiliza 'Restaurar el tamaño de la " #~ "ventana al soltar'" #~ msgid "Grab Start" #~ msgstr "al agarrar" #~ msgid "Grab End" #~ msgstr "al soltar" #~ msgid "" #~ "The keyboard shortcuts to maximize and tile to the top, bottom, left, and " #~ "right won't change their behavior based on the window's tiling state" #~ msgstr "" #~ "Los atajos de teclado para maximizar y posicionar la ventana en mosaico " #~ "en la parte superior, inferior, izquierda y derecha no cambiarán su " #~ "comportamiento en función de si la ventana está dispuesta en mosaico o no" #~ msgid "" #~ "Switch focus to the tiled window in the direction of the pressed " #~ "shortcut, if there is one" #~ msgstr "" #~ "Cambia el foco a la ventana en mosaico posicionada en la dirección del " #~ "acceso directo pulsado, si hay uno" #~ msgid "" #~ "Adapt the current window's tiling state to the pressed shortcut. For " #~ "instance, a window tiled to the right half will tile to the bottom-right " #~ "quarter, if 'tile to bottom' is activated" #~ msgstr "" #~ "Adapta el estado de disposición en mosaico de la ventana actual al atajo " #~ "pulsado. Por ejemplo, una ventana dispuesta en mosaico en la mitad " #~ "derecha se posicionará en el cuarto inferior derecho, si el atajo " #~ "\"Posicionar en mosaico en la parte inferior\" es activado" #~ msgid "Other Window Movement Settings" #~ msgstr "Otros ajustes del movimiento de ventanas" #~ msgid "Show Changelog in Preferences after an Update" #~ msgstr "" #~ "Mostrar el registro de cambios en las preferencias después de una " #~ "actualización" #~ msgid "Tiling Window Switcher" #~ msgstr "Conmutador de ventanas en mosaico" #~ msgid "Replace App Switcher" #~ msgstr "Reemplazar el conmutador de aplicaciones" #~ msgid "" #~ "Replace the App Switcher (a. k. a. Alt+Tab) with a window switcher, which " #~ "previews the windows and tile groups" #~ msgstr "" #~ "Reemplazar el conmutador de aplicaciones (también conocido como Alt+Tab) " #~ "por un conmutador de ventanas, que previsualiza las ventanas y los grupos " #~ "de ventanas en mosaico" #~ msgid "Group Windows by App" #~ msgstr "Agrupar ventanas por aplicación" #~ msgid "" #~ "Windows of the same app are displayed as one item and can be cycled " #~ "through with the key above Tab" #~ msgstr "" #~ "Las ventanas de una misma aplicación se muestran como un solo elemento y " #~ "se pueden recorrer con la tecla Tab" #~ msgid "Hidden Settings" #~ msgstr "Ajustes ocultos" Tiling-Assistant-52/translations/hu.po000066400000000000000000001310701500466572600202110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2023-02-28 20:11+0100\n" "Last-Translator: infeeeee \n" "Language-Team: \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.2.2\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Hiba jelentése" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Felhasználói dokumentáció" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Licensz" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Változásnapló" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Speciális..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Általános" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Csempéző felugró ablak" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Megnyitás egy ablak csempézése után" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Az összes munkaterületen szereplő ablak belevétele" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Csempe csoportok" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Csempe csoportok kikapcsolása" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" "Csempézett ablakok nem fognak alkalmazkodni más csempézett ablakokhoz, és " "nem fognak együtt sem előtérbe jönni, sem átméreteződni. A dinamikus " "gyorsbillentyű viselkedései közül az 'Ablak fókuszálása' és a Csempéző " "felugró ablak nem fog működni." #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Előtérbe hozás együtt" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Egy csempe csoport jön létre, amikor ablakok csempézésekor. Ha egy " "csempézett ablak előtérbe kerül, akkor a csoport többi tagja is vele együtt" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "Alkalmazásváltó és csempéző felugró ablak" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Összeütközhet más alkalmazásváltó (más néven Alt+Tab) kiterjesztésekkel. " "Ennek vagy a másik a kiterjesztésnek a ki-be kapcsolása lehet szükséges " "ennek a beállításnak a megváltoztatása után" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Hézagok" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Ablakok" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Képernyő szélek" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Képernyő felső széle" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Képernyő bal széle" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Képernyő jobb széle" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Képernyő alsó széle" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Maximalizált ablakok" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Dinamikus gyorsbillentyűk viselkedése" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" "A gyorsbillentyűk az ablakok maximalizálásához és fel/le/jobbra/balra " "csempézéséhez az ablak csempézettségétől függően máshogy működhetnek" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Kikapcsolva" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "A gyorsbillentyűk működése nem változik" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Ablak fókuszálása" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "A leütött gyorsbillentyű irányában levő ablak fókuszálása" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Csempézettség állapota" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" "A ablak csempézettség állapotától függ a gyorsbillentyű működése. Például, " "ha egy ablak a a képernyő jobb szélére van csempézve, akkor a képernyő jobb " "alsó sarkába fog ugrani a 'csempézés alulra' gyorsbillentyű használatakor" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Csempézettség állapota (ablakok)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Mint a 'csempézettség állapota', de ha az ablak nincs csempézve, vagy már " "alulra van csempézve a 'csempézés alulra' gyorsbillentyű megnyomásakor az " "ablak minimalizálódni fog" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Kedvenc elrendezés" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Ablak mozgatása a kedvenc elrendezés mentén" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animációk" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Csempézés" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Csempézés megszüntetése" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Alapértelmezett ablak mozgatási mód" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Szél csempézés" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "A képernyő széléhez húzott ablak az alapértelmezett csempe előnézetet nyitja " "meg" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Adaptív csempézés" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Ha az ablak egy csempe fölött lett elengedve, akkor odébb fogja tolni az " "átfedő ablakot, ablakokat" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "A csempe előnézet csak a kedvenc elrendezést fogja használni az " "'Elrendezések' oldalról" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Csempézési segéd mellőzése" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "Szél csempézés használata, a 'Tiling Assistant' funkciói nélkül" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Egyéb" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Monitorváltás türelmi ideje" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" "Egy ablak a új monitorra húzásakor, a csempe előnézet a régi monitorhoz fog " "ragadni egy nagyon rövid ideig. Így lehetséges az ablakok csempézése a " "képernyő széle felé való \"dobással\", még akkor is, ha egy másik monitor " "található azon az oldalon." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Alacsony teljesítményű mozgatás mód" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" "Ablakok mozgatásakor jelentkező késleltetéskor ajánlott bekapcsolni. Azonban " "ez a mód az előnézetek frissítésének a pontosságát is csökkenti." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "A 'szél csempézés' alkalmazása a kedvenc elrendezéshez" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "'Adaptív csempézés' mozgatási mód aktiválója" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "Jobbklikk" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "Szuper" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "'Kedvenc elrendezés' mozgatási mód aktiválója" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "'Csempézési segéd mellőzése' mód aktiválója" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "Függőleges szél előnézet aktiváló terület" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "Vízszintes szél előnézet aktiváló terület" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Fordított felső képernyő szél művelet időzítő" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "Fordított felső képernyő szél művelet fekvő kijelzőkhöz" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "Fordított felső képernyő szél művelet álló kijelzőkhöz" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Gyorsbillentyűk" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "'Csempéző felugró ablak' be/ki" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Csempe szerkesztő mód" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Billentyűzet vezérelt mód, a csempézett ablakok kezelésére" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Auto-csempézés" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" "Az aktuális ablak csempézése, vagy csempézés megszüntetése a látható csempék " "alapján" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "'Mindig felül' be/ki" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Maximalizálás be/ki" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Függőleges maximalizálás be/ki" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Vízszintes maximalizálás be/ki" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Ablak méretének visszaállítása" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Ablak középre mozgatása" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Csempézés felülre" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Csempézés alulra" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Csempézés balra" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Csempézés jobbra" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Sarok csempézés" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Csempézés bal felülre" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Csempézés jobb felülre" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Csempézés bal alulra" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Csempézés jobb alulra" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Szél csempézés használata 'Tiling Assistant' nélkül" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Sarok csempézés használata 'Tiling Assistant' nélkül" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Hibakeresés" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Csempézett téglalapok megjelenítése" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Üres képernyő téglalapok megjelenítése" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Elrendezések" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Jelző a felső sávon" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Elrendezés keresése" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Felugró ablak megnyitása az elérhető elrendezések listájával" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Új elrendezés hozzáadása." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "Elrendezés mentése a lemezre. Érvénytelen változások el fognak veszni!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" "Elrendezések újratöltése a lemezről, az el nem mentett változások " "elvetésével." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Speciális / Kísérleti beállítások" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "Több beállítás megjelenítése a beállítások ablakban" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Gyorsbillentyűk kicserélése. Gyorsbillentyűk megadásakor 'szóköz' vagy " "'enter' megnyomásával egy új gyorsbillentyű fűzése a meglévő mögé." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Gyorsbillentyűk eltávolítása" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Csempéző felugró ablak bekapcsolva" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Csempéző felugró ablak kikapcsolva" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Nem található érvényes elrendezés." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Felugró elrendezések: Alkalmazás nem található." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Kereséshez kezdjen el gépelni..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Névtelen elrendezés..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "Nem lehet a 'Csempe szerkesztő mód'-ba belépni, ha nincs egy ablak se " "csempézve." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "Felhasználói dokumentáció segíthet..." #~ msgid "Active Window Hint" #~ msgstr "Aktív ablak kiemelése" #~ msgid "Don't indicate the focused window" #~ msgstr "A fókuszált ablak megjelölésének kikapcsolása" #~ msgid "Minimal" #~ msgstr "Minimális" #~ msgid "" #~ "Temporarily indicate the focused window when switching to a workspace " #~ "with multiple non-overlapping windows" #~ msgstr "" #~ "A fókuszált ablak ideiglenesen megjelölése, több, egymást nem átfedő " #~ "ablakkal rendelkező munkaterületre váltásakor" #~ msgid "Always" #~ msgstr "Mindig" #~ msgid "" #~ "Always indicate the focused window unless it's maximized or in " #~ "fullscreen. There are issues on Wayland with GTK4 popups" #~ msgstr "" #~ "A fókuszált ablak megjelölése, hacsak nem maximalizált, vagy teljes " #~ "képernyős. Problémák fordulhatnak elő Wayland és GTK4 felugró ablakokkal" #~ msgid "Hint Color" #~ msgstr "Kiemelés színe" #~ msgid "The color of the frame indicating the focused window" #~ msgstr "A fókuszált ablak kiemelésének a színe" #~ msgid "Border Size" #~ msgstr "Szegély mérete" #~ msgid "" #~ "The border size of the frame indicating the focused window for the always " #~ "active hint" #~ msgstr "" #~ "A fókuszált ablakot kiemelő keret szegélyének a mérete a mindig aktív " #~ "kiemelésnél" #~ msgid "Inner Border Size" #~ msgstr "Belső szegély mérete" #~ msgid "" #~ "The border for the always active hint reaching inside the window frame. " #~ "This is meant to cover rounded corners. However, GTK4 popups on Wayland " #~ "will put the window behind the hint for whatever reason..." #~ msgstr "" #~ "A mindig aktív kiemeléshez tartozó szegély az ablak keretén belül. El " #~ "kellene takarnia a lekerekített sarkokat. Azonban GTK4 felugró ablakok " #~ "Waylanden az ablakot a kiemelés mögött jelenítik meg valamiért..." #~ msgid "Restore Window Size on" #~ msgstr "Ablakok méretének visszaállítása ilyenkor" #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Csempézett ablakok néha nem tudják megfelelően helyreállítani a méretüket " #~ "Waylanden. Ezt az 'Megfogás végén' funkció kiválasztásával megoldható" #~ msgid "Grab Start" #~ msgstr "Megfogás elején" #~ msgid "Grab End" #~ msgstr "Megfogás végén" Tiling-Assistant-52/translations/it_IT.po000066400000000000000000001366241500466572600206170ustar00rootroot00000000000000# Tiling-Assistant GNOME extension. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Andrea Brandi , 2022. # Albano Battistella , 2023,2024. # msgid "" msgstr "" "Project-Id-Version: Tiling-Assistant\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2024-10-23 12:11+0100\n" "Last-Translator: Albano Battistella \n" "Language-Team: Italian <>\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Gtranslator 40.0\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Segnala un bug" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Guida utente" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Licenza" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Registro modifiche" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Avanzate..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Generale" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Popup finestre affiancate" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Apri quando una finestra viene affiancata" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Includi app da tutte le aree di lavoro" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Gruppi finestre affiancate" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Disabilita i gruppi di finestre" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" "Le finestre affiancate non adatteranno più le loro dimensioni ad altre " "finestre affiancate né saranno sollevate o ridimensionate insieme. Il " "comportamento dinamico di associazione dei tasti 'Window Focus' e anche il " "Tiling Popup non funzionerà più." #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Primo piano di gruppo" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Quando una finestra è affiancata viene creato un gruppo di finestre. Se una " "finestra del gruppo viene messa in primo piano, anche le altre finestre del " "gruppo andranno in primo piano" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "Selettore app e finestre affiancate" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Questa opzione potrebbe entrare in conflitto con altre estensioni di " "selezione delle app (aka alt+Tab). Potrebbe essere necessario riattivare " "questa o le altre estensioni dopo averla abilitata." #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Spaziatura" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Finestre" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Bordi dello schermo" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Bordo dello schermo in alto" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Bordo dello schermo a sinistra" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Bordo dello schermo a destra" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Bordo dello schermo in basso" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Finestre massimizzate" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Scorciatoie dinamiche" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" "Le combinazioni di tasti per massimizzare e affiancare in alto/basso/" "sinistra/destra potrebbero cambiare il loro comportamento basato sullo stato " "di affiancamento della finestra" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Disabilita" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "Non modificare il comportamento delle associazioni dei tasti" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Stato attivo" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" "Passa lo stato attivo alla finestra affiancata nella direzione della " "scorciatoia premuta" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Stato affiancato" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" "Adatta lo stato di affiancamento alla scorciatoia premuta. Ad esempio, una " "finestra affiancata alla metà destra si affiancherà al quarto in basso a " "destra, se 'affianca in basso' è attivato" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Stato affiancato (finestre)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Agisce come \"Stato affiancato\" ma se la finestra non è affiancata o è già " "affiancata in basso e la scorciatoia \"affianca in basso\" è attiva, riduce " "a icona la finestra" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Layout preferito" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Sposta la finestra seguendo il layout preferito delle finestre" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "Suggerimento di messa a fuoco" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "Non indicare la finestra focalizzata" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "Animazione di contorno" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" "Quando cambia il focus, evidenzia temporaneamente la finestra focalizzata. " "Le finestre massimizzate e a schermo intero sono esenti da questo" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "Animazione raffinata" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" "Quando cambia il focus, ridimensiona temporaneamente la finestra " "focalizzata. Le finestre massimizzate e a schermo intero sono esenti da " "questo" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "Contorno statico" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" "Indica la finestra evidenziata con un contorno statico a meno che non sia " "ingrandita o a schermo intero." #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "Colore del contorno" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "Dimensione del contorno" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animazioni" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Affianca finestra" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Rimuovi affiancamento" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Modalità di movimento della finestra predefinita" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" "La modalità di movimento che viene attivata quando non viene premuto alcun " "tasto modificatore" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Affiancamento ai bordi" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "Spostando la finestra sui bordi o sugli angoli dello schermo si aprirà " "l'anteprima di affiancamento predefinita" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Affiancamento adattivo" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Mentre viene trascinata, rilasciare una finestra su una finestra già " "affiancata, spingerà da parte la finestra sovrapposta." #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "L'anteprima di affiancamento seguirà il layout preferito nella pagina " "\"Layout\"" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Ignora l'Assistente di affiancamento" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" "Usa affiancamento bordi senza le funzionalità dell'assistente di " "affiancamento" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Altro" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Monitora il periodo di tolleranza per il cambio" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" "Quando una finestra viene trascinata su un nuovo monitor, l'anteprima del " "riquadro si attaccherà al vecchio monitor per un tempo molto breve. In " "questo modo puoi affiancare le finestre 'lanciandole' verso qualsiasi bordo " "dello schermo anche se c'è un monitor confinante con quel bordo." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Modalità di movimento a basse prestazioni" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" "Usare questo se c'è un ritardo quando si spostano le finestre. Questo sarà " "comunque ridurrà la precisione degli aggiornamenti dell'anteprima del " "riquadro." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "Adatta \"Affiancamento ai bordi\" al layout preferito" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Per attivare la modalità \"Affiancamento adattivo\"" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "Tasto destro" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Per attivare la modalità \"Layout preferito\"" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "Ignora l'attivatore della modalità Tiling Assistant" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "Area di attivazione del bordo verticale" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "Area di attivazione del bordo orizzontale" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Timer dell'azione inversa nella parte superiore dello schermo" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "Azione inversa nella parte superiore degli schermi orizzontali" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "Azione inversa nella parte superiore degli schermi verticali" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Scorciatoie" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Attiva/disattiva \"Popup finestre affiancate\"" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Editor delle finestre affiancate" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Modalità guidata da tastiera per gestire le finestre affiancate" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Auto-affiancamento" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "Affianca/rimuove la finestra corrente in base ai riquadri visibili" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "Attiva/disattiva \"Sempre in primo piano\"" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Attiva/disattiva massimizza" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Attiva/disattiva massimizza in verticale" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Attiva/disattiva massimizza in orizzontale" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Ripristina le dimensioni della finestra" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Sposta la finestra al centro" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Affianca in alto" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Affianca in basso" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Affianca a sinistra" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Affianca a destra" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Affianca ad angolo" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Affianca in alto a sinistra" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Affianca in alto a destra" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Affianca in basso a sinistra" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Affianca in basso a destra" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Affiancamento dei bordi senza Tiling Assistant" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Affiancamento d'angolo senza Tiling Assistant" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Debug" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Mostra guide dei riquadri" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Mostra guide dello spazio libero" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Layout" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Indicatore del pannello" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Seleziona layout" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Apre un popup che elenca tutti i layout disponibili" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Aggiungi nuovo layout." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "Salva i layout sul disco. Le modifiche non valide andranno perdute!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "Ricarica i layout dal disco - elimina tutte le modifiche non salvate." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Impostazioni avanzate/sperimentali" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "Mostra più impostazioni nella finestra principale delle preferenze" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Sostituisci le scorciatoie. Premere \"spazio\" o \"invio\" mentre si " "registra una combinazione di tasti per aggiungerne una nuova a quelle " "esistenti." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Cancella scorciatoie" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Popup finestre affiancate abilitato" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Popup finestre affiancate disabilitato" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Nessun layout valido definito." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Layout popup: app non trovata." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Digita per cercare..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Layout senza nome..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "Impossibile avviare \"Editor delle finestre affiancate\", quando non è " "visibile alcuna finestra affiancata." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "\"Guida utente\" per assistenza..." #~ msgid "Active Window Hint" #~ msgstr "Suggerimento finestra attiva" #~ msgid "Don't indicate the focused window" #~ msgstr "Non indicare la finestra focalizzata" #~ msgid "Minimal" #~ msgstr "Minimale" #~ msgid "" #~ "Temporarily indicate the focused window when switching to a workspace " #~ "with multiple non-overlapping windows" #~ msgstr "" #~ "Indica temporaneamente la finestra focalizzata quando si passa a un'area " #~ "di lavoro con più finestre non sovrapposte" #~ msgid "Always" #~ msgstr "Sempre" #~ msgid "" #~ "Always indicate the focused window unless it's maximized or in " #~ "fullscreen. There are issues on Wayland with GTK4 popups" #~ msgstr "" #~ "Indica sempre la finestra focalizzata a meno che non sia ingrandita o a " #~ "schermo intero. Ci sono problemi su Wayland con i popup di GTK4" #~ msgid "Hint Color" #~ msgstr "Suggerimento colore" #~ msgid "The color of the frame indicating the focused window" #~ msgstr "Il colore del riquadro che indica la finestra attiva" #~ msgid "Border Size" #~ msgstr "Dimensione del bordo" #~ msgid "" #~ "The border size of the frame indicating the focused window for the always " #~ "active hint" #~ msgstr "" #~ "La dimensione del bordo della cornice che indica la finestra focalizzata " #~ "per il suggerimento sempre attivo" #~ msgid "Inner Border Size" #~ msgstr "Dimensione del bordo interno" #~ msgid "" #~ "The border for the always active hint reaching inside the window frame. " #~ "This is meant to cover rounded corners. However, GTK4 popups on Wayland " #~ "will put the window behind the hint for whatever reason..." #~ msgstr "" #~ "Il bordo per il suggerimento sempre attivo che si estende all'interno " #~ "della cornice della finestra. Questo ha lo scopo di coprire gli angoli " #~ "arrotondati. Tuttavia, i popup di GTK4 su Wayland metteranno la finestra " #~ "dietro il suggerimento per qualsiasi motivo..." #~ msgid "Restore Window Size on" #~ msgstr "Ripristina dimensione finestra a" #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Le finestre affiancate potrebbero non ripristinarsi correttamente su " #~ "Wayland. Se ciò accade, selezionare \"Ripristina dimensione finestra a " #~ "Fine trascinamento\"" #~ msgid "Grab Start" #~ msgstr "Inizio trascinamento" #~ msgid "Grab End" #~ msgstr "Fine trascinamento" #~ msgid "" #~ "The keyboard shortcuts to maximize and tile to the top, bottom, left, and " #~ "right won't change their behavior based on the window's tiling state" #~ msgstr "" #~ "Le scorciatoie per ingrandire e affiancare in alto, in basso, a sinistra " #~ "e a destra non cambieranno il loro comportamento in base allo stato di " #~ "affiancamento della finestra" #~ msgid "" #~ "Switch focus to the tiled window in the direction of the pressed " #~ "shortcut, if there is one" #~ msgstr "" #~ "Sposta lo stato attivo sulla finestra affiancata nella direzione " #~ "indicata, se presente" #~ msgid "" #~ "Adapt the current window's tiling state to the pressed shortcut. For " #~ "instance, a window tiled to the right half will tile to the bottom-right " #~ "quarter, if 'tile to bottom' is activated" #~ msgstr "" #~ "Adatta lo stato di affiancamento della finestra corrente alla " #~ "scorciatoia. Ad esempio, una finestra affiancata a destra verrà " #~ "affiancata in basso a destra quando l'opzione \"affianca in basso\" è " #~ "attiva" #~ msgid "Other Window Movement Settings" #~ msgstr "Altre impostazioni di movimento della finestra" #~ msgid "Show Changelog in Preferences after an Update" #~ msgstr "Mostra Registro modifiche nelle Preferenze dopo un aggiornamento" #~ msgid "Tiling Window Switcher" #~ msgstr "Selettore finestre affiancate" #~ msgid "Replace App Switcher" #~ msgstr "Sostituisci selettore app" #~ msgid "" #~ "Replace the App Switcher (a. k. a. Alt+Tab) with a window switcher, which " #~ "previews the windows and tile groups" #~ msgstr "" #~ "Sostituisci selettore app (aka Alt+Tab) con un selettore che mostra le " #~ "anteprime delle finestre e dei gruppi di finestre affiancate" #~ msgid "Group Windows by App" #~ msgstr "Raggruppa le finestre per app" #~ msgid "" #~ "Windows of the same app are displayed as one item and can be cycled " #~ "through with the key above Tab" #~ msgstr "" #~ "Le finestre della stessa app vengono visualizzate come un singolo " #~ "elemento e possono essere selezionate con il tasto sopra Tab" #~ msgid "Hidden Settings" #~ msgstr "Impostazioni nascoste" Tiling-Assistant-52/translations/ja.po000066400000000000000000001263461500466572600202010ustar00rootroot00000000000000# Japanese translations for Tiling-Assistant # Copyright (C) 2021 THE Tiling-Assistant'S COPYRIGHT HOLDER # This file is distributed under the same license as the Tiling-Assistant package. # k-fog , 2021. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2021-11-03 17:47+0900\n" "Last-Translator: k-fog \n" "Language-Team: Japanese <>\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "バグの報告" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "ユーザーガイド" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "ライセンス" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "変更ログ" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "高度な設定" #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "一般" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "タイリングポップアップ" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "ウィンドウの整列時に表示" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "全てのワークスペースのアプリケーションを含む" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "タイルグループ" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "タイルグループのフォーカスを同期する" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "隙間" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "ウィンドウ" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "画面端" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "最大化されたウィンドウ" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "動的なキーバインドの動作" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "無効" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "ウィンドウフォーカス" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "整列状態" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "整列状態(ウィンドウ)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "基本動作は[整列状態]と同じですが、もしウィンドウが整列されていないか、すでに" "下に配置されている状態で[下に配置]が実行された場合、ウィンドウを最小化しま" "す。" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "お気に入りのレイアウト" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "お気に入りのレイアウトに従ってウィンドウを移動" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "アニメーション" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "整列時" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "整列解除時" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "端に配置" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "ウィンドウを画面端または角に移動すると、デフォルトのタイルプレビューを表示す" "る" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "マウス右ボタン" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "上下の整列プレビュー反応範囲" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "左右の整列プレビュー反応範囲" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "画面上端での動作切り替え時間" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "横長の画面で画面上端での動作を逆にする" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "縦長の画面で画面上端での動作を逆にする" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "キーバインド" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "[タイリングポップアップ]の切り替え" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "タイル編集モード" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "整列したウィンドウをキーボードで操作するモード" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "最大化切り替え" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "上に配置" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "下に配置" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "左に配置" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "右に配置" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "角に配置" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "左上に配置" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "右上に配置" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "左下に配置" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "右下に配置" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "レイアウト" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "レイアウトを探す" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "新しいレイアウトを追加" #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "レイアウトを保存する(無効な設定は失われます!)" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "保存されていない変更を破棄し、レイアウトを再読込する。" #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "高度な/実験な機能の設定" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "タイリングポップアップが有効になりました" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "タイリングポップアップが無効になりました" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "ポップアップレイアウト:アプリケーションが見つかりません" #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "入力して検索..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "無題のレイアウト..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "整列されたウィンドウが表示されていない場合、[タイル編集モード]に切り替えられ" "ません。" #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "[ユーザーガイド]からヘルプを参照..." #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Waylandでは、整列されたウィンドウが適切にサイズを復元できない場合がありま" #~ "す。その場合、'Restore Window Size on Grab End'を使用してください。" #~ msgid "" #~ "The keyboard shortcuts to maximize and tile to the top, bottom, left, and " #~ "right won't change their behavior based on the window's tiling state" #~ msgstr "" #~ "最大化や上下左右への配置を行うキーボードショートカットは、ウィンドウの整列" #~ "状態に応じて動作を変えません。" #~ msgid "" #~ "Switch focus to the tiled window in the direction of the pressed " #~ "shortcut, if there is one" #~ msgstr "" #~ "押されたショートカットの方向に整列したウィンドウがある場合、そのウィンドウ" #~ "にフォーカスを切り替えます" #~ msgid "" #~ "Adapt the current window's tiling state to the pressed shortcut. For " #~ "instance, a window tiled to the right half will tile to the bottom-right " #~ "quarter, if 'tile to bottom' is activated" #~ msgstr "" #~ "現在のウィンドウの整列状態を、押されたショートカットに適応させます。例え" #~ "ば、右半分に配置されたウィンドウは、[下に配置]が実行された場合、右下に配置" #~ "されます" #~ msgid "Show Changelog in Preferences after an Update" #~ msgstr "アップデート後、設定画面に変更ログを表示" #~ msgid "Hidden Settings" #~ msgstr "隠されし設定" #~ msgid "Split Tiles" #~ msgstr "タイルを分割" #~ msgid "" #~ "Your favorite layout will be used as the 'Favorite Layout' when moving a " #~ "window." #~ msgstr "" #~ "あなたのお気に入りのレイアウトは、ウィンドウを移動した時、[お気に入りのレ" #~ "イアウト]として使用されるようになります。" #~ msgid "Keyboard Shortcuts" #~ msgstr "キーボードショートカット" #~ msgid "Change favorite Layout" #~ msgstr "お気に入りのレイアウトを変更" #~ msgid "Moving Windows" #~ msgstr "ウィンドウの移動" #~ msgid "No valid popup layouts defined." #~ msgstr "有効なポップアップレイアウトが定義されていません" #~ msgid "Raise Tile Groups together" #~ msgstr "タイルグループのフォーカスを同期する" #~ msgid "Window Gaps" #~ msgstr "ウィンドウ間の隙間" #~ msgid "Gaps on Maximized Windows" #~ msgstr "最大化されたウィンドウの隙間" #~ msgid "" #~ "This setting is intended for Wayland users. Tiled windows may not " #~ "properly restore their size when they are being grabbed on Wayland.\n" #~ "\n" #~ "If that is the case, you can try 'Restore Window Size on Grab End' " #~ "instead." #~ msgstr "" #~ "この設定はWaylandユーザーのためのものです。Waylandでは、整列されたウィンド" #~ "ウが適切にサイズを復元できない場合があります。\n" #~ "\n" #~ "その場合、代わりに'Restore Window Size on Grab End'を試すことができます。" #~ msgid "Inverse Top Screen Edge Action:" #~ msgstr "画面上端での動作を入れ替える" #~ msgid "Landscape Displays" #~ msgstr "横長の画面" #~ msgid "Portrait Displays" #~ msgstr "縦長の画面" #~ msgid " General " #~ msgstr " 一般 " #~ msgid "Hidden Settings" #~ msgstr "隠されし設定" #~ msgid "Tiling Popup: Current Workspace only" #~ msgstr "タイリングポップアップ:現在のワークスペースのみ" #~ msgid "Tile Editing Mode: Focus Color" #~ msgstr "タイル編集モード:フォーカス色" #~ msgid "Tile Animations" #~ msgstr "タイル化アニメーション" #~ msgid "Untile Animations" #~ msgstr "タイル化解除アニメーション" #~ msgid "Vertical Tile Preview Trigger Area" #~ msgstr "上下整列プレビュー反応範囲" #~ msgid "Horizontal Tile Preview Trigger Area" #~ msgstr "左右整列プレビュー反応範囲" Tiling-Assistant-52/translations/main.pot000066400000000000000000001116651500466572600207150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-05-01 14:39+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "" #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "" #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "" #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "" #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "" #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "" Tiling-Assistant-52/translations/nl.po000066400000000000000000001256641500466572600202220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2022-12-03 18:48+0100\n" "Last-Translator: Philip Goto \n" "Language-Team: \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1.1\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Probleem rapporteren" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Gebruikershandleiding" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Licentie" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Wijzigingslogboek" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Geavanceerd…" #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Algemeen" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Tegelpop-upvenster" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Openen na tegelen venster" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Apps van alle werkbladen tonen" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Tegelgroepen" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Tegelgroepen uitschakelen" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Samen naar voren brengen" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "App-wisselaar en tegelingspop-up" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Ruimtes" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Vensters" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Schermranden" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Schermrand boven" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Schermrand links" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Schermrand rechts" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Schermrand onder" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Gemaximaliseerde vensters" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Dynamisch sneltoetsgedrag" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Uitgeschakeld" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Vensterfocus" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Tegelstatus" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Tegelstatus (Windows)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Favoriete indeling" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animaties" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Tegelen" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Onttegelen" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Standaardvensterbeweginsmodus" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Randtegeling" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Adaptieve tegeling" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Tegelingsassistent negeren" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Overig" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Wachttijd bij schermwissel" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Bewegingsmodus met lage prestaties" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "RMK" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "Super" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Randactie op bovenste beeldscherm omdraaien - Tijdklok" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Sneltoetsen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Tegelpop-upvenster tonen/verbergen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Tegelbewerkmodus" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Automatisch tegelen" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "Het huidige venster (ont)tegelen gebaseerd op zichtbare tegels" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "‘Altijd voorop’ omschakelen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Maximaliseren omschakelen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Verticale maximalisatie omschakelen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Horizontale maximalisatie omschakelen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Venstergrootte herstellen" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Venster naar midden verplaatsen" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Naar boven tegelen" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Naar onder tegelen" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Naar links tegelen" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Naar rechts tegelen" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Hoektegeling" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Naar linksboven tegelen" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Naar rechtsboven tegelen" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Naar linksonder tegelen" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Naar rechtsonder tegelen" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Randtegeling zonder tegelingsassistent" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Hoektegeling zonder tegelingsassistent" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Foutopsporing" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Indelingen" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Paneelindicator" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Naar indeling zoeken" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Voeg een nieuwe indeling toe." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Geavanceerde/experimentele instellingen" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Tegelingspop-up ingeschakeld" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Tegelingspop-up is uitgeschakeld" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Geen geldige indelingen gedefinieerd." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "" #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Typ om te zoeken…" #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Naamloze indeling…" #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "‘Gebruikershandleiding’ voor hulp…" #~ msgid "Active Window Hint" #~ msgstr "Hint van actieve venster" #~ msgid "Minimal" #~ msgstr "Minimaal" #~ msgid "Always" #~ msgstr "Altijd" #~ msgid "Hint Color" #~ msgstr "Hintkleur" #~ msgid "Border Size" #~ msgstr "Randbreedte" #~ msgid "Inner Border Size" #~ msgstr "Binnenste randbreedte" #~ msgid "Restore Window Size on" #~ msgstr "Vensterafmetingen herstellen bij" #~ msgid "Grab Start" #~ msgstr "Vastpakpositie" #~ msgid "Grab End" #~ msgstr "Einde van vastpakpositie" #~ msgid "Raise Tile Groups together" #~ msgstr "Tegelgroepen tegelijk focussen" #~ msgid "Focus" #~ msgstr "Focus" #~ msgid "Window Gaps" #~ msgstr "Ruimte tussen vensters" #~ msgid "Gaps on Maximized Windows" #~ msgstr "Ruimte tussen gemaximaliseerde vensters" #~ msgid "" #~ "This setting is intended for Wayland users. Tiled windows may not " #~ "properly restore their size when they are being grabbed on Wayland.\n" #~ "\n" #~ "If that is the case, you can try 'Restore Window Size on Grab End' " #~ "instead." #~ msgstr "" #~ "Deze optie is bedoeld voor Wayland-gebruikers. Getegelde vensters worden " #~ "mogelijk niet goed hersteld als ze door Wayland worden onderschept.\n" #~ "\n" #~ "Als dat het geval is, probeer dan de optie ‘Vensterafmetingen herstellen " #~ "bij vastpakken van uiteinde’." #~ msgid "Inverse Top Screen Edge Action:" #~ msgstr "Randactie op bovenste beeldscherm omdraaien:" #~ msgid "Landscape Displays" #~ msgstr "Horizontale beeldschermen" #~ msgid "Portrait Displays" #~ msgstr "Verticale beeldschermen" #~ msgid "" #~ "The focused window will try to fill the free screen space as good as " #~ "possible based on the tiled windows around it." #~ msgstr "" #~ "Het gefocuste venster zal trachten de vrij schermruimte zo goed mogelijk " #~ "te benutten op basis van naburige vensters." #~ msgid " General " #~ msgstr " Algemeen " #~ msgid " Side Tiling " #~ msgstr " Zijwaarts tegelen " #~ msgid " Corner Tiling " #~ msgstr " Hoektegelen " #~ msgid "Tiling Assistant" #~ msgstr "Tegelassistent" #~ msgid "" #~ "If you want to report a bug or need help,\n" #~ "\n" #~ "please open an issue on Github." #~ msgstr "" #~ "Als u een bug wilt melden of hulp wilt vragen,\n" #~ "\n" #~ "dan kunt u een ‘issue’ openen op GitHub." #~ msgid "" #~ "List of known INCOMPATIBLE apps/extensions/limitations." #~ msgstr "" #~ "Lijst met bekende INCOMPATIBELE toepassingen/" #~ "uitbreidingen/beperkingen." #~ msgid "" #~ "The GUIDE offers a detailed explanation of every " #~ "feature." #~ msgstr "" #~ "De ZELFSTUDIEPAGINA (Engelstalig) bevat uitgebreide " #~ "hulp omtrent alle functies." #~ msgid "" #~ "The CHANGELOG lists the differences between each " #~ "extension version." #~ msgstr "" #~ "Het WIJZIGINGSLOG toont de verschillen tussen elke " #~ "uitbreidingsversie." #~ msgid "" #~ "This extension is licensed under the GNU General Public License, version 2 " #~ "or later and comes with NO WARRANTY. A copy of this " #~ "license can be found in the Github repository." #~ msgstr "" #~ "Deze uitbreiding is uitgebracht onder de voorwaarden van de GNU General " #~ "Public License, versie 2 of nieuwer, en wordt ZONDER ENIGE " #~ "GARANTIE geleverd. Een kopie van deze licentie is te vinden in " #~ "de GitHub-repo." #~ msgid "Help" #~ msgstr "Hulp" #~ msgid "Hidden Settings" #~ msgstr "Verborgen voorkeuren" #~ msgid "Tiling Popup: Current Workspace only" #~ msgstr "Tegelpop-upvenster: alleen op huidige werkblad" #~ msgid "Tile Editing Mode: Focus Color" #~ msgstr "Tegelbewerkmodus: focuskleur" #~ msgid "Tile Animations" #~ msgstr "Tegelanimaties" #~ msgid "Untile Animations" #~ msgstr "Onttegelanimaties" #~ msgid "Vertical Tile Preview Trigger Area" #~ msgstr "Verticale tegelvoorvertoning: actiegebied" #~ msgid "Horizontal Tile Preview Trigger Area" #~ msgstr "Horizontale tegelvoorvertoning: actiegebied" #~ msgid "Debugging: Show Tiled Rects" #~ msgstr "Foutopsporing: tegelrechthoeken tonen" #~ msgid "Debugging: Show Free Screen Rects" #~ msgstr "Foutopsporing: vrije tegelrechthoeken tonen" Tiling-Assistant-52/translations/pl.po000066400000000000000000001242471500466572600202200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2024-08-25 18:19+0200\n" "Last-Translator: Adam Lewicki \n" "Language-Team: 'no team' \n" "Language: Polish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Zgłoś problem" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Przewodnik użytkowania" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Licencja" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Dziennik zmian" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Zaawansowane" #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Ogólne" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Wyskakujące okno rozmieszczania okien" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Otwórz po rozmieszczeniu okna" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Uwzględnij aplikacje ze wszystkich przestrzeni roboczych" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Grupowanie rozmieszczanych okien" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Wyłącz" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" "Rozmieszczanie okien nie będzie więcej dostosowywać ich rozmiarów do innych, " "anie nie będą podnoszone lub ich rozmiary nie będą zmieniane. Dynamicznie " "zachowanie klawiszy dla 'Aktywnego okna' oraz wyskakujące okno " "rozmieszczania również nie będą działać." #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Podnieś razem" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Grupa rozmieszczonych okien jest tworzona, kiedy okno zostanie " "rozmieszczone. Jeśli rozmieszczone okno jest podniesione również pozostałe w " "grupie będą podniesione." #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "Włącznik aplikacji oraz wyskakujące okno rozmieszczania okien" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Może powodować konflikt z innym rozszerzeniami zmieniającymi zmianę " "okien(np. alt+Tab). Możliwe że będziesz potrzebować zrestartować to lub inne " "rozszerzenie po zmienie tego ustawienia" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Puste przestrzenie" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Okna" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Krawędzie ekranu" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Górna" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Lewa" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Prawa" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Dolna" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Maksymalizacja" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Dynamiczne zachowanie dopasowania klawiszy" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" "Dopasowanie klawiszy do maksymalizacji i rozmieszczenia do góry/dołu/lewej " "strony/prawej stronymogą zmienić się po zmianie stanu rozmieszczonego okna." #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Wyłączono" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "Nie zmieniaj" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Aktywne okno" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "Zmień okno na aktywne zgodnie z skrótem klawiszowym" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Stan rozmieszczenia" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" "Dostosuj stan rozmieszczenia do skrótu klawiszowego. Dla przykładu, " "rozmieszczone okno do połowy prawej strony użyje prawej górnej ćwiartki " "ekranu, jeśli rozmieszczone okno do dołu jest aktywne." #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Stan rozmieszczenia (okno)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Jak 'Stan rozmieszczenia', ale jeśli okno nie jest rozmieszczone lub jest " "już rozmieszczone do dołu oraz skrót 'rozmieszczenie do dołu' jest aktywny, " "minimalizuje okno." #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Ulubiony ułkad" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Przesuń okno zgodnie z ulubionym ukladem" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "Aktywność" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "Nie informuj o aktywnym oknie" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "Animacja rysowania" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" "Jeśli zmieni się aktywne okno, zostanie zastosowane tymczasowe rysowanie " "aktywnego okna. Maksymalizacja oraz okna na pełnym ekranie są wykluczone." #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "Animacja powiększania" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" "Po zmienia aktywnego okna, to nowo aktywne zostanie tymczasowo powiększone. " "Okna zmaksymalizowane oraz na pełnym ekranie są wykluczone." #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "Stałe rysowanie" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" "Powiadom o aktywnym oknie ze stałym rysowaniem, chyba że jest ono " "zmaksymalizowane lub na pełnym ekranie." #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "Kolor rysowania" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "Rozmiar rysowania" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animacje" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Rozmieszczanie" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Dowolna pozycja" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Tryb dowolnej pozycji okna" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" "Tryb dowolnego rozmieszczana jest aktywny, w przypadku braku naciśnięcia " "odpowiedniego klawisza." #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Rozmieszczanie do krawędzi" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "Zmiana położenia okna do krawędzi ekranu lub rogu otworzy domyślny podgląd " "rozmieszczania." #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Adaptacyjne rozmieszczanie" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Puszczenie przenoszonego okna nad danym rozmieszczonym oknem przeniesie je " "obok." #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "Podgląd rozmieszczanych okien będzie trzymał się twojego ulubionego układu " "ze strony 'Układy'" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Ignoruj asystenta rozmieszczania" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "Użyj rozmieszczenia do krawędzi, pomijając asystenta" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Inne" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Podążaj za okresem ważności przełącznika" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" "Gdy okno zostanie przeciągnięte na inny monitor, podgląd rozmieszczenia " "będzie podążał za aktywnym monitorem przez bardzo krótki czas. W ten sposób " "możesz rozmieszczać okna, 'rzucając' je w kierunku dowolnej krawędzi ekranu, " "nawet jeśli monitor graniczy z tą krawędzią." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Tryb niskiej wydajności" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" "Włącz, jeśli jest opóźnienie podczas przenoszenia okien. Spowoduje to jednak " "zmniejszenie precyzji aktualizacji podglądu rozmieszczeń." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "Dostosuj 'Rozmieszczenie krawędziowe' do Twojego ulubionego układu" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Tryb 'Adaptacyjnego rozmieszczania'" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "PPM" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "Super" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Tryb dopasowania do 'Ulubionego układu'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "Tryb 'Ignoruj asystenta rozmieszczania'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "Obszar wyzwalania przy krawędzi pionowej" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "Obszar wyzwalania przy krawędzi poziomej" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Odwróć czas akcji górnej krawędzi" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "Odwróć czas akcji górnej krawędzi dla wyświetlaczy poziomych" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "Odwróć czas akcji górnej krawędzi dla wyświetlaczy pionowych" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Dopasowanie klawiszy" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Włączenie 'Wyskakującego okna rozmieszczenia'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Tryb rozmieszczania do krawędzi" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Zarządzanie za pomocą klawiatury" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Automatycznie" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "Rozmieść lub wyłącz rozmieszczanie na podstawie aktualnych okien" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "'Zawsze na wierzchu'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Maksymalizacja" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Maksymalizacja pionowa" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Maksymalizacja pozioma" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Przywróć rozmiar" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Przesuń okno na środek" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Rozmieść do góry" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Rozmieść do dołu" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Rozmieść do lewej" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Rozmieść do prawej" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Rozmieść do rogu" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Lewy górny" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Prawy górny" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Dolny lewy" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Dolny prawy" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Rozmieszczanie krawędziowe bez asystenta" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Rozmieszczanie do rogów bez asystenta" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Debugowanie" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Pokaż prostokąty rozmieszczania" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Pokaż wolne prostokąty na ekranie" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Układy" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Powiadomienie" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Wyszukaj układ" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Wyświetl okno z listą dostępnych układów" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Dodaj nowy" #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "Zapisz na dysku. Błędne zmiany zostaną porzucone!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "Przeładuj układy z dysku i porzuć niezapisane zmiany." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Funkcje eksperymentalne" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "Pokaż więcej ustawień w głównym oknie" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Zastąp skrót klawiszowy. Naciśnij 'spacja' lub 'return' podczas oczekiwania " "na skrót klawiszowy, aby dodać nowy do istniejących." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Wyczyść" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Wyskakujące okno rozmieszczania" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Wyskakujące okno rozmieszczania zostało wyłączone" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Brak dostępnych prawidłowych układów." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Okno układów: aplikacja nie znaleziona." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Zacznij pisać, aby wyszukać..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Układ bez nazwy..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "Preferencje" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "Nie można otworzyć 'Trybu edycji rozmieszczania', jeśli nie ma dostępnych " "rozmieszczonych okien" #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "Przewodnik użytkowania" Tiling-Assistant-52/translations/pt_BR.po000066400000000000000000001514761500466572600206170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2022-04-11 16:53-0300\n" "Last-Translator: Fernando Omori \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Reportar um Bug" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Guia do Usuário" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Licença" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Registro de Mudanças" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Avançado..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Geral" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Popup de Ladrilhamento" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Abrir após ladrilhar uma janela" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Incluir apps de todos os espaços de trabalho" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Grupos de Ladrilhos" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Desabilitar Grupos de Ladrilhos" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" "Ladrilhos não irão mais adaptar seu tamanho à outros ladrilhos nem " "levantados ou redimensionados juntos. O Comportamento de Atalhos de Teclado " "Dinâmico 'Foco da Janela' e o 'Popup de Ladrilhamento' não mais funcionarão." #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Levantar juntos" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Um grupo de ladrilhos é criado quando uma janela se torna um ladrilho. Se um " "ladrilho é levantado, levante os outros do grupo também" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "Alternador de apps e Popup de ladrilhamento" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Isso pode entrar em conflito com outros extensões alternadoras de apps " "(também conhecidas como de alt+tab). Talvez você deva reabilitar esta ou a " "outra extensão após ativar esta opção" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Espaçamentos" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Janelas" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Bordas da Tela" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Borda Superior" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Borda Esquerda" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Borda Direita" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Borda Inferior" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Janelas Maximizadas" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Comportamento de Atalhos de Teclado Dinâmico" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" "Os atalhos de teclado e o ladrilho para topo/baixo/esquerda/direita podem " "mudar o comportamento baseado no estado do ladrilho" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Desativado" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "Não mude o comportamento das teclas de atalho" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Foco da Janela" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "Mudar foco para o ladrilho na direção do atalho utilizado" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Estado de Ladrilhamento" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" "Adaptar o estado do ladrilhamento ao atalho utilizado. Por exemplo, um " "ladrilho à metade da direita vai ocupar o quadrante da direita inferior, se " "o 'ladrilhar abaixo' estiver ativado" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Estado de Ladrilhamento (Janelas)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Parecido com 'Estado de Ladrilhamento' mas se a janela não é ladrilhada ou " "já está abaixo e o atalho 'ladrilhar abaixo' for ativado, minimize a janela" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Layout favorito" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Mover a janela junto ao seu Layout favorito" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Animações" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Ladrilhamento" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Desladrilhamento" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Modo Padrão de Movimento de Janela" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Ladrilhamento às bordas" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "Mover a janela às laterais da tela ou aos cantos abrirá a prévia do ladrilho " "padrão" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Ladrilhamento Adaptivo" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Soltar uma janela estando encima de um ladrilho empurrará a(s) janela(s) " "sobreposta(s) ao lado" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "A prévia do ladrilho se continuará usando seu Layout favorito da página " "'Layouts'" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Ignore o Assistente de Ladrilhamento" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" "Use Ladrilhamento de Borda sem os recursos do Assistente de Ladrilhamento" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Outro" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Período de Carência para Troca de Monitor" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" "Quando a janela é arrastado para um novo monitor o preview do ladrilho vai " "permanecer no monitor antigo for um momento. Dessa forma, você pode " "organizar ladrilhos 'jogando' eles em direção a qualquer canto da tela se o " "monitor estiver limítrofe aquela borda." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Modo de Movimento de Baixo Desempenho" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" "Use isso se houver um atraso ao mover janelas. Isso, no entanto, diminuirá a " "precisão das atualizações de visualização dos blocos." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "Adaptar 'Ladrilhamento às Bordas' ao seu Layout Favorito" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Ativador de Modo 'Ladrilhamento Adaptivo'" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "Clique Secundário" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "Super" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Ativator de Modo de Movimentação de 'Layout Favorito'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "Ativador do Modo 'Ignorar Assistente de Ladrilhamento'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "Área da Borda Vertical de Gatilho da Prévia" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "Área da Borda Horizontal de Gatilho da Prévia" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Temporizador de ação inversa da borda superior da tela" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "Ação Inversa para Telas em modo Paisagem da Borda Superior" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "Ação Inversa para Telas em modo Retrato da Borda Superior" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Atalhos de teclado" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Alternar 'Popup de Ladrilhamento'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Modo de Edição de Ladrilho" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Um modo que usa o teclado para gerenciar suas janelas ladrilhadas" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Auto-Ladrilhar" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "Ladrilhar/Desladrilhar a janela atual conforme os ladrilhos visíveis" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "Alternar 'Sempre no Topo'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Alternar Maximização" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Alternar Maximização Vertical" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Alternar Maximização Horizontal" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Restaurar Tamanho da Janela" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Mover Janela ao Centro" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Ladrilhar acima" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Ladrilhar abaixo" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Ladrilhar à esquerda" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Ladrilhar à direita" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Ladrilhamento aos Cantos" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Ladrilhar acima e esquerda" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Ladrilhar acima e direita" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Ladrilhar abaixo e esquerda" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Ladrilhar abaixo e direita" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Ladrilhamento da borda sem Assistente" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Ladrilhamento do Canto sem Assistente" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Debugging" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Mostrar Retângulos Ladrilhados" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Mostrar Retângulos de Espaço Livre" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Layouts" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Indicador de Painel" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Procurar por um Layout" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Abrir um popup listando todos os Layouts disponíveis" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Adicionar um novo Layout." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "Salve os Layouts no disco. As alterações inválidas serão perdidas!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" "Recarregue os Layouts do disco - descartando todas as alterações não salvas." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Configurações Avançadas / Experimentais" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "Mostrar mais configurações na janela de preferências principal" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Substitui os atalhos de teclados. Aperte 'espaço' ou 'return' enquanto " "adicionando um atalho para adicionar um novo atalho alternativo." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Limpar os atalhos de teclado" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Janela instantânea de ladrilhamento ativada" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Janela instantânea de ladrilhamento foi desativada" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Nenhum Layout válido definido." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Layouts de Janela Instantânea: App não encontrado." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Digite para procurar..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Layout sem nome..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "Não é possível entrar no 'Modo de Edição de Ladrilho' se não há janelas " "ladrilhadas visíveis." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "'Guia do Usuário' para ajuda..." #~ msgid "Active Window Hint" #~ msgstr "Ativar Dica de Janela" #~ msgid "Don't indicate the focused window" #~ msgstr "Não indicar a janela em foco" #~ msgid "Minimal" #~ msgstr "Minimalista" #~ msgid "" #~ "Temporarily indicate the focused window when switching to a workspace " #~ "with multiple non-overlapping windows" #~ msgstr "" #~ "Temporariamente indicar a janela focada quando trocar de área de trabalho " #~ "com múltiplas janelas não sobrepostas" #~ msgid "Always" #~ msgstr "Sempre" #~ msgid "" #~ "Always indicate the focused window unless it's maximized or in " #~ "fullscreen. There are issues on Wayland with GTK4 popups" #~ msgstr "" #~ "Sempre indicar a janela focada a menos que esteja maximizada ou tela " #~ "cheia. Há problemas no Wayland com popups GTK4" #~ msgid "Hint Color" #~ msgstr "Cor da Dica" #~ msgid "The color of the frame indicating the focused window" #~ msgstr "A cor da moldura indicando a janela em foco" #~ msgid "Border Size" #~ msgstr "Tamanho da Borda" #~ msgid "" #~ "The border size of the frame indicating the focused window for the always " #~ "active hint" #~ msgstr "" #~ "O tamanho da borda da moldura indicando a janela em foco para a dica " #~ "sempre ativa" #~ msgid "Inner Border Size" #~ msgstr "Tamanho Borda Interno" #~ msgid "" #~ "The border for the always active hint reaching inside the window frame. " #~ "This is meant to cover rounded corners. However, GTK4 popups on Wayland " #~ "will put the window behind the hint for whatever reason..." #~ msgstr "" #~ "A borda para dica sempre ativa alcançando dentro da moldura da janela. " #~ "Isso serve para cobrir os cantos arrendondados. Entretanto, popups GTK4 " #~ "no Wayland vão colocar a janela atrás da dica por algum motivo..." #~ msgid "Restore Window Size on" #~ msgstr "Restaurar Tamanho da Janela ao" #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Janelas ladrilhadas podem não restaurar seu tamanho apropriadamente no " #~ "Wayland. Se esse é seu caso, use 'Restaurar Tamanho da Janela ao Soltar'" #~ msgid "Grab Start" #~ msgstr "ao Pegar" #~ msgid "Grab End" #~ msgstr "ao Soltar" #~ msgid "" #~ "The keyboard shortcuts to maximize and tile to the top, bottom, left, and " #~ "right won't change their behavior based on the window's tiling state" #~ msgstr "" #~ "Os atalhos de teclado para maximizar e ladrilhar para cima, baixo, " #~ "esquerda, e direita não mudarão seu comportamento baseado no estado de " #~ "ladrilhamento da janela" #~ msgid "" #~ "Switch focus to the tiled window in the direction of the pressed " #~ "shortcut, if there is one" #~ msgstr "" #~ "Mudar foco para o ladrilho na direção do atalho pressionado, se há um" #~ msgid "" #~ "Adapt the current window's tiling state to the pressed shortcut. For " #~ "instance, a window tiled to the right half will tile to the bottom-right " #~ "quarter, if 'tile to bottom' is activated" #~ msgstr "" #~ "Adaptar o estado de ladrilhamento da janela atual ao atalho pressionado. " #~ "Por exemplo, uma janela ladrilhada ao lado direito irá ao canto inferior " #~ "direito se 'ladrilhar abaixo' for ativado" #~ msgid "Other Window Movement Settings" #~ msgstr "Outras Configurações de Movimento de Janela" #~ msgid "Show Changelog in Preferences after an Update" #~ msgstr "Mostrar Registro de Mudanças em Preferências após uma Atualização" #~ msgid "Tiling Window Switcher" #~ msgstr "Alternador de Janelas Ladrilhadas" #~ msgid "Replace App Switcher" #~ msgstr "Substituir alternador de apps" #~ msgid "" #~ "Replace the App Switcher (a. k. a. Alt+Tab) with a window switcher, which " #~ "previews the windows and tile groups" #~ msgstr "" #~ "Substituir o alternador de apps (também conhecido como alt+tab) por um " #~ "alternador de janelas, que prevê as janelas e grupos de ladrilhos" #~ msgid "Group Windows by App" #~ msgstr "Agrupar Janelas por App" #~ msgid "" #~ "Windows of the same app are displayed as one item and can be cycled " #~ "through with the key above Tab" #~ msgstr "" #~ "Janelas do mesmo app são mostrados como um item e podem ser alternadas " #~ "usando a tecla acima de Tab" #~ msgid "Hidden Settings" #~ msgstr "Configurações Ocultas" #~ msgid "No valid popup layouts defined." #~ msgstr "Nenhum Layout de janela instantânea válido definido." #~ msgid "Raise Tile Groups together" #~ msgstr "Elevar Grupos de Ladrilhos juntos" #~ msgid "" #~ "The keyboard shortcuts to maximize and tile to the top, bottom, left, and " #~ "right may change depending on the tiling state of the focused window.\n" #~ "\n" #~ "Disabled: The shortcuts won't change their behavior based on the " #~ "window's tiling state.\n" #~ "\n" #~ "Focus: If the current window is tiled and there is a tiled window " #~ "in the direction of the shortcut, switch focus to that tiled window " #~ "instead of tiling the current window.\n" #~ "\n" #~ "Tiling State: If the current window is tiled, it adapts to the " #~ "pressed shortcut. For example, if the current window is tiled to the " #~ "right half of your monitor and the shortcut to tile to the bottom is " #~ "activated, the window will tile to the bottom-right quarter instead of " #~ "the bottom half.\n" #~ "\n" #~ "Tiling State (Windows): Like 'Tiling State' but if the window " #~ "isn't tiled or is already tiled to the bottom and the 'tile to bottom' " #~ "shortcut is activated, minimize the window." #~ msgstr "" #~ "Os atalhos de teclado para maximizar e ladrilhar na parte superior, " #~ "inferior, esquerda e direita podem mudar dependendo do estado de ladrilho " #~ "da janela em foco.\n" #~ "\n" #~ "Desativado: Os atalhos não mudam seu comportamento com base no " #~ "estado de ladrilho da janela.\n" #~ "\n" #~ "Foco: Se a janela atual está ladrilhada e houver uma janela " #~ "ladrilhada na direção do atalho, mude o foco para essa janela ladrilhada " #~ "em vez de ladrilhar a janela atual.\n" #~ "\n" #~ "Estado de Ladrilhamento: Se a janela atual está ladrilhada, ela se " #~ "adapta ao atalho pressionado. Por exemplo, se a janela atual está " #~ "ladrilhada à metade direita do monitor e o atalho para ladrilhar abaixo " #~ "for ativado, a janela será ladrilhada na parte inferior direita em vez da " #~ "metade inferior.\n" #~ "\n" #~ "Estado de Ladrilhamento (Janelas): Como 'Estado de Ladrilhamento', " #~ "mas se a janela não está ladrilhada ou já estiver ladrilhada na parte " #~ "inferior e o atalho 'Ladrilhar Abaixo' for ativado, minimiza a janela." #~ msgid "Focus" #~ msgstr "Foco" #~ msgid "Window Gaps" #~ msgstr "Espaçamentos entre janelas" #~ msgid "Gaps on Maximized Windows" #~ msgstr "Espaçamento em Janelas Maximizadas" #~ msgid "" #~ "This setting is intended for Wayland users. Tiled windows may not " #~ "properly restore their size when they are being grabbed on Wayland.\n" #~ "\n" #~ "If that is the case, you can try 'Restore Window Size on Grab End' " #~ "instead." #~ msgstr "" #~ "Esta configuração é destinada para usuários do Wayland. Janelas " #~ "ladrilhadas talvez não restaurem corretamente seus tamanhos quando\n" #~ "forem capturadas no Wayland.\n" #~ "\n" #~ "Se for este o caso, você pode tentar 'Restaurar Tamanho da Janela' em " #~ "'Capturar no Final'." #~ msgid "Inverse Top Screen Edge Action:" #~ msgstr "Inverter Ação da Borda Superior da Tela:" #~ msgid "Landscape Displays" #~ msgstr "Telas Paisagem" #~ msgid "Portrait Displays" #~ msgstr "Telas Retrato" #~ msgid "" #~ "The focused window will try to fill the free screen space as good as " #~ "possible based on the tiled windows around it." #~ msgstr "" #~ "A janela em foco tentará preencher o espaço livre da melhor forma " #~ "possível baseando-se nas janelas ladrilhadas ao redor." #~ msgid " General " #~ msgstr " Geral " #~ msgid " Side Tiling " #~ msgstr " Ladrilhamento de Borda " #~ msgid " Corner Tiling " #~ msgstr " Ladrilhamento de Canto " #~ msgid "Search Popup Layout" #~ msgstr "Layout de Janela de Pesquisa" #~ msgid "Popup Layouts" #~ msgstr "Layouts de Janelas Instantâneas" #~ msgid "Tiling Assistant" #~ msgstr "Tiling Assistant" #~ msgid "" #~ "If you want to report a bug or need help,\n" #~ "\n" #~ "please open an issue on Github." #~ msgstr "" #~ "Se você quer reportar um bug ou precisa de ajuda,\n" #~ "\n" #~ "por favor abra uma \"issue\" no Github." #~ msgid "" #~ "List of known INCOMPATIBLE apps/extensions/limitations." #~ msgstr "Lista de apps/extensões/limitações INCOMPATÍVEIS." #~ msgid "" #~ "The GUIDE offers a detailed explanation of every " #~ "feature." #~ msgstr "" #~ "O GUIA oferece uma explicação detalhada para cada " #~ "função." #~ msgid "" #~ "The CHANGELOG lists the differences between each " #~ "extension version." #~ msgstr "" #~ "O CHANGELOG lista as diferenças entre cada versão da " #~ "extensão." #~ msgid "" #~ "This extension is licensed under the GNU General Public License, version 2 " #~ "or later and comes with NO WARRANTY. A copy of this " #~ "license can be found in the Github repository." #~ msgstr "" #~ "Esta extensão está licenciada sob a GNU General Public License, versão 2 " #~ "ou posterior e NÃO VEM COM GARANTIAS. Uma cópia desta " #~ "licença pode ser encontrada no repositório do Github." #~ msgid "Help" #~ msgstr "Ajuda" #~ msgid "Hidden Settings" #~ msgstr "Configurações Ocultas" #~ msgid "Tiling Popup: Current Workspace only" #~ msgstr "" #~ "Janela Instantânea de Ladrilhamento: Espaço de Trabalho atual somente" #~ msgid "Tile Editing Mode: Focus Color" #~ msgstr "Modo de Edição de Ladrilho: Cor de Foco" #~ msgid "Tile Preview: Secondary Mode Activator" #~ msgstr "Pré-visualização de Ladrilho: Ativador do Modo Secundário" #~ msgid "Tile Preview: Default to Secondary Mode" #~ msgstr "Pré-visualização de Ladrilho: Padrão para Modo Secundário" #~ msgid "Tile Animations" #~ msgstr "Animações de Ladrilhamento" #~ msgid "Untile Animations" #~ msgstr "Animações de Desladrilhamento" #~ msgid "Vertical Tile Preview Trigger Area" #~ msgstr "Área de gatilho de pré-visualização de ladrilho vertical" #~ msgid "Horizontal Tile Preview Trigger Area" #~ msgstr "Área de gatilho de pré-visualização de ladrilho horizontal" #~ msgid "Debugging: Show Tiled Rects" #~ msgstr "Depurando: Mostrar Retângulos Ladrilhados" #~ msgid "Debugging: Show Free Screen Rects" #~ msgstr "Depurando: Mostrar Retângulos de Tela Livre" #~ msgid "Nameless Layout..." #~ msgstr "Layout sem nome..." #~ msgid "Layout" #~ msgstr "Layout" #~ msgid "Check out the 'Guide' in the repository (see the 'Help' Tab)." #~ msgstr "Verifique o 'Guia' no repositório (veja a aba 'Ajuda')." #~ msgid "This tooltip for help..." #~ msgstr "Esta dica para ajuda..." Tiling-Assistant-52/translations/ru.po000066400000000000000000001371011500466572600202240ustar00rootroot00000000000000# Russian translation of the Tiling Assistant GNOME Shell extension. # Copyright (C) 2024 Tiling-Assistant Contributors # This file is distributed under the same license as the Tiling-Assistant package. # Ser82-png \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.0.1\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Сообщить об ошибке" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Руководство пользователя" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Лицензия" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Список изменений" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Расширенные..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Общие" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Всплывающее окно мозаики" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Открывать после укладки окна плиткой" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Включить приложения со всех рабочих пространств" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Группы плиток" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Не использовать группы плиток" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" "Окна, уложенные плиткой, больше не будут адаптировать свой размер к другим " "окнам мозаики, а также не будут вместе подниматься или изменяться. " "Всплывающее окно мозаики и динамические комбинации клавиш фокусировки окон " "также перестанут работать." #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Поднимать одновременно" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Группа плиток формируется при укладке окна в виде плитки. Когда поднимается " "одно окно мозаики, то другие окна, принадлежащие к группе плиток, также " "поднимаются" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "Переключатель приложений и всплывающее окно мозаики" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Это может создать несовместимость с другими расширениями переключателя " "приложений (alt+Tab). Возможно, вам придется повторно включить текущее, или " "же другое расширение после изменения этого параметра" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Отступы" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Окна" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Края экрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Верхний край экрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Левый край экрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Правый край экрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Нижний край экрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Развёрнутые окна" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Поведение динамических комбинаций клавиш" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" "Комбинации клавиш для разворачивания и укладки сверху/снизу/слева/справа " "могут изменять свое поведение в зависимости от размещения окна" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Отключено" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "Не изменять поведение комбинаций клавиш" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Фокусировка окон" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" "Переключать фокус на окно плитки в направлении нажатой комбинации клавиш" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Положение плиток" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" "Адаптировать положение плиток в зависимости от используемой комбинации " "клавиш. Например, окно, расположенное на правой половине, при активации " "«Укладка снизу», переместится к правой нижней четверти" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Положение плиток (Окна)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Отличие от параметра «Положения плиток» заключается в том, что в случае, " "когда окно не уложено или уложено снизу, активация комбинации клавиш " "«Укладка снизу» свернёт это окно" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Любимый макет" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Размещать окна как на любимом макете" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "Указание на фокус" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "Окно, находящееся в фокусе, не будет отмечено" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "Анимированный контур" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" "При изменении фокуса, выбранное окно будет временно обведено контуром. На " "развернутые окна и окна в полноэкранном режиме это действие не " "распространяется" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "Анимированное увеличение масштаба" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" "При изменении фокуса временно увеличивается масштаб сфокусированного окна. " "На развернутые и находящиеся в полноэкранном режиме окна это действие не " "распространяется" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "Статичный контур" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" "Выделять сфокусированное окно статичным контуром, если оно не развернуто или " "не находится в полноэкранном режиме." #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "Стиль контура" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "Если у вас прозрачные окна, рекомендуется использовать «Рамку»" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "Сплошной фон" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "Рамка" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "Цвет контура" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "Размер контура" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "Радиус контура рамки" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Анимация" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Укладка" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Отделение" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Режим перемещения окна по умолчанию" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" "Режим перемещения, который активируется без нажатия клавиши-модификатора" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Укладка от края" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "При перемещении окна к краям или углам экрана откроется окно " "предварительного просмотра результата укладки плитки" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Адаптивная укладка" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Если отпустить захваченное окно над частью мозаики, то перекрытые окна " "сдвинутся в сторону" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "Предварительный просмотр укладки плитки будет формироваться в зависимости от " "вашего любимого макета со страницы «Макеты»" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Игнорировать Tiling Assistant" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "Использовать укладку от края без функционала Tiling Assistant" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Прочее" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Задержка при перемещении между мониторами" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" "Когда окно перетаскивается на другой монитор, на исходном мониторе ненадолго " "активируется предварительный просмотр укладки плиток. Таким образом, есть " "возможность укладывать окна, «сбрасывая» их к краю экрана, даже если " "мониторы граничат по этому краю." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Режим перемещения с низкой производительностью" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" "Используйте в случае, если есть задержка при перемещении окон. Обратите " "внимание, что это снизит точность обновления предварительного просмотра " "укладки плиток." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "Адаптировать режим «Укладка от края» к вашему любимому макету" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Активатор режима «Адаптивная укладка»" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "ПКМ" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "Super" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Активатор режима «Любимый макет»" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "Активатор режима «Игнорировать Tiling Assistant»" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "" "Область около вертикальных краёв для запуска предварительного просмотра " "укладки" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "" "Область около горизонтальных краёв для запуска предварительного просмотра " "укладки" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Таймер обратного действия у верхнего края экрана" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "" "Обратное действие у верхнего края экрана для дисплеев с альбомной ориентацией" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "" "Обратное действие у верхнего края экрана для дисплеев с портретной " "ориентацией" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Привязка клавиш" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Включить «Всплывающее окно мозаики»" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Режим редактирования мозаики" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Управление окнами мозаики с помощью клавиатуры" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Автоматическая укладка" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "Уложить/Отделить текущее окно с учётом видимых плиток" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "Всегда сверху" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Развертывание" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Вертикальное развёртывание" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Горизонтальное развёртывание" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Восстановить размер окна" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Переместить окно в центр" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Укладка сверху" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Укладка снизу" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Укладка слева" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Укладка справа" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Укладка от угла" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Укладка от верхнего левого" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Укладка от верхнего правого" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Укладка от нижнего левого" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Укладка от нижнего правого" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Укладка от края без использования Tiling Assistant" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Укладка от угла без использования Tiling Assistant" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Отладка" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Показывать прямоугольники плиток" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Показывать свободные прямоугольники экрана" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Макеты" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Индикатор на панели" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Поиск макета" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Открыть всплывающее меню со списком всех доступных макетов" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Добавить новый макет." #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "Сохранить макеты на диске. Некорректные изменения будут утрачены!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "Перезагрузить макеты с диска, удалив все несохранённые изменения." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Расширенные / Экспериментальные настройки" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "Показать дополнительные настройки в главном окне «Параметры»" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Замена комбинаций клавиш. Для того, чтобы к уже существующим добавить новую " "комбинацию, на этапе ожидания ввода, нажмите клавишу «Пробел» или «Enter»." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Очистить комбинации клавиш" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Всплывающее окно мозаики включено" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Всплывающее окно мозаики выключено" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Не определено ни одного корректного макета." #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Всплывающее окно макетов: приложение не найдено." #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Введите поисковый запрос..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Безымянный макет..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "Параметры" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "«Режим редактирования мозаики» недоступен, когда отсутствуют видимые плитки " "окон." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "«Руководство пользователя» для получения помощи..." Tiling-Assistant-52/translations/uk.po000066400000000000000000001431651500466572600202240ustar00rootroot00000000000000# Ukrainian translation of the Tiling Assistant GNOME Shell extension. # Copyright (C) 2024 Tiling-Assistant Contributors # This file is distributed under the same license as the Tiling-Assistant package. # Yevhen Popok , 2024. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: 2025-02-18 23:48+0200\n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.4\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "Повідомити про ваду" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "Довідка" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "Ліцензія" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "Список змін" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "Додатково..." #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "Загальне" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "Спливаюче вікно укладання" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "Відкривати після укладання вікна" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "Включити програми з усіх робочих просторів" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "Групи плиток" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "Не використовувати групи плиток" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" "Укладені вікна більше не будуть припасовуватися до розмірів інших вікон " "мозаїки, як і не будуть одночасно підійматися та змінювати свої розміри. " "Cпливаюче вікно укладання та динамічні клавіатурні скорочення 'Фокусування " "вікон' також перестануть працювати." #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "Підіймати одночасно" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" "Група плиток формується під час укладання вікон. Коли підіймається одне " "укладене вікно, то інші вікна групи плиток, підіймаються також" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "Перемикач програм та спливаюче вікно укладання" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" "Може конфліктувати з іншими розширеннями перемикання програм (alt+Tab). " "Можливо, вам доведеться перезавантажити поточне або інші розширення після " "зміни цього параметра" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "Відступи" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "Вікна" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "Краї екрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "Верхній край екрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "Лівий край екрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "Правий край екрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "Нижній край екрана" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "Розгорнуті вікна" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "Поведінка динамічних клавіатурних скорочень" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" "Клавіатурні скорочення розгортання та укладання вгорі/знизу/ліворуч/" "праворуч, можуть змінювати свою поведінку в залежності від розміщення вікна" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "Вимкнено" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "Не змінювати поведінку клавіатурних скорочень" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "Фокусування вікон" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "Перемикати фокус на укладене вікно у напрямку клавіатурного скорочення" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "Положення плиток " #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" "Динамічне переміщення плиток клавіатурними скороченнями. Наприклад, якщо " "вікно, укладене в правій половині, то скорочення 'укласти знизу', " "перемістить його до правої нижньої чверті" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "Положення плиток (вікон)" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" "Як 'Положення плиток', але якщо вікно не укладене чи укладене знизу, то " "скорочення 'укласти знизу' сховає вікно" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "Улюблений макет" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "Переміщення вікон згідно вашого улюбленого макета" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "Підказка фокусування" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "Не позначати вікно у фокусі" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "Анімація контуру" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" "Під час зміни фокуса, додавати тимчасовий контур до вікна у фокусі. За " "винятком розгорнутих та повноекранних вікон" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "Анімація масштабування" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "Під час зміни фокуса, тимчасово збільшити вікно у фокусі." #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "Статичний контур" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" "Позначати вікно у фокусі статичним контуром (якщо вікно не розгорнуте та не " "повноекранне)" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "Стиль контура" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "'Рамка' рекомендована, якщо використовуються прозорі вікна" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "Суцільне тло" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "Рамка" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "Колір контуру" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "Розмір контуру" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "Радіус контуру рамки" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "Анімації" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "Укладання" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "Відокремлення" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "Типовий режим переміщення вікон" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "Режим переміщення без натискання клавіші-модифікатор" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "Укладання від краю" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" "Переміщення вікна до краю чи кута екрана активує типове спливаюче вікно " "попереднього перегляду укладання" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "Адаптивне укладання" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" "Якщо відпустити захоплене вікна над частиною мозаїки, то буде зміщено вбік " "перекрите(-і) вікно(-а)" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" "Попередній перегляд укладання буде адаптовано до вашого улюбленого макета зі " "сторінки 'Макети'" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "Ігнорувати Tiling Assistant" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "Використовувати 'Укладання від краю' без функціоналу Tiling Assistant" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "Інше" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "Затримка під час переміщення між моніторами" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" "Коли вікно перетягується на інший монітор, попередній перегляд укладання " "затримається на початковому моніторі на дуже короткий час. Таким чином, є " "можливість укладати вікна, 'кидаючи' їх до краю екрана, навіть якщо монітори " "межують по цьому краю." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "Режим переміщення за низької швидкодії" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" "Використовуйте у разі, якщо є затримка під час переміщення вікон. Зауважте, " "що це знизить точність оновлення попереднього перегляду укладання." #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "'Укладання від краю' згідно вашого улюбленого макету" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "Активує переміщення в режимі 'Адаптивне укладання'" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "Ctrl" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "Alt" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "Права кнопка миші" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "Super" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "Активує переміщення в режимі 'Улюблений макет'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "Активує переміщення в режимі 'Ігнорувати Tiling Assistant'" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "" "Ділянка біля вертикальної межі, на якій активується попередній перегляд " "укладання" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "" "Ділянка біля горизонтальної межі, на якій активується попередній перегляд " "укладання" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "Час зворотної дії у верхній частині екрана" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "" "Зворотня дія у верхній частині екрана для дисплеїв з альбомною орієнтацією" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "" "Зворотня дія у верхній частині екрана для дисплеїв з портретною орієнтацією" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "Клавіатурні скорочення" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "Перемкнути 'Спливаюче вікно укладання'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "Режим редагування мозаїки" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "Керування укладеними вікнами за допомогою клавіатури" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "Укласти автоматично" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "Укласти/відокремити поточне вікно з урахуванням видимих вікон мозаїки" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "Перемкнути 'Завжди зверху'" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "Перемкнути розгортання" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "Перемкнути вертикальне розгортання" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "Перемкнути горизонтальне розгортання" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "Відновити розмір вікна" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "Перемістити вікно до центру" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "Укласти вгорі" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "Укласти знизу" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "Укласти ліворуч" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "Укласти праворуч" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "Укладання від кута" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "Укласти вгорі ліворуч" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "Укласти вгорі праворуч" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "Укласти знизу ліворуч" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "Укласти знизу праворуч" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "Укладання від краю без використання Tiling Assistant" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "Укладання від кута без використання Tiling Assistant" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "Зневадження" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "Показати прямокутники мозаїки" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "Показати незайняті прямокутники мозаїки" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "Макети" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "Індикатор на панелі" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "Пошук макета" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "Відкрити спливаюче вікно з переліком доступних макетів" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "Додати новий макет" #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "Зберегти макети на диск. Некоректні зміни буде втрачено!" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "Перезавантажити макети з диска, відкидаючи всі незбережені зміни." #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "Розширені / Експериментальні налаштування" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "Показати більше налаштувань в основному вікні параметрів" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" "Заміна клавіатурних скорочень. Для додавання нового скорочення до вже " "існуючих, натисніть клавішу 'пропуск' чи 'enter' під час очікування " "натискання." #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "Очистити клавіатурні скорочення" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "Спливаюче вікно укладання увімкнено" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "Спливаюче вікно укладання вимкнено" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "Не знайдено жодного коректного макета" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "Спливаюче вікно макетів: програму не знайдено" #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "Пишіть тут для пошуку..." #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "Безіменний макет..." #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "Налаштування" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" "'Режим редагування мозаїки' недоступний, коли відсутні видимі укладені вікна." #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "Довідка..." #~ msgid "Active Window Hint" #~ msgstr "Підказка щодо активного вікна" #~ msgid "Don't indicate the focused window" #~ msgstr "Не позначати вікно в фокусі" #~ msgid "Minimal" #~ msgstr "Мінімально" #~ msgid "" #~ "Temporarily indicate the focused window when switching to a workspace " #~ "with multiple non-overlapping windows" #~ msgstr "" #~ "Тимчасово позначати вікно в фокусі під час перемикання на робочий простір " #~ "з декількома вікнами, що не перекриваютьcя" #~ msgid "Always" #~ msgstr "Завжди" #~ msgid "" #~ "Always indicate the focused window unless it's maximized or in " #~ "fullscreen. There are issues on Wayland with GTK4 popups" #~ msgstr "" #~ "Завжди позначати вікно з фокусом. Виключення становлять розгорнуті та " #~ "повноекранні вікна. Є проблеми зі спливаючими вікнами GTK4 на Wayland" #~ msgid "Hint Color" #~ msgstr "Колір підказки" #~ msgid "The color of the frame indicating the focused window" #~ msgstr "Колір рамки, що позначає вікно з фокусом" #~ msgid "Border Size" #~ msgstr "Розмір рамки" #~ msgid "" #~ "The border size of the frame indicating the focused window for the always " #~ "active hint" #~ msgstr "" #~ "Розмір рамки, яка позначає вікно з фокусом для завжди активної підказки" #~ msgid "Inner Border Size" #~ msgstr "Розмір внутрішньої рамки" #~ msgid "" #~ "The border for the always active hint reaching inside the window frame. " #~ "This is meant to cover rounded corners. However, GTK4 popups on Wayland " #~ "will put the window behind the hint for whatever reason..." #~ msgstr "" #~ "Рамка завжди активної підказки всередині вікна. Призначена для покриття " #~ "заокруглених кутів. Проте, спливаючі вікна GTK4 на Wayland з якоїсь " #~ "причини розміщуються за підказкою..." #~ msgid "Restore Window Size on" #~ msgstr "Відновлювати розмір під час" #~ msgid "" #~ "Tiled windows may not properly restore their size on Wayland. If that's " #~ "the case, use 'Restore Window Size on Grab End'" #~ msgstr "" #~ "Вікна, укладені як плитки, можуть неправильно відновлювати свої розміри " #~ "на Wayland. В такому разі використовуйте опцію 'Відновлювати розмір під " #~ "час відпускання'" #~ msgid "Grab Start" #~ msgstr "захоплення" #~ msgid "Grab End" #~ msgstr "відпускання" Tiling-Assistant-52/translations/zh_TW.po000066400000000000000000001134651500466572600206400ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-27 12:21+0100\n" "PO-Revision-Date: \n" "Last-Translator: laichiaheng\n" "Language-Team: None\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Poedit 2.4.3\n" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:10 msgid "Report a Bug" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:14 msgid "User Guide" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:18 msgid "License" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that links to Github #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:22 msgid "Changelog" msgstr "" #. Translators: This is a popup menu item in the headerbar of the prefs window that opens a dialog to enable the advanced and experimental settings #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:26 msgid "Advanced..." msgstr "" #. Translators: This is the name of a tab in the prefs window #. Translators: This is a header for a preference group in the 'Keybindings' tab #. Translators: This is a header for a preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:41 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:659 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:880 msgid "General" msgstr "一般" #. Translators: This is the header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:48 msgid "Tiling Popup" msgstr "模塊化彈出式選單" #. Translators: This is a setting in the 'General' tab that decides whether the Tiling Popup will appear after tiling a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:51 msgid "Open after tiling a window" msgstr "" #. Translators: This is a setting in the 'General' tab about including apps in the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:56 msgid "Include apps from all workspaces" msgstr "" #. Translators: This is the header for a preference group in the 'General' tab about grouping tiled windows together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:71 msgid "Tile Groups" msgstr "" #. Translators: This is the name of setting to disable tile groups in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:74 msgid "Disable Tile Groups" msgstr "" #. Translators: This is an explanation about the 'Disable Tile Groups' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:75 msgid "" "Tiled windows will no longer adapt their size to other tiled windows nor be " "raised or resized together. The Dynamic Keybinding Behavior 'Window Focus' " "and the Tiling Popup will also no longer work." msgstr "" #. Translators: This is a setting in the 'General' tab about raising grouped tiled windows into the foreground together #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:84 msgid "Raise together" msgstr "" #. Translators: This is an explanation for the 'Raise Together' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:85 msgid "" "A tile group is created when a window gets tiled. If a tiled window is " "raised, raise the other windows of its tile group as well" msgstr "" #. Translators: This is a (deprecated) setting under the 'Tile Groups' preference group in the 'General' tab. It's about tile groups appearing grouped together in the App Switcher (Alt-Tab) and the Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:90 msgid "App Switcher and Tiling Popup" msgstr "" #. Translators: This is an explanation for the 'App Switcher and Tiling Popup' setting #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:91 msgid "" "This could conflict with other App Switcher (a.k.a. alt+Tab) extensions. You " "may need to re-enable this or the other extension after toggling this setting" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab to add gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:105 msgid "Gaps" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:108 msgid "Windows" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:121 msgid "Screen Edges" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the top screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:138 msgid "Screen Edge Top" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the left screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:155 msgid "Screen Edge Left" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the right screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:172 msgid "Screen Edge Right" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to set the gaps between tiled windows and the bottom screen edge #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:189 msgid "Screen Edge Bottom" msgstr "" #. Translators: This is a setting under the 'Gaps' preference group in the 'General' tab to add gaps between maximized windows and the screen edges #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:206 msgid "Maximized Windows" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:216 msgid "Dynamic Keybinding Behavior" msgstr "" #. Translators: This is the explanation for the preference group 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:217 msgid "" "The keybindings to maximize and tile to the top/bottom/left/right may change " "their behavior based on the window's tiling state" msgstr "" #. Translators: This setting disables the 'Dynamic Keybinding Behavior' in the 'General' tab #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:220 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:294 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:522 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:542 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:562 #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:14 #: tiling-assistant@leleat-on-github/src/prefs/shortcutListener.js:102 msgid "Disabled" msgstr "" #. Translators: This is an explanation for the 'Disabled' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:221 msgid "Don't change the keybindings' behavior" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change window focus instead of tiling #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:230 msgid "Window Focus" msgstr "" #. Translators: This is an explanation for the 'Window Focus' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:231 msgid "" "Switch focus to the tiled window in the direction of the pressed shortcut" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:242 msgid "Tiling State" msgstr "" #. Translators: This is an explanation for the 'Tiling State' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:243 msgid "" "Adapt the tiling state to the pressed shortcut. For instance, a window tiled " "to the right half will tile to the bottom-right quarter, if 'tile to bottom' " "is activated" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It causes some shortcuts to change their tiling behavior based on the current windows' tiling state. It behaves similarly to Windows (the OS). #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:254 msgid "Tiling State (Windows)" msgstr "" #. Translators: This is an explanation for the 'Tiling State (Windows)' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:255 msgid "" "Like 'Tiling State' but if the window isn't tiled or is already tiled to the " "bottom and the 'tile to bottom' shortcut is activated, minimize the window" msgstr "" #. Translators: This setting is under the preference group 'Dynamic Keybinding Behavior' in the 'General' tab. It will change some tiling shortcuts to shift the current window along the 'Favorite Layout' instead of the default half/quarter tiling #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, windows can only be tiled to tiles in the favorite layout when using the mouse #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:266 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:457 msgid "Favorite Layout" msgstr "" #. Translators: This is an explanation for the 'Favorite Layout' option for the 'Dynamic Keybinding Behavior' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:267 msgid "Move the window along your favorite Layout" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab for settings to indicate the currently focused window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:287 msgid "Focus Hint" msgstr "" #. Translators: This is the explanation for the setting 'Disabled' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:295 msgid "Do not indicate the focused window" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will indicate the focused window by animating an outline around the focused window under certain circumstances #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:305 msgid "Outline Animation" msgstr "" #. Translators: This is the explanation for the setting 'Outline Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:306 msgid "" "When the focus changes, temporarily outline the focused window. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will scale the focused window up to indicate the focus under certain circumstances. #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:317 msgid "Upscale Animation" msgstr "" #. Translators: This is the explanation for the setting 'Upscale Animation' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:318 msgid "" "When the focus changes, temporarily scale the focused window up. Maximized " "and fullscreen windows are exempt from this" msgstr "" #. Translators: This is a setting for the preference group 'Focus Hint' in the 'General' tab in the prefs window. This setting will outline the focused window (almost) at all times. There is no animation, hence 'static' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:329 msgid "Static Outline" msgstr "" #. Translators: This is the explanation for the setting 'Static Outline' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:330 msgid "" "Indicate the focused window with a static outline unless it's maximized or " "in fullscreen." msgstr "" #. Translators: This is the setting for the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:349 msgid "Outline Style" msgstr "" #. Translators: This is the explanation for the setting 'Outline Style' for the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:350 msgid "'Border' is recommended if you use transparent windows" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:354 msgid "Solid Background" msgstr "" #. Translators: This is an option for the setting of the style of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:355 msgid "Border" msgstr "" #. Translators: This is the setting for the color of the focus hint in the preference group 'Focus Hint' in the 'General' tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:363 msgid "Outline Color" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:374 msgid "Outline Size" msgstr "" #. Translators: This is a setting under the 'Focus Hint' preference group in the 'General' tab in the prefs window to set the size of the focus hint border radius #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:387 msgid "Outline Border Radius" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:405 msgid "Animations" msgstr "" #. Translators: This setting enables tiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:412 msgid "Tiling" msgstr "" #. Translators: This setting enables untiling animations and is listed under the 'Animation' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:417 msgid "Untiling" msgstr "" #. Translators: This is a header for a preference group in the 'General' tab. See https://github.com/Leleat/Tiling-Assistant/wiki/Window-Grab-Modes for more information #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:427 msgid "Default Window Movement Mode" msgstr "" #. Translators: This is the explanation for the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:428 msgid "The movement mode that is activated when no modifier key is pressed" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling will be activated, when the user drags a window to the screen edges #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to the screen halves #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:435 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:726 msgid "Edge Tiling" msgstr "" #. Translators: This is the explanation for the 'Edge Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:436 msgid "" "Moving the window to the screen edges or corners will open the default tile " "preview" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode, tiling a window may affect the current visible layout. E. g. A half-screen tile can be split into 2 quarter tiles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:445 msgid "Adaptive Tiling" msgstr "" #. Translators: This is the explanation for the 'Adaptive Tiling' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:446 msgid "" "Releasing the grab on a window while hovering over a tile will push the " "overlapped window(s) aside" msgstr "" #. Translators: This is the explanation for the 'Favorite Layout' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:458 msgid "" "The tile preview will stick to your favorite layout from the 'Layouts' page" msgstr "" #. Translators: This is an option for the preference group 'Default Window Movement Mode' in the 'General' tab. In this mode core features (Tiling Popup and Tile Groups) will be disabled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:469 msgid "Ignore Tiling Assistant" msgstr "" #. Translators: This is the explanation for the 'Ignore Tiling Assistant' option in the preference group 'Default Window Movement Mode' in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:470 msgid "Use Edge Tiling without Tiling Assistant's features" msgstr "" #. Translators: This is a header for misc settings in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:486 msgid "Other" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. When moving a window to a new monitor the tiling preview will stick for a short time (the 'Monitor Switch Grace Period') to the old monitor to make tiling on multi-monitor setups easier #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:489 msgid "Monitor Switch Grace Period" msgstr "" #. Translators: This is the explanation for the 'Monitor Switch Grace Period' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:490 msgid "" "When a window is dragged to a new monitor the tile preview will stick to the " "old monitor for a very short time. This way you can tile windows by " "'throwing' it towards any screen edge even if a monitor is bordering that " "edge." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. If the user has performance issue when dragging windows around, this will improve it but will decrease the accuracy of the tiling previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:495 msgid "Low Performance Movement Mode" msgstr "" #. Translators: This is the explanation for the 'Low Performance Movement Mode' under the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:496 msgid "" "Use this if there is a lag when moving windows around. This will however " "decrease the precision of the tile preview updates." msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. With this setting enabled, dragging windows to the screen edges won't use the default half-screen tiles but the tiles from the favorite layout #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:505 msgid "Adapt 'Edge Tiling' to your Favorite Layout" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Adaptive Tiling' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:514 msgid "'Adaptive Tiling' Move Mode Activator" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:523 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:543 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:563 msgid "Ctrl" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:524 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:544 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:564 msgid "Alt" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab. RMB refers to the right mouse button #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:525 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:545 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:565 msgid "RMB" msgstr "" #. Translators: This is a modifier for 'Adaptive Tiling Move Mode Activator' in the 'Other' preference group in the 'General' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:526 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:546 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:566 msgid "Super" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Favorite Layout' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:534 msgid "'Favorite Layout' Move Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This will set the modifier to activate the move mode 'Ignore Tiling Assistant' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:554 msgid "'Ignore Tiling Assistant' Mode Activator" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the vertical axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:574 msgid "Vertical Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. This is the area (in pixels) around the screen edges on the horizontal axis that activates the tile previews #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:592 msgid "Horizontal Edge Preview Trigger Area" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting determines the duration of that timer #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:610 msgid "Inverse Top Screen Edge Action Timer" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on landscape displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:628 msgid "Inverse Top Screen Edge Action for Landscape Displays" msgstr "" #. Translators: This is a setting in the 'Other' preference group in the 'General' tab. By default, when using 'Edge Tiling' and dragging the window to the top screen edge, the maximize tiling preview will show up. After some time the preview will switch to the top-half-screen tiling preview. This setting makes the top-half-screen tiling preview before the maxmize preview on portrait displays #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:637 msgid "Inverse Top Screen Edge Action for Portrait Displays" msgstr "" #. Translators: This is the name of a tab in the prefs window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:652 msgid "Keybindings" msgstr "快捷鍵" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that enables/disables the appearance of the Tiling Popup after a window is tiled #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:662 msgid "Toggle 'Tiling Popup'" msgstr "切換至「彈出式選單」" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab that activates the 'Tile Editing Mode' #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:667 msgid "Tile Editing Mode" msgstr "模塊編輯模式" #. Translators: This is the explanation for the keybinding 'Tile Editing Mode' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:668 msgid "A keyboard-driven mode to manage your tiled windows" msgstr "" #. Translators: This is a (deprecated) keybinding in the 'General' preference group in the 'Keybindings' tab. Its name is a bit misleading. The keybinding will only tile 1 window. Its behavior depends on the current tiling layout. It may cause a window to fill the main empty space or untile a window #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:673 msgid "Auto-Tile" msgstr "自動排版" #. Translators: This is the explanation for the keybinding 'Auto-Tile' in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:674 msgid "Un/tile the current window based on the visible tiles" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:679 msgid "Toggle 'Always on Top'" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:688 msgid "Toggle Maximization" msgstr "切換至最大化" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:693 msgid "Toggle Vertical Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:702 msgid "Toggle Horizontal Maximization" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:711 msgid "Restore Window Size" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Keybindings' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:716 msgid "Move Window to Center" msgstr "" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the top screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:729 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:789 msgid "Tile to top" msgstr "模塊化至上" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the bottom screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:734 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:794 msgid "Tile to bottom" msgstr "模塊化至下" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the left screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the left screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:739 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:799 msgid "Tile to left" msgstr "模塊化至左" #. Translators: This is a keybinding in the 'Edge Tiling' preference group in the 'Keybindings' tab to tile window to the right screen half #. Translators: This is a keybinding in the 'Edge Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the right screen half without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:744 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:804 msgid "Tile to right" msgstr "模塊化至右" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:754 msgid "Corner Tiling" msgstr "" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:757 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:821 msgid "Tile to top-left" msgstr "模塊化至左上" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the top right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the top right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:762 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:826 msgid "Tile to top-right" msgstr "模塊化至右上" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom left quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom left quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:767 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:831 msgid "Tile to bottom-left" msgstr "模塊化至左下" #. Translators: This is a keybinding in the 'Corner Tiling' preference group in the 'Keybindings' tab to tile window to the bottom right quarter #. Translators: This is a keybinding in the 'Corner Tiling without Tiling Assistant' preference group in the 'Keybindings' tab to tile window to the bottom right quarter without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:772 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:836 msgid "Tile to bottom-right" msgstr "模塊化至右下" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to screen halves without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:782 msgid "Edge Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab to tile windows to quarters without spawning a Tiling Popup #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:814 msgid "Corner Tiling without Tiling Assistant" msgstr "" #. Translators: This is a header for a preference group in the 'Keybindings' tab for some keybindings for debugging #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:846 msgid "Debugging" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the tiled windows rectangles #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:853 msgid "Show Tiled Rects" msgstr "" #. Translators: This is a keybinding in the 'Debugging' preference group in the 'Keybindings' tab to visibly show the area of the tiles without windows #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:858 msgid "Show Free Screen Rects" msgstr "" #. Translators: This is the name of a tab in the prefs window to configure tiling presets ('Layouts') #. Translators: This is a header for a preference group in the 'Layouts' tab where user can define layouts (tiling presets) #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:869 #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:899 msgid "Layouts" msgstr "" #. Translators: This is a setting in the 'General' preference group in the 'Layouts' tab to enable an icon in the top panel with some settings for the layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:883 msgid "Panel Indicator" msgstr "" #. Translators: This is a keybinding in the 'General' preference group in the 'Layouts' tab to show a popup with a list of the defined layouts #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:888 msgid "Search for a Layout" msgstr "" #. Translators: This is the explanation for the keybinding 'Search for a Layout' in the 'General' preference group in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:889 msgid "Open a popup listing all the available layouts" msgstr "" #. Translators: This is a tooltip for a button that defines a new tiling preset (layout) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:923 msgid "Add a new Layout." msgstr "" #. Translators: This is a tooltip for a button that saves the changes to the defined tiling presets (layouts) in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:930 msgid "Save the layouts to the disk. Invalid changes will be lost!" msgstr "" #. Translators: This is a tooltip for a button that reloads the the layouts from the disks in the 'Layouts' tab #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:937 msgid "Reload the layouts from the disk - discarding all non-saved changes." msgstr "" #. Translators: This is the setting to toggle the visibility of advanced/experimental settings in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:994 msgid "Advanced / Experimental Settings" msgstr "" #. Translators: This is the explanation for the 'Advanced / Experimental Settings' setting in the preference window that can be enabled via the headerbar popup menu #: tiling-assistant@leleat-on-github/src/ui/prefs.ui:995 msgid "Show more settings in the main preference window" msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:11 msgid "" "Replace the keyboard shortcuts. Press 'space' or 'return' when listening for " "a shortcut to append a new one to the existing shortcuts instead." msgstr "" #: tiling-assistant@leleat-on-github/src/ui/shortcutListener.ui:23 msgid "Clear the keyboard shortcuts" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:57 msgid "Tiling popup enabled" msgstr "" #. Translators: This is the notification text when the Tiling Popup is enabled/disabled via the keyboard shortcut #: tiling-assistant@leleat-on-github/src/extension/keybindingHandler.js:59 msgid "Tiling popup was disabled" msgstr "" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated but no layout was defined by the user. #. Translators: This is a placeholder text within a popup, if the user didn't define a tiling layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:105 #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:496 msgid "No valid layouts defined." msgstr "" #. Translators: This is a notification that pops up when a keyboard shortcut to activate a user-defined tiling layout is activated and the user attached an app to a tile so that a new instance of that app will automatically open in the tile. But that app seems to have been uninstalled since the definition of the layout. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:197 msgid "Popup Layouts: App not found." msgstr "" #. Translators: This is the placeholder text for a search field. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:340 msgid "Type to search..." msgstr "" #. Translators: This is the text that will be displayed as the name of the user-defined tiling layout if it hasn't been given a name. #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:445 msgid "Nameless layout..." msgstr "" #: tiling-assistant@leleat-on-github/src/extension/layoutsManager.js:523 msgid "Preferences" msgstr "" #. Translators: This is a notification that pops up if the user tries to enter the Tile Editing Mode via a keyboard shortcut. #: tiling-assistant@leleat-on-github/src/extension/tileEditingMode.js:62 msgid "Can't enter 'Tile Editing Mode', if no tiled window is visible." msgstr "" #. Translators: This is a placeholder text of an entry in the prefs when defining a tiling layout. #: tiling-assistant@leleat-on-github/src/prefs/layoutRowEntry.js:38 msgid "'User Guide' for help..." msgstr "" #~ msgid "Window Gaps" #~ msgstr "視窗間距" #~ msgid "Gaps on Maximized Windows" #~ msgstr "最大化視窗的間距" #~ msgid " General " #~ msgstr " 一般 " #~ msgid " Side Tiling " #~ msgstr " 側邊排版 " #~ msgid " Corner Tiling " #~ msgstr " 角落排版 " #~ msgid "Tiling Assistant" #~ msgstr "協助排版" #~ msgid "Hidden Settings" #~ msgstr "隱藏設定" #~ msgid "Tiling Popup: Current Workspace only" #~ msgstr "模塊彈出式選單:僅限目前工作區" #~ msgid "Tile Editing Mode: Focus Color" #~ msgstr "模塊編輯模式:聚焦的顏色" #~ msgid "Tile Animations" #~ msgstr "模塊化動畫" #~ msgid "Untile Animations" #~ msgstr "解除模塊化動畫"