diff options
Diffstat (limited to 'extensions/46/vertical-workspaces')
27 files changed, 5745 insertions, 3990 deletions
diff --git a/extensions/46/vertical-workspaces/CHANGELOG.md b/extensions/46/vertical-workspaces/CHANGELOG.md index 18de9a5..ac557c0 100644 --- a/extensions/46/vertical-workspaces/CHANGELOG.md +++ b/extensions/46/vertical-workspaces/CHANGELOG.md @@ -1,5 +1,79 @@ ## Changelog: -### v46.1 for GNOME 45.2+, v44.12 for GNOME 42-44 (not released yet) +### v46.4 for GNOME 45.2+ (), v44.14 for GNOME 42-44 (not yet released) +**Fixed:** +- App grid: Inconsistent grid size on the same monitor when switching monitors (#160) +- App grid: The grid layout manager's current page being out of sync with the grid's current page causes page shifts while dragging app icons and incorrect page navigation controls (#160, upstream bug) +- App grid: After dragging an icon out of a multi-page folder, the folder view shows navigation hints the next time it is opened (#160, upstream bug) +- App grid: Grid page switches to the page with selected icon when user starts dragging an icon on another page +- App grid: Page indicators don't accept drop, so the app icon can't be moved to a new page +- App grid: Keyboard navigation inside a folder doesn't work (upstream bug, fixed in GS 47) +- App grid: Workspace thumbnails not re-scaling after switching workspace outside of the overview using a trackpad +- Vertical dash: Running dot position in GNOME 46.0 (Ubuntu 24.04) + +**Added:** +- GNOME 47 support +- *Adaptive* options for the maximum dash and app search icon size that supports low resolution and highly scaled displays +- Search view scroll bar style to make it visible +- App grid: Drag-and-drop between folders +- App grid: Added an option *App Grid Search Mode* that can be set to *Filter App Grid View*, which filters the app grid icons while you're typing, instead of switching to the default search view +- App grid: Added *Alphabet* sorting option that sorts folders along with apps + + +### v46.3.1 for GNOME 45.2+ (2024-06-10), v44.14 for GNOME 42-44 (not yet released) +**Fixed:** +- *App Grid Page Height Scale* option affects folder icon size +- *Smooth App Grid Animations* options has no effect + + +### v46.3 for GNOME 45.2+ (2024-06-08), v44.14 for GNOME 42-44 (not yet released) +**Fixed:** +- App grid icon order and grid dimensions issues (#160) +- App grid partially visible after login +- Vertical dash running app indicator position in GNOME 46.2 (#150) +- Dash label border radius is set too high for multiline labels +- Search entry position in some overview configurations (#161) +- Window attention handler options don't work properly + +**Added** +- App grid *App Grid Page Height Scale* option +- Separated *Folder Grid Spacing* option + + +### v46.2 for GNOME 45.2+ (2024-05-15), v44.13 for GNOME 42-44 (2024-05-15) +**Fixed:** +- Inconsistent behavior of dash icons and app grid icons (#152) +- Sorting option doesn't work for app folders (#154) +- V-Shell overrides Dash to Dock's background opacity setting (#155) +- Conflicts with Dash2Dock Animated (#153) +- When the main panel is set to show only in the overview, its content might be unclickable (#157) +- Workspace thumbnails DND can be difficult to use when creating new workspaces (#128) + + +### v46.1 for GNOME 45.2+ (2024-05-09), v44.12 for GNOME 42-44 (2024-05-09) +**Fixed:** +- Fixed conflicts with Dash to Dock that could cause GNOME to crash at startup +- Resolved issue where V-Shell affected Dash to Dock icon highlighting +- Corrected search entry and results allocation to consider Dash to Dock +- Adjusted app folder dialogs for proper sizing and positioning +- Aligned secondary monitor overview with the primary one (option) +- Removed all code related to previously removed modules +- Fixed GNOME Shell recovery when V-Shell is disabled +- The *App Grid Page Width Scale* option now works for all configurations + +**Added:** +- Added *Delay at Startup* option to allow delaying activation of V-Shell after login. Automatically enabled when Dash to Dock, Ubuntu Dock, or Dash to Panel is detected +- Added *Click Empty Space To Close* option +- Added close button to the app folder dialog + +**Changed** +- Refactored the app grid module for improved efficiency and reliability +- Removed the 32px option for app grid icon size +- Moved the *Remove* folder button to the left side of the folder dialog +- Adjusted folder grid columns and rows settings to serve as maximum limits rather than fixed page size, allowing for better control over the default adaptive algorithm +- Relocated all app grid settings to a separate tab for better organization + + +### v46.0 for GNOME 45.2+ (2024-03-30 ego), v44.12 for GNOME 42-44 (not released) **Added** - Support for GNOME 46 - Option *Fix New Window Not On Current Monitor* tries to work around that issue. However, success rate is not 100% diff --git a/extensions/46/vertical-workspaces/README.md b/extensions/46/vertical-workspaces/README.md index 8adfff2..f094027 100644 --- a/extensions/46/vertical-workspaces/README.md +++ b/extensions/46/vertical-workspaces/README.md @@ -7,38 +7,129 @@ Currently supported GNOME versions: 42 - 46 [<img alt="" height="100" src="https://raw.githubusercontent.com/andyholmes/gnome-shell-extensions-badge/master/get-it-on-ego.svg?sanitize=true">](https://extensions.gnome.org/extension/5177/vertical-workspaces/) ![Custom Overview Layout](screenshots/screenshot.jpg) -![Custom Overview Layout](screenshots/screenshot0.jpg) ## Features -- Vertically or horizontally stacked workspaces -- Adjust position, orientation, scale and visibility of overview content -- Customizable profiles offer predefined configurations for GNOME 3.xx, GNOME 40+ and another 2 custom layouts -- 2 overview modes with static windows/workspace. The *Static Workspace* option allows you to use dash like a dock with auto-hide, but with all advantages of the activities overview -- Support for secondary monitors, workspace thumbnails can be placed on the opposite side than on the primary monitor -- Wallpaper background with adjustable blur effect and brightness in the overview -- Custom Dash icon size and on-click/scroll behavior -- Optional workspace isolated Dash -- Dash background transparency and corner radius adjustments -- Adjustable app grid icon size, number of columns and rows, content, optional active and draggable icons in folder preview in optional 3x3 grid -- Custom search view width, app results icons size and number of result lists rows, improved app search -- Workspace thumbnails can show background wallpaper and labels (always or on mouse hover) with combination of workspace index, workspace name, name of the current application and current window title -- Title captions of window previews moved into the preview (originally beneath the preview) and can be set as always visible. Adjustable window preview icon -- Static background in workspace switcher (outside overview). Keeps Conky below, DING desktop icons stay visible (if not covered by windows) -- Control over transition animations, including speed -- Recent files search provider with *Ctrl + Space* hotkey -- Supports WSP (Window search provider) extension with *Space* hotkey that allows quick window navigation -- Supports ESP (Extensions search provider) with *Ctrl + Shift + Space* hotkey that allows to search for installed extensions, open their settings and enable or disable them -- Reorder workspaces in overview using *Shift + Scroll* or *Shift + Page Up/Down* -- Adds *Force Quit*, *Close Windows on Current Workspace* and *Move Windows to Current Workspace* items to app icon menu. The latter action can be activated using *Shift + click* on app icon -- Change notification banners and OSD popups position -- Window attention handler options can activate the attention-demanding window immediately or silence its notification -- Optional position of the hot corner that can follow the dash and expand to hot edge -- Super key double-press options -- Supports WTMB (Window Thumbnails) extension that allows you to create Picture-in-Picture thumbnail of the window by clicking on its preview in the overview (secondary mouse buttons or window preview icon) +- Supports both vertically and horizontally stacked workspaces +- Customizable overview layout, appearance, behavior, shortcuts +- Customizable secondary monitor overview +- Static overview modes minimize screen content movement +- Customizable app grid and app folders - icon size, dimensions, sorting, active folder previews +- Customizable dash - icon size, appearance and behavior, workspace isolation, click and scroll actions +- Customizable search - results width, number of results, improved searching +- Customizable workspace switcher - static background +- Notification and OSD positions and behavior +- Window attention handler behavior +- Hot corner/edge position +- Customizable Super key behavior +- Keyboard and mouse shortcuts allow advanced workspace and window control +- 4 predefined and fully customizable profiles +- Supports Dash to Dock / Ubuntu Dock / Dash to Panel + + +## Added functionality +This section explains some of the less obvious or less visible additions to the Shell's behavior. + +### Overview - keyboard and mouse shortcuts +|Shortcut| Description| +|--------|------------| +|`Shift + click on app icon in dash` | Move all windows of the application to the current workspace| +|`Secondary mouse click on the activities indicator` | Open app grid| +|`Shift + Scroll`, `Shift + Page Up/Down` | Reorder current workspace| +|`Shift + Ctrl + Space` | Open V-Shell *Settings* window| +|`Space` | Activate window search with all open windows if *WSP (Window Search Provider)* is installed and enabled| +|`Ctrl + Space` | Activate extensions search with all installed extensions if *ESP (Extensions Search Provider)* is installed and enabled| +|`Alt + Space` | Focus dash so you can use arrow keys to select app icon and `Space`/`Enter` to activate it + + + ### New buttons +|Button| Description| +|------|------------| +| *Close button in workspace thumbnail* | Close all windows on the workspace. Default setting requires double-click | +| *Trash button in app folder* | Remove folder - move all icons to the main grid. Requires double-click | + +### Active icons in app folder previews +To enhance the efficiency of the application menu, V-Shell offers the 'Active Icons in Folder Preview' option. When enabled, icons in the folder preview (folder icon) behave like regular app icons, allowing users to interact with them without opening the folder. V-Shell allows you to increase the number of icons in the preview from 4 to 9, as well as adjust the size of the app grid icons. This feature enables the folder icons to divide the main app grid into sections, with the most frequently used apps readily accessible while others remain hidden deeper within folders. + +![Custom Overview Layout](screenshots/screenshot0.jpg) + +### Open all apps in the folder at once +Simply drag-and-drop folder onto a workspace thumbnail to open all containing applications. + +## Known issues +### Workspace navigation shortcuts +The default GNOME Shell configuration includes predefined shortcuts for workspaces oriented in both axis: +`(Shift)+Ctrl+Alt+ Arrow Keys` +and for horizontal only: +`(Shift)+Super+PageUp/Down` + +The default GNOME *Settings* application only offers options to configure keyboard shortcuts for horizontally oriented workspaces. However, the `gSettings` configuration scheme provides keys for shortcuts for vertically oriented workspaces as well. You can access and configure these shortcuts using the **dconf Editor**. + +When V-Shell is configured to use vertically stacked workspaces, the `(Shift)+Super+PageUp/Down` shortcuts for switching workspaces stop working. +V-Shell provides the option `Override Page Up/Down Shortcuts` to automatically switch the default `Super+PageUp/Down` and `Shift+Super+PageUp/Down` shortcuts for the current workspace orientation. If enabled, this option will move the shortcuts between following gSettings keys: +| Horizontal orientation | Vertical orientation | +|------------------------|----------------------| +| `switch-to-workspace-left` | `switch-to-workspace-up`| +| `switch-to-workspace-right` | `switch-to-workspace-down`| +| `move-to-workspace-left` | `move-to-workspace-up`| +| `move-to-workspace-right` | `move-to-workspace-down`| + +Note that unlike the GNOME *Settings* application, *dconf Editor* allows you to add more than one keyboard shortcut to each action. V-Shell preserves all other shortcuts, only moves following strings between related gSetting keys: +- `<Super>Page_Up` +- `<Super>Page_Down` +- `<Super><Shift>Page_Up` +- `<Super><Shift>Page_Down` + +The key order follows the order in which GNOME Settings stores the shortcuts. If you add the same shortcut but with a different key order, V-Shell will not recognize it, and you might end up with the same shortcut assigned to two actions. + + +### Stuttering overview animations +On weaker hardware, you may experience stuttering in overview animations. This usually occurs due to blur effect transitions. In this scenario, you should avoid configurations where blur transitions are needed. Here are some tips on how to use the blur effect without affecting overview animations: +- Enable `Show Workspace Preview Background`, which removes the need for blur transitions between desktop view and overview. +- Set the same amount of blur for *Window Picker View* and *App Grid* +- If your configuration requires blur transitions, keep the `Smooth Blur Transitions` option disabled + + +### Compatibility with other extensions +V-Shell overrides parts of the GNOME Shell's UI code, and many extensions do the same, so conflicts are inevitable. V-Shell tries to mitigate the consequences of conflicts with the most popular extensions, which includes disabling its own modules. This means that some of V-Shell's settings may not function when conflicting extensions are enabled. V-Shell also provides manual control over its modules so the user can disable problematic ones if needed. + +Please, report any incompatibility, you encounter while using V-Shell. + +#### Incompatible extensions +- *Search Light* - You can achieve similar behavior by switching V-Shell to the `Static Workspace` `Overview mode` + +#### V-Shell modules automatically disabled when conflicting extensions are detected +| Module | Extensions causing module to disable | +|-----------------------|--------------------------------------| +| Dash | *Dash to Dock*, *Ubuntu Dock*, *Dash to Panel*, *Dash2Dock Animated* | +| Panel | *Dash to Panel*, *Hide Top Bar* | +| Layout | *Dash to Panel*, *CHC-E*, | +| WorkspaceSwitcherPopup| *WSM (Workspace Switcher Manager)* | + +#### Extensions causing V-Shell to automatically delay its activation +to prevent crashes upon GNOME Shell starting up: +- *Dash to Dock* +- *Ubuntu Dock* +- *Dash to Panel* +- *Dash2Dock Animated* + +You can enable this option manually if needed, using the `Delay at Startup` option on the *Misc* tab of the *Settings* window. + +#### Extensions whose functionality is included in V-Shell +and should be disabled or restricted by the user: +- Partially *Blur My Shell* - V-Shell provides a basic settings for the overview background, including brightness and blur effects. If you want to use *Blur My Shell*, consider disabling its options for the overview, including app folders, to prevent visual glitches and inconsistency during transitions between overview states. +- *Alphabetical App Grid* - V-Shell provides much more options than alphabetical sorting +- *Grand Theft Focus* and other extensions preventing showing notification instead of immediately focusing the window that demands attention +- *Hot Edge* - V-Shell provides this functionality as an option of the `Hot Corner Position` setting +- Some of the *Just Perfection* options including notifications/OSD positions, hiding main panel, animation speed, dash icon size and more +- *Impatience* and extensions adjusting animation speed +- *Click to close overview* - V-Shell provides the `Click Empty Space To Close` option + ## Changelog +See what's changed in recent versions [CHANGELOG.md](CHANGELOG.md) + ## Installation ### Installation from extensions.gnome.org @@ -58,20 +149,20 @@ The most recent version in the repository is the one I'm currently using and dev You may need to install `git`, `make`, `gettext` and `glib2.0` for successful installation. Navigate to the directory you want to download the source code and execute following commands in the terminal: -GNOME 45: +**GNOME 45+:** git clone https://github.com/G-dH/vertical-workspaces.git cd vertical-workspaces make install -GNOME 42 - 44: +**GNOME 42 - 44:** git clone https://github.com/G-dH/vertical-workspaces.git cd vertical-workspaces git checkout gnome-42-44 make install -If you get `Can't recursively copy directory` error, take a look at issue #51. +If you get `Can't recursively copy directory` error, take a look at issue [#51](https://github.com/G-dH/vertical-workspaces/issues/51). ### Enabling the extension After installation you need to enable the extension and access its settings. @@ -80,8 +171,20 @@ After installation you need to enable the extension and access its settings. - Now you should see *Vertical Workspaces* extension in *Extensions* application (re-open the app if needed to load new data), where you can enable it and access its Preferences window by pressing `Settings` button. ## Credits -This extension uses customized utils and dash modules of the [Vertical Overview extension](https://github.com/RensAlthuis/vertical-overview). +V-Shell contains modified GNOME Shell source code and was originally based on parts of [Vertical Overview extension](https://github.com/RensAlthuis/vertical-overview). + + +## Contribution +If you want to help with V-Shell development, please provide feedback, whether it's positive, negative, a bug report, or a feature request. Even if I don't agree with you, it can help improve V-Shell. + + +## Donations +If you enjoy using my extensions, you can help me with my coffee expenses: + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png)](https://www.buymeacoffee.com/georgdh) + +Any support is greatly appreciated! + -## Buy me a coffee -If you like my extensions and want to keep me motivated give me some useful feedback, but you can also help me with my coffee expenses: -[buymeacoffee.com/georgdh](https://buymeacoffee.com/georgdh) +## License +This program is distributed under the terms of the GNU General Public License, version 3 or later. See [LICENSE](./LICENSE) file for details. diff --git a/extensions/46/vertical-workspaces/extension.js b/extensions/46/vertical-workspaces/extension.js index 0378e0b..64336f0 100644 --- a/extensions/46/vertical-workspaces/extension.js +++ b/extensions/46/vertical-workspaces/extension.js @@ -10,14 +10,11 @@ 'use strict'; -import Clutter from 'gi://Clutter'; import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; import Meta from 'gi://Meta'; import St from 'gi://St'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as ModalDialog from 'resource:///org/gnome/shell/ui/modalDialog.js'; import * as Config from 'resource:///org/gnome/shell/misc/config.js'; @@ -75,8 +72,11 @@ export default class VShell extends Extension.Extension { Me.ESP_PREFIX = 'eq//'; Me.opt = new Me.Settings.Options(Me); + opt = Me.opt; Me.Util.init(Me); + + Me.updateMessageDialog = new Me.Util.RestartMessage(); } _cleanGlobals() { @@ -87,14 +87,28 @@ export default class VShell extends Extension.Extension { enable() { this._init(); - // flag for Util.getEnabledExtensions() - Me.extensionsLoadIncomplete = Main.layoutManager._startingUp; - opt = Me.opt; - this._initModules(); - this.activateVShell(); - Me.extensionsLoadIncomplete = false; + // prevent conflicts during startup + let skipStartup = Me.gSettings.get_boolean('delay-startup') || + Me.Util.getEnabledExtensions('ubuntu-dock').length || + Me.Util.getEnabledExtensions('dash-to-dock').length || + Me.Util.getEnabledExtensions('dash2dock').length || + Me.Util.getEnabledExtensions('dash-to-panel').length; + if (skipStartup && Main.layoutManager._startingUp) { + this._startupConId = Main.layoutManager.connect('startup-complete', () => { + this._delayedStartup = true; + this._activateVShell(); + // Since VShell has been activated with a delay, move it in extensionOrder + let extensionOrder = Main.extensionManager._extensionOrder; + const idx = extensionOrder.indexOf(this.metadata.uuid); + extensionOrder.push(extensionOrder.splice(idx, 1)[0]); + Main.layoutManager.disconnect(this._startupConId); + this._startupConId = 0; + }); + } else { + this._activateVShell(); + } console.debug(`${Me.metadata.name}: enabled`); } @@ -102,10 +116,14 @@ export default class VShell extends Extension.Extension { // Reason for using "unlock-dialog" session mode: // Updating the "appDisplay" content every time the screen is locked/unlocked takes quite a lot of time and affects the user experience. disable() { + if (this._startupConId) + Main.layoutManager.disconnect(this._startupConId); this.removeVShell(); this._disposeModules(); console.debug(`${Me.metadata.name}: disabled`); + Me.updateMessageDialog.destroy(); + Me.updateMessageDialog = null; this._cleanGlobals(); } @@ -152,15 +170,24 @@ export default class VShell extends Extension.Extension { Me.Modules = null; } - activateVShell() { + _activateVShell() { this._enabled = true; + if (!this._delayedStartup && !Main.sessionMode.isLocked) { + Me.updateMessageDialog.showMessage(); + this._delayedStartup = false; + } + this._originalGetNeighbor = Meta.Workspace.prototype.get_neighbor; this._removeTimeouts(); this._timeouts = {}; - this._ensureOverviewIsHidden(); + if (!Main.layoutManager._startingUp) + this._ensureOverviewIsHidden(); + + // store dash _workId so we will be able to detect replacement when entering overview + this._storeDashId(); // load VShell configuration this._updateSettings(); @@ -184,9 +211,6 @@ export default class VShell extends Extension.Extension { this._updateSettingsConnection(); - // store dash _workId so we will be able to detect replacement when entering overview - this._storeDashId(); - // workaround for upstream bug - overview always shows workspace 1 instead of the active one after restart this._setInitialWsIndex(); @@ -213,8 +237,6 @@ export default class VShell extends Extension.Extension { // switch PageUp/PageDown workspace switcher shortcuts this._switchPageShortcuts(); - // hide status message if shown - this._showStatusMessage(false); this._prevDash = null; // restore default animation speed @@ -226,7 +248,6 @@ export default class VShell extends Extension.Extension { _ensureOverviewIsHidden() { if (Main.overview._shown) { Main.overview._shown = false; - // Main.overview._animationInProgress = true; Main.overview._visibleTarget = false; Main.overview._overview.prepareToLeaveOverview(); Main.overview._changeShownState('HIDING'); @@ -237,11 +258,13 @@ export default class VShell extends Extension.Extension { _resetShellProperties() { const controls = Main.overview._overview.controls; - // remove any position offsets from dash and ws thumbnails - if (!Me.Util.dashNotDefault()) { - controls.dash.translation_x = 0; - controls.dash.translation_y = 0; - } + // layoutManager._dash retains reference to the default dash even when DtD is enabled + const dash = controls.layoutManager._dash; + // Restore default dash background style + dash._background.set_style(''); + + dash.translation_x = 0; + dash.translation_y = 0; controls._thumbnailsBox.translation_x = 0; controls._thumbnailsBox.translation_y = 0; controls._searchEntryBin.translation_y = 0; @@ -255,9 +278,6 @@ export default class VShell extends Extension.Extension { controls._thumbnailsBox.opacity = 255; controls._searchController._searchResults.opacity = 255; - - // restore default dash background style - controls.dash._background.set_style(''); } _removeTimeouts() { @@ -297,8 +317,7 @@ export default class VShell extends Extension.Extension { _updateConnections() { if (!this._monitorsChangedConId) - this._monitorsChangedConId = Main.layoutManager.connect('monitors-changed', () => this._updateVShell(2000)); - + this._monitorsChangedConId = Main.layoutManager.connect('monitors-changed', () => this._adaptToSystemChange()); if (!this._showingOverviewConId) this._showingOverviewConId = Main.overview.connect('showing', this._onShowingOverview.bind(this)); @@ -317,7 +336,9 @@ export default class VShell extends Extension.Extension { } ); } else if (session.currentMode === 'unlock-dialog') { - Me.Modules.panelModule.update(true); + Me.Modules.panelModule.update(); + Main.layoutManager.panelBox.translation_y = 0; + Main.panel.opacity = 255; } }); } @@ -341,14 +362,14 @@ export default class VShell extends Extension.Extension { // UNINSTALLED: 99, // }; // no need to restart on disable/remove - // - if DtD was enabled before VShell, VShell will be rebased by extensionSystem - // - if DtD was enabled after VShell, the first _showingOverview detect replacement of the dash and repair VShell + // - if DtD was enabled before VShell, VShell will be rebased by the extensionSystem + // - If DtD was enabled after VShell, the first _showingOverview detects the replacement of the dash and repairs VShell const reset = [1, 2].includes(extension.state); const dashReplacement = uuid.includes('dash-to-dock') || uuid.includes('ubuntu-dock') || uuid.includes('dash-to-panel'); if (dashReplacement && reset) this._watchDashToDock = true; if (!Main.layoutManager._startingUp && reset && dashReplacement) - this._updateVShell(1999); + this._adaptToSystemChange(2000); } ); } @@ -427,50 +448,14 @@ export default class VShell extends Extension.Extension { Me.Modules.layoutModule.update(reset); Me.Modules.dashModule.update(reset); - // avoid enabling panel module when session is locked - if (reset || (!reset && !Main.sessionMode.isLocked)) - Me.Modules.panelModule.update(reset); - // the panel must be visible when screen is locked - // at startup time, panel will be updated from the startupAnimation after allocation - if (!reset && Main.sessionMode.isLocked && !Main.layoutManager._startingUp) - Me.Modules.panelModule._showPanel(true); - // PanelModule._showPanel(true); - // hide panel so it appears directly on the final place - /* else if (Main.layoutManager._startingUp && !Meta.is_restart()) - Main.panel.opacity = 0;*/ + Me.Modules.panelModule.update(reset); Me.Modules.workspaceAnimationModule.update(reset); Me.Modules.workspaceSwitcherPopupModule.update(reset); - Me.Modules.swipeTrackerModule.update(reset); - Me.Modules.searchModule.update(reset); - // don't rebuild app grid on any screen lock - // even if the extension includes unlock-screen session mode - // disable/enable is called at least once even on GS44 - // when screen lock is activated for the first time - // because every first disable of each extension rebases - // the entire extensions stack that was enabled later - if (Main.sessionMode.isLocked) - this._sessionLockActive = true; - - // This covers unnecessary enable/disable cycles during first screen lock when extensions are rebased, but is not allowed by the EGO rules - if (!this._sessionLockActive || !Main.extensionManager._getEnabledExtensions().includes(Me.metadata.uuid)) { - // iconGridModule will be updated from appDisplayModule - Me.Modules.appDisplayModule.update(reset); - } - - if (!this._sessionLockActive && !Main.layoutManager._startingUp && opt.APP_GRID_PERFORMANCE) { - // Avoid showing status at startup, can cause freeze - this._showStatusMessage(); - } - - if (!Main.sessionMode.isLocked) - this._sessionLockActive = false; - - // iconGridModule will be updated from appDisplayModule - // Me.Modules.appDisplayModule.update(reset); + Me.Modules.appDisplayModule.update(reset); Me.Modules.windowAttentionHandlerModule.update(reset); Me.Modules.appFavoritesModule.update(reset); @@ -479,32 +464,34 @@ export default class VShell extends Extension.Extension { Me.Modules.overlayKeyModule.update(reset); Me.Modules.searchControllerModule.update(reset); + if (Main.sessionMode.isLocked) + this._sessionLockActive = true; + + if (!Main.sessionMode.isLocked) + this._sessionLockActive = false; + if (!reset && !Main.layoutManager._startingUp) Main.overview._overview.controls.setInitialTranslations(); + if (this._sessionLockActive) { + Main.layoutManager.panelBox.translation_y = 0; + Main.panel.opacity = 255; + } } _onShowingOverview() { if (Main.layoutManager._startingUp) return; - Main.overview._overview.controls.opacity = 255; - - // store pointer X coordinate for OVERVIEW_MODE 1 window spread - if mouse pointer is steady, don't spread - opt.showingPointerX = global.get_pointer()[0]; - - if (!Main.overview._overview.controls._bgManagers && (opt.SHOW_BG_IN_OVERVIEW || opt.SHOW_WS_PREVIEW_BG) && !Me.Util.getEnabledExtensions('blur-my-shell').length) - Main.overview._overview.controls._setBackground(); - if (this._watchDashToDock) { - // workaround for Dash to Dock (Ubuntu Dock) breaking overview allocations after enabled and changed position - // DtD replaces dock and its _workId on every position change + // Workaround for Dash to Dock (Ubuntu Dock) breaking overview allocations after enabling and changing its position + // DtD replaces its _workId on every position change const dash = Main.overview.dash; if (this._prevDash !== dash._workId) - this._updateVShell(0); + this._adaptToSystemChange(0); } } - _updateVShell(timeout = 200) { + _adaptToSystemChange(timeout = 200, full = false) { if (!this._enabled || Main.layoutManager._startingUp) return; @@ -518,18 +505,17 @@ export default class VShell extends Extension.Extension { return GLib.SOURCE_REMOVE; const dash = Main.overview.dash; - if (timeout < 2000) { // timeout < 2000 for partial update + if (!full) { + console.warn(`[${Me.metadata.name}] Warning: Updating overrides ...`); this._prevDash = dash._workId; - console.warn(`[${Me.metadata.name}]: Dash has been replaced, updating extension ...`); Me._resetInProgress = true; - // update only necessary modules if dash has been replaced + // Only update modules that might be affected by the dock extension this._repairOverrides(); Me._resetInProgress = false; } else { - console.warn(`[${Me.metadata.name}]: Updating extension ...`); - // for case the monitor configuration has been changed, update all + console.warn(`[${Me.metadata.name}] Warning: Rebuilding V-Shell ...`); Me._resetInProgress = true; - this.activateVShell(); + this._activateVShell(); Me._resetInProgress = false; } this._timeouts.reset = 0; @@ -538,7 +524,7 @@ export default class VShell extends Extension.Extension { ); } - // the key modules that can be affected by the supported incompatible extensions + // Modules possibly affected by supported but incompatible extensions _repairOverrides() { Me.Modules.overviewModule.update(); Me.Modules.overviewControlsModule.update(); @@ -548,6 +534,7 @@ export default class VShell extends Extension.Extension { Me.Modules.panelModule.update(); Me.Modules.dashModule.update(); this._updateSettings(); + Main.overview._overview.controls._setBackground(); } _updateSettings(settings, key) { @@ -557,16 +544,17 @@ export default class VShell extends Extension.Extension { // avoid overload while loading profile - update only once // delayed gsettings writes are processed alphabetically if (key === 'aaa-loading-profile') { - this._showStatusMessage(); if (this._timeouts.loadingProfile) GLib.source_remove(this._timeouts.loadingProfile); this._timeouts.loadingProfile = GLib.timeout_add( GLib.PRIORITY_DEFAULT, 100, () => { - this.activateVShell(); + this._activateVShell(); this._timeouts.loadingProfile = 0; return GLib.SOURCE_REMOVE; - }); + } + ); + Me.updateMessageDialog.showMessage(); } if (this._timeouts.loadingProfile) return; @@ -590,16 +578,6 @@ export default class VShell extends Extension.Extension { opt.DASH_VISIBLE = opt.DASH_VISIBLE && !Me.Util.getEnabledExtensions('dash-to-panel@jderose9.github.com').length; - const monitorWidth = global.display.get_monitor_geometry(global.display.get_primary_monitor()).width; - if (monitorWidth < 1600) { - opt.APP_GRID_ICON_SIZE_DEFAULT = opt.APP_GRID_ACTIVE_PREVIEW && !opt.APP_GRID_USAGE ? 128 : 64; - opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT = 64; - } - - /* if (!Me.Util.dashIsDashToDock()) { // DtD has its own opacity control - Me.Modules.dashModule.updateStyle(dash); - }*/ - // adjust search entry style for OM2 if (opt.OVERVIEW_MODE2) Main.overview.searchEntry.add_style_class_name('search-entry-om2'); @@ -615,12 +593,6 @@ export default class VShell extends Extension.Extension { Main.overview.searchEntry.opacity = 255; St.Settings.get().slow_down_factor = opt.ANIMATION_TIME_FACTOR; - opt.START_Y_OFFSET = (opt.get('panelModule') && opt.PANEL_OVERVIEW_ONLY && opt.PANEL_POSITION_TOP) || - // better to add unnecessary space than to have a panel overlapping other objects - Me.Util.getEnabledExtensions('hidetopbar').length - ? Main.panel.height - : 0; - // Options for workspace switcher, apply custom function only if needed if (opt.WS_WRAPAROUND || opt.WS_IGNORE_LAST) Meta.Workspace.prototype.get_neighbor = this._getNeighbor; @@ -641,15 +613,12 @@ export default class VShell extends Extension.Extension { if (key?.endsWith('-module')) { for (let module of this._getModuleList()) { if (opt.options[module] && key === opt.options[module][1]) { - if (key === 'app-display-module') - this._showStatusMessage(); Me.Modules[module].update(); break; } } } - Main.overview._overview.controls._setBackground(); this._switchPageShortcuts(); if (key?.includes('panel')) @@ -698,6 +667,8 @@ export default class VShell extends Extension.Extension { case 'new-window-monitor-fix': this._updateNewWindowConnection(); break; + case 'click-empty-close': + Me.Modules.overviewControlsModule.update(); } if (key?.includes('app-grid') || @@ -705,10 +676,8 @@ export default class VShell extends Extension.Extension { key?.includes('dot-style') || key === 'show-search-entry' || key === 'ws-thumbnail-scale' || - key === 'ws-thumbnail-scale-appgrid') { - this._showStatusMessage(); + key === 'ws-thumbnail-scale-appgrid') Me.Modules.appDisplayModule.update(); - } } _switchPageShortcuts() { @@ -794,50 +763,6 @@ export default class VShell extends Extension.Extension { settings.set_strv(keyMoveDown, moveDown); } - // Status dialog that appears during updating V-Shell configuration and blocks inputs - _showStatusMessage(show = true) { - if ((show && Me._resetInProgress) || Main.layoutManager._startingUp || !Main.overview._overview.controls._appDisplay._sortOrderedItemsAlphabetically) - return; - - if (Me._vShellMessageTimeoutId) { - GLib.source_remove(Me._vShellMessageTimeoutId); - Me._vShellMessageTimeoutId = 0; - } - - if (Me._vShellStatusMessage && !show) { - Me._vShellStatusMessage.close(); - Me._vShellStatusMessage.destroy(); - Me._vShellStatusMessage = null; - } - - if (!show) - return; - - if (!Me._vShellStatusMessage) { - const sm = new /* Main.*/RestartMessage(_('Updating V-Shell...')); - sm.set_style('background-color: rgba(0,0,0,0.3);'); - sm.open(); - Me._vShellStatusMessage = sm; - } - - // just for case the message wasn't removed from appDisplay after App Grid realization - Me._vShellMessageTimeoutId = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - 5, - () => { - if (Me._vShellStatusMessage) { - Me._vShellStatusMessage.close(); - Me._vShellStatusMessage.destroy(); - Me._vShellStatusMessage = null; - Me._resetInProgress = false; - } - - Me._vShellMessageTimeoutId = 0; - return GLib.SOURCE_REMOVE; - } - ); - } - _getNeighbor(direction) { // workspace matrix is supported const activeIndex = this.index(); @@ -885,24 +810,3 @@ export default class VShell extends Extension.Extension { return global.workspace_manager.get_workspace_by_index(neighborExists || wraparound ? index : activeIndex); } } - -const RestartMessage = GObject.registerClass( -class RestartMessage extends ModalDialog.ModalDialog { - _init(message) { - super._init({ - shellReactive: true, - styleClass: 'restart-message headline', - shouldFadeIn: false, - destroyOnClose: true, - }); - - let label = new St.Label({ - text: message, - x_align: Clutter.ActorAlign.CENTER, - y_align: Clutter.ActorAlign.CENTER, - }); - - this.contentLayout.add_child(label); - this.buttonLayout.hide(); - } -}); diff --git a/extensions/46/vertical-workspaces/lib/appDisplay.js b/extensions/46/vertical-workspaces/lib/appDisplay.js index c33cf0d..d94f7df 100644 --- a/extensions/46/vertical-workspaces/lib/appDisplay.js +++ b/extensions/46/vertical-workspaces/lib/appDisplay.js @@ -23,12 +23,16 @@ import St from 'gi://St'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js'; import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; +import * as PageIndicators from 'resource:///org/gnome/shell/ui/pageIndicators.js'; + +import { IconSize } from './iconGrid.js'; let Me; let opt; // gettext let _; +let _appDisplay; let _timeouts; const APP_ICON_TITLE_EXPAND_TIME = 200; @@ -57,12 +61,12 @@ export const AppDisplayModule = class { opt = Me.opt; _ = Me.gettext; + _appDisplay = Main.overview._overview.controls._appDisplay; + this._firstActivation = true; this.moduleEnabled = false; this._overrides = null; - this._appGridLayoutSettings = null; - this._appDisplayScrollConId = 0; this._appSystemStateConId = 0; this._appGridLayoutConId = 0; this._origAppViewItemAcceptDrop = null; @@ -73,6 +77,7 @@ export const AppDisplayModule = class { Me = null; opt = null; _ = null; + _appDisplay = null; } update(reset) { @@ -104,54 +109,9 @@ export const AppDisplayModule = class { _timeouts = {}; - // Common - // this._overrides.addOverride('BaseAppViewCommon', AppDisplay.BaseAppView.prototype, BaseAppViewCommon); - // instead of overriding inaccessible BaseAppView class, we override its children - AppDisplay and FolderView - this._overrides.addOverride('BaseAppViewCommonApp', AppDisplay.AppDisplay.prototype, BaseAppViewCommon); - this._overrides.addOverride('BaseAppViewCommonFolder', AppDisplay.FolderView.prototype, BaseAppViewCommon); - this._overrides.addOverride('FolderView', AppDisplay.FolderView.prototype, FolderView); - this._overrides.addOverride('AppDisplay', AppDisplay.AppDisplay.prototype, AppDisplayCommon); - this._overrides.addOverride('AppViewItem', AppDisplay.AppViewItem.prototype, AppViewItemCommon); - this._overrides.addOverride('FolderIcon', AppDisplay.FolderIcon.prototype, FolderIcon); - if (opt.APP_GRID_ACTIVE_PREVIEW) - this._overrides.addOverride('ActiveFolderIcon', AppDisplay.FolderIcon, ActiveFolderIcon); - this._overrides.addOverride('AppIcon', AppDisplay.AppIcon.prototype, AppIcon); - - if (opt.ORIENTATION === Clutter.Orientation.VERTICAL) { - // this._overrides.addOverride('BaseAppViewVertical', AppDisplay.BaseAppView.prototype, BaseAppViewVertical); - this._overrides.addOverride('BaseAppViewVerticalApp', AppDisplay.AppDisplay.prototype, BaseAppViewVertical); - this._overrides.addOverride('BaseAppViewVerticalFolder', AppDisplay.FolderView.prototype, BaseAppViewVertical); - this._overrides.addOverride('AppDisplayVertical', AppDisplay.AppDisplay.prototype, AppDisplayVertical); - } - - // Custom App Grid - this._overrides.addOverride('AppFolderDialog', AppDisplay.AppFolderDialog.prototype, AppFolderDialog); - - // BaseAppViewGridLayout is not exported, we can only access current instance - this._overrides.addOverride('BaseAppViewGridLayout', Main.overview._overview.controls._appDisplay._appGridLayout, BaseAppViewGridLayout); - // this._overrides.addOverride('FolderGrid', AppDisplay.FolderGrid.prototype, FolderGrid); - - this._setAppDisplayOrientation(opt.ORIENTATION === Clutter.Orientation.VERTICAL); - this._updateDND(); - - const appDisplay = Main.overview._overview.controls._appDisplay; - - if (!this._originalWorkId) - this._originalWorkId = appDisplay._redisplayWorkId; - if (!this._newWorkId) { - appDisplay._redisplayWorkId = Main.initializeDeferredWork(appDisplay, () => { - appDisplay._redisplay(); - if (appDisplay._overviewHiddenId === 0) - appDisplay._overviewHiddenId = Main.overview.connect('hidden', () => appDisplay.goToPage(0)); - }); - this._newWorkId = appDisplay._redisplayWorkId; - } else { - appDisplay._redisplayWorkId = this._newWorkId; - } - - - if (!Main.sessionMode.isGreeter) - this._updateAppDisplayProperties(); + this._applyOverrides(); + this._updateAppDisplay(); + _appDisplay.add_style_class_name('app-display-46'); console.debug(' AppDisplayModule - Activated'); } @@ -164,15 +124,10 @@ export const AppDisplayModule = class { this._overrides = null; const reset = true; - this._setAppDisplayOrientation(false); - this._updateAppDisplayProperties(reset); - this._updateDND(reset); + this._updateAppDisplay(reset); this._restoreOverviewGroup(); - this._removeStatusMessage(); - // register a new appDisplay workId so the original code will be called from the callback - const appDisplay = Main.overview._overview.controls._appDisplay; - appDisplay._redisplayWorkId = this._originalWorkId; + _appDisplay.remove_style_class_name('app-display-46'); console.debug(' AppDisplayModule - Disabled'); } @@ -187,132 +142,66 @@ export const AppDisplayModule = class { } } - _setAppDisplayOrientation(vertical = false) { - const CLUTTER_ORIENTATION = vertical ? Clutter.Orientation.VERTICAL : Clutter.Orientation.HORIZONTAL; - // app display to vertical has issues - page indicator not working - // global appDisplay orientation switch is not built-in - let appDisplay = Main.overview._overview._controls._appDisplay; - // following line itself only changes in which axis will operate overshoot detection which switches appDisplay pages while dragging app icon to vertical - appDisplay._orientation = CLUTTER_ORIENTATION; - appDisplay._grid.layoutManager._orientation = CLUTTER_ORIENTATION; - appDisplay._swipeTracker.orientation = CLUTTER_ORIENTATION; - appDisplay._swipeTracker._reset(); - if (vertical) { - appDisplay._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); - - // move and change orientation of page indicators - const pageIndicators = appDisplay._pageIndicators; - pageIndicators.vertical = true; - appDisplay._box.vertical = false; - pageIndicators.x_expand = false; - pageIndicators.y_align = Clutter.ActorAlign.CENTER; - pageIndicators.x_align = Clutter.ActorAlign.START; - - // moving these bars needs more patching of the appDisplay's code - // for now we just change bars style to be more like vertically oriented arrows indicating direction to prev/next page - appDisplay._nextPageIndicator.add_style_class_name('nextPageIndicator'); - appDisplay._prevPageIndicator.add_style_class_name('prevPageIndicator'); - - // setting their x_scale to 0 removes the arrows and avoid allocation issues compared to .hide() them - appDisplay._nextPageArrow.scale_x = 0; - appDisplay._prevPageArrow.scale_x = 0; + _applyOverrides() { + // Common/appDisplay + // this._overrides.addOverride('BaseAppViewCommon', AppDisplay.BaseAppView.prototype, BaseAppViewCommon); + // instead of overriding inaccessible BaseAppView class, we override its subclasses - AppDisplay and FolderView + this._overrides.addOverride('BaseAppViewCommonApp', AppDisplay.AppDisplay.prototype, BaseAppViewCommon); + this._overrides.addOverride('AppDisplay', AppDisplay.AppDisplay.prototype, AppDisplayCommon); + this._overrides.addOverride('AppViewItem', AppDisplay.AppViewItem.prototype, AppViewItemCommon); + this._overrides.addOverride('AppGridCommon', AppDisplay.AppGrid.prototype, AppGridCommon); + this._overrides.addOverride('AppIcon', AppDisplay.AppIcon.prototype, AppIcon); + if (opt.ORIENTATION) { + this._overrides.removeOverride('AppGridLayoutHorizontal'); + this._overrides.addOverride('AppGridLayoutVertical', _appDisplay._appGridLayout, BaseAppViewGridLayoutVertical); } else { - appDisplay._scrollView.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.NEVER); - if (this._appDisplayScrollConId) { - appDisplay._adjustment.disconnect(this._appDisplayScrollConId); - this._appDisplayScrollConId = 0; - } - - // restore original page indicators - const pageIndicators = appDisplay._pageIndicators; - pageIndicators.vertical = false; - appDisplay._box.vertical = true; - pageIndicators.x_expand = true; - pageIndicators.y_align = Clutter.ActorAlign.END; - pageIndicators.x_align = Clutter.ActorAlign.CENTER; - - // put back touch friendly navigation buttons - const scrollContainer = appDisplay._scrollView.get_parent(); - if (appDisplay._hintContainer && !appDisplay._hintContainer.get_parent()) { - scrollContainer.add_child(appDisplay._hintContainer); - // the hit container covers the entire app grid and added at the top of the stack blocks DND drops - // so it needs to be pushed below - scrollContainer.set_child_below_sibling(appDisplay._hintContainer, null); - } - - appDisplay._nextPageArrow.scale_x = 1; - appDisplay._prevPageArrow.scale_x = 1; - - appDisplay._nextPageIndicator.remove_style_class_name('nextPageIndicator'); - appDisplay._prevPageIndicator.remove_style_class_name('prevPageIndicator'); + this._overrides.removeOverride('AppGridLayoutVertical'); + this._overrides.addOverride('AppGridLayoutHorizontal', _appDisplay._appGridLayout, BaseAppViewGridLayoutHorizontal); } - // value for page indicator is calculated from scroll adjustment, horizontal needs to be replaced by vertical - appDisplay._adjustment = vertical - ? appDisplay._scrollView.get_vscroll_bar().adjustment - : appDisplay._scrollView.get_hscroll_bar().adjustment; - - // no need to connect already connected signal (wasn't removed the original one before) - if (!vertical) { - // reset used appDisplay properties - Main.overview._overview._controls._appDisplay.scale_y = 1; - Main.overview._overview._controls._appDisplay.scale_x = 1; - Main.overview._overview._controls._appDisplay.opacity = 255; - return; - } + // Custom folders + this._overrides.addOverride('BaseAppViewCommonFolder', AppDisplay.FolderView.prototype, BaseAppViewCommon); + this._overrides.addOverride('FolderView', AppDisplay.FolderView.prototype, FolderView); + this._overrides.addOverride('AppFolderDialog', AppDisplay.AppFolderDialog.prototype, AppFolderDialog); + this._overrides.addOverride('FolderIcon', AppDisplay.FolderIcon.prototype, FolderIcon); - // update appGrid dot pages indicators - this._appDisplayScrollConId = appDisplay._adjustment.connect('notify::value', adj => { - const value = adj.value / adj.page_size; - appDisplay._pageIndicators.setCurrentPosition(value); - }); + // Prevent changing grid page size when showing/hiding _pageIndicators + this._overrides.addOverride('PageIndicators', PageIndicators.PageIndicators.prototype, PageIndicatorsCommon); } - // Set App Grid columns, rows, icon size, incomplete pages - _updateAppDisplayProperties(reset = false) { - opt._appGridNeedsRedisplay = false; - // columns, rows, icon size - const appDisplay = Main.overview._overview._controls._appDisplay; - appDisplay.visible = true; + _updateAppDisplay(reset) { + const orientation = reset ? Clutter.Orientation.HORIZONTAL : opt.ORIENTATION; + BaseAppViewCommon._adaptForOrientation.bind(_appDisplay)(orientation); + + this._updateFavoritesConnection(reset); + + _appDisplay.visible = true; if (reset) { - appDisplay._grid.layoutManager.fixedIconSize = -1; - appDisplay._grid.layoutManager.allow_incomplete_pages = true; - appDisplay._grid._currentMode = -1; - appDisplay._grid.setGridModes(); - if (this._appGridLayoutSettings) { - this._appGridLayoutSettings.disconnect(this._appGridLayoutConId); + _appDisplay._grid.layoutManager.fixedIconSize = -1; + _appDisplay._grid.layoutManager.allow_incomplete_pages = true; + _appDisplay._grid._currentMode = -1; + _appDisplay._grid.setGridModes(); + _appDisplay._grid.set_style(''); + _appDisplay._prevPageArrow.set_scale(1, 1); + _appDisplay._nextPageArrow.set_scale(1, 1); + if (this._appGridLayoutConId) { + global.settings.disconnect(this._appGridLayoutConId); this._appGridLayoutConId = 0; - this._appGridLayoutSettings = null; } - appDisplay._redisplay(); - - appDisplay._grid.set_style(''); - this._updateAppGrid(reset); + this._repopulateAppDisplay(reset); } else { + _appDisplay._grid._currentMode = -1; // update grid on layout reset - if (!this._appGridLayoutSettings) { - this._appGridLayoutSettings = Me.getSettings('org.gnome.shell'); - this._appGridLayoutConId = this._appGridLayoutSettings.connect('changed::app-picker-layout', this._updateLayout); - } + if (!this._appGridLayoutConId) + this._appGridLayoutConId = global.settings.connect('changed::app-picker-layout', this._updateLayout.bind(this)); - appDisplay._grid.layoutManager.allow_incomplete_pages = opt.APP_GRID_ALLOW_INCOMPLETE_PAGES; - // appDisplay._grid.set_style(`column-spacing: ${opt.APP_GRID_SPACING}px; row-spacing: ${opt.APP_GRID_SPACING}px;`); - // APP_GRID_SPACING constant is used for grid dimensions calculation - // but sometimes the actual grid spacing properties affect/change the calculated size, therefore we set it lower to avoid this problem - // main app grid always use available space and the spacing is optimized for the grid dimensions - appDisplay._grid.set_style('column-spacing: 5px; row-spacing: 5px;'); - - // force redisplay - appDisplay._grid._currentMode = -1; - appDisplay._grid.setGridModes(); - appDisplay._grid.layoutManager.fixedIconSize = opt.APP_GRID_ICON_SIZE; // avoid resetting appDisplay before startup animation // x11 shell restart skips startup animation if (!Main.layoutManager._startingUp) { - this._updateAppGrid(); - } else if (Main.layoutManager._startingUp && (Meta.is_restart() || Me.Util.dashIsDashToDock())) { + this._repopulateAppDisplay(); + } else if (Main.layoutManager._startingUp && Meta.is_restart()) { _timeouts.three = GLib.idle_add(GLib.PRIORITY_LOW, () => { - this._updateAppGrid(); + this._repopulateAppDisplay(); _timeouts.three = 0; return GLib.SOURCE_REMOVE; }); @@ -320,14 +209,14 @@ export const AppDisplayModule = class { } } - _updateDND(reset) { + _updateFavoritesConnection(reset) { if (!reset) { if (!this._appSystemStateConId && opt.APP_GRID_INCLUDE_DASH >= 3) { this._appSystemStateConId = Shell.AppSystem.get_default().connect( 'app-state-changed', () => { this._updateFolderIcons = true; - Main.overview._overview.controls._appDisplay._redisplay(); + _appDisplay._redisplay(); } ); } @@ -343,115 +232,62 @@ export const AppDisplayModule = class { Main.layoutManager.overviewGroup.scale_x = 1; Main.layoutManager.overviewGroup.scale_y = 1; Main.layoutManager.overviewGroup.hide(); - Main.overview._overview._controls._appDisplay.translation_x = 0; - Main.overview._overview._controls._appDisplay.translation_y = 0; - Main.overview._overview._controls._appDisplay.visible = true; - Main.overview._overview._controls._appDisplay.opacity = 255; - } - - // update all invalid positions that may be result of grid/icon size change - _updateIconPositions() { - const appDisplay = Main.overview._overview._controls._appDisplay; - const layout = JSON.stringify(global.settings.get_value('app-picker-layout').recursiveUnpack()); - // if app grid layout is empty, sort source alphabetically to avoid misplacing - if (layout === JSON.stringify([]) && appDisplay._sortOrderedItemsAlphabetically) - appDisplay._sortOrderedItemsAlphabetically(); - const icons = [...appDisplay._orderedItems]; - for (let i = 0; i < icons.length; i++) - appDisplay._moveItem(icons[i], -1, -1); - } - - _removeIcons() { - const appDisplay = Main.overview._overview._controls._appDisplay; - const icons = [...appDisplay._orderedItems]; - for (let i = 0; i < icons.length; i++) { - const icon = icons[i]; - if (icon._dialog) - Main.layoutManager.overviewGroup.remove_child(icon._dialog); - appDisplay._removeItem(icon); - icon.destroy(); - } - appDisplay._folderIcons = []; - } - - _removeStatusMessage() { - if (Me._vShellStatusMessage) { - if (Me._vShellMessageTimeoutId) { - GLib.source_remove(Me._vShellMessageTimeoutId); - Me._vShellMessageTimeoutId = 0; - } - Me._vShellStatusMessage.destroy(); - Me._vShellStatusMessage = null; - } + _appDisplay.translation_x = 0; + _appDisplay.translation_y = 0; + _appDisplay.visible = true; + _appDisplay.opacity = 255; } _updateLayout(settings, key) { - const currentValue = JSON.stringify(settings.get_value(key).deep_unpack()); - const emptyValue = JSON.stringify([]); - const customLayout = currentValue !== emptyValue; - if (!customLayout) { - this._updateAppGrid(); + // Reset the app grid only if the user layout has been completely removed + if (!settings.get_value(key).deep_unpack().length) { + this._repopulateAppDisplay(); } } - _updateAppGrid(reset = false, callback) { - const appDisplay = Main.overview._overview._controls._appDisplay; - // reset the grid only if called directly without args or if all folders where removed by using reset button in Settings window - // otherwise this function is called every time a user moves icon to another position as a settings callback - - // force update icon size using adaptToSize(), the page size cannot be the same as the current one - appDisplay._grid.layoutManager._pageWidth += 1; - appDisplay._grid.layoutManager.adaptToSize(appDisplay._grid.layoutManager._pageWidth - 1, appDisplay._grid.layoutManager._pageHeight); - - // don't delay the first screen lock whe extensions are rebased - // removing icons takes time and with other + _repopulateAppDisplay(reset = false, callback) { + // Remove all icons so they can be re-created with the current configuration + // Updating appGrid content while rebasing extensions when session is locked makes no sense (relevant for GS version < 46) if (!Main.sessionMode.isLocked) - this._removeIcons(); + AppDisplayCommon.removeAllItems.bind(_appDisplay)(); - appDisplay._redisplay(); - - // don't realize appDisplay on disable, or at startup if disabled - // always realize appDisplay otherwise to avoid errors while opening folders (that I was unable to trace) - if (reset || (!opt.APP_GRID_PERFORMANCE && callback)) { - this._removeStatusMessage(); - if (callback) - callback(); + // appDisplay disabled + if (reset) { + _appDisplay._redisplay(); return; } - // workaround - silently realize appDisplay - // appDisplay and its content must be "visible" (opacity > 0) on the screen (within monitor geometry) - // to realize its objects - // this action takes some time and affects animations during the first use - // if we do it invisibly before user needs it, it can improve the user's experience + _appDisplay._readyToRedisplay = true; + _appDisplay._redisplay(); - this._exposeAppGrid(); + // Setting OffscreenRedirect should improve performance when opacity transitions are used + _appDisplay.offscreen_redirect = Clutter.OffscreenRedirect.ALWAYS; - // let the main loop process our changes before continuing - _timeouts.one = GLib.idle_add(GLib.PRIORITY_LOW, () => { - this._updateIconPositions(); - if (appDisplay._sortOrderedItemsAlphabetically) { - appDisplay._sortOrderedItemsAlphabetically(); - appDisplay._grid.layoutManager._pageWidth += 1; - appDisplay._grid.layoutManager.adaptToSize(appDisplay._grid.layoutManager._pageWidth - 1, appDisplay._grid.layoutManager._pageHeight); - appDisplay._setLinearPositions(appDisplay._orderedItems); - } + if (opt.APP_GRID_PERFORMANCE) + this._realizeAppDisplay(callback); + else if (callback) + callback(); + } + + _realizeAppDisplay(callback) { + // Workaround - silently realize appDisplay + // The realization takes some time and affects animations during the first use + // If we do it invisibly before the user needs the app grid, it can improve the user's experience + _appDisplay.opacity = 1; - appDisplay._redisplay(); - // realize also all app folders (by opening them) so the first popup is as smooth as the second one - // let the main loop process our changes before continuing - _timeouts.two = GLib.idle_add(GLib.PRIORITY_LOW, () => { - this._restoreAppGrid(); - Me._resetInProgress = false; - this._removeStatusMessage(); + this._exposeAppGrid(); + _appDisplay._redisplay(); + this._exposeAppFolders(); - if (callback) - callback(); + // Let the main loop process our changes before we continue + _timeouts.updateAppGrid = GLib.idle_add(GLib.PRIORITY_LOW, () => { + this._restoreAppGrid(); + Me._resetInProgress = false; - _timeouts.two = 0; - return GLib.SOURCE_REMOVE; - }); - _timeouts.one = 0; + if (callback) + callback(); + + _timeouts.updateAppGrid = 0; return GLib.SOURCE_REMOVE; }); } @@ -466,97 +302,42 @@ export const AppDisplayModule = class { // if overview is hidden, show it overviewGroup.visible = true; } - - const appDisplay = Main.overview._overview._controls._appDisplay; - appDisplay.opacity = 1; - - // find usable value, sometimes it's one, sometime the other... - let [x, y] = appDisplay.get_position(); - let { x1, y1 } = appDisplay.allocation; - x = x === Infinity ? 0 : x; - y = y === Infinity ? 0 : y; - x1 = x1 === Infinity ? 0 : x1; - y1 = y1 === Infinity ? 0 : y1; - appDisplay.translation_x = -(x ? x : x1); - appDisplay.translation_y = -(y ? y : y1); - this._exposeAppFolders(); - } - - _exposeAppFolders() { - const appDisplay = Main.overview._overview._controls._appDisplay; - appDisplay._folderIcons.forEach(d => { - d._ensureFolderDialog(); - d._dialog._updateFolderSize(); - d._dialog.scale_y = 0.0001; - d._dialog.show(); - }); } _restoreAppGrid() { - const appDisplay = Main.overview._overview._controls._appDisplay; - appDisplay.translation_x = 0; - appDisplay.translation_y = 0; - // appDisplay.opacity = 0; - this._hideAppFolders(); + if (opt.APP_GRID_PERFORMANCE) + this._hideAppFolders(); const overviewGroup = Main.layoutManager.overviewGroup; if (!Main.overview._shown) overviewGroup.hide(); overviewGroup.scale_y = 1; overviewGroup.opacity = 255; + _appDisplay.opacity = 0; + _appDisplay.visible = false; + } - this._removeStatusMessage(); + _exposeAppFolders() { + _appDisplay._folderIcons.forEach(d => { + d._ensureFolderDialog(); + d._dialog.scale_y = 0.0001; + d._dialog.show(); + d._dialog._updateFolderSize(); + }); } _hideAppFolders() { - const appDisplay = Main.overview._overview._controls._appDisplay; - appDisplay._folderIcons.forEach(d => { + _appDisplay._folderIcons.forEach(d => { if (d._dialog) { - d._dialog._updateFolderSize(); d._dialog.hide(); d._dialog.scale_y = 1; } }); } - - _getWindowApp(metaWin) { - const tracker = Shell.WindowTracker.get_default(); - return tracker.get_window_app(metaWin); - } - - _getAppLastUsedWindow(app) { - let recentWin; - global.display.get_tab_list(Meta.TabList.NORMAL_ALL, null).forEach(metaWin => { - const winApp = this._getWindowApp(metaWin); - if (!recentWin && winApp === app) - recentWin = metaWin; - }); - return recentWin; - } - - _getAppRecentWorkspace(app) { - const recentWin = this._getAppLastUsedWindow(app); - if (recentWin) - return recentWin.get_workspace(); - - return null; - } -}; - -const AppDisplayVertical = { - // correction of the appGrid size when page indicators were moved from the bottom to the right - adaptToSize(width, height) { - const [, indicatorWidth] = this._pageIndicators.get_preferred_width(-1); - width -= indicatorWidth; - - this._grid.findBestModeForSize(width, height); - - const adaptToSize = AppDisplay.BaseAppView.prototype.adaptToSize.bind(this); - adaptToSize(width, height); - }, }; function _getViewFromIcon(icon) { + icon = icon._sourceItem ? icon._sourceItem : icon; for (let parent = icon.get_parent(); parent; parent = parent.get_parent()) { if (parent instanceof AppDisplay.AppDisplay || parent instanceof AppDisplay.FolderView) { return parent; @@ -570,6 +351,17 @@ const AppDisplayCommon = { // disable creation of default folders if user deleted them }, + removeAllItems() { + this._orderedItems.slice().forEach(item => { + if (item._dialog) + Main.layoutManager.overviewGroup.remove_child(item._dialog); + + this._removeItem(item); + item.destroy(); + }); + this._folderIcons = []; + }, + // apps load adapted for custom sorting and including dash items _loadApps() { let appIcons = []; @@ -665,13 +457,24 @@ const AppDisplayCommon = { return appIcons; }, - // support active preview icons _onDragBegin(overview, source) { - if (source._sourceItem) + // let sourceId; + // support active preview icons + if (source._sourceItem) { + // sourceId = source._sourceFolder._id; source = source._sourceItem; + } /* else { + sourceId = source.id; + }*/ + // Prevent switching page when an item on another page is selected + // by removing the focus from all icons + // This is an upstream bug + // this.selectApp(sourceId); + this.grab_key_focus(); this._dragMonitor = { dragMotion: this._onDragMotion.bind(this), + dragDrop: this._onDragDrop.bind(this), }; DND.addDragMonitor(this._dragMonitor); @@ -717,11 +520,12 @@ const AppDisplayCommon = { return false; if (source._sourceItem) source = source._sourceItem; - if (!this._acceptDropCommon(source)) return false; - let view = /* AppDisplay.*/_getViewFromIcon(source); + this._savePages(); + + const view = /* AppDisplay.*/_getViewFromIcon(source); if (view instanceof AppDisplay.FolderView) view.removeApp(source.app); @@ -730,77 +534,180 @@ const AppDisplayCommon = { if (opt.APP_GRID_EXCLUDE_FAVORITES && this._appFavorites.isFavorite(source.id)) this._appFavorites.removeFavorite(source.id); - return true; }, + + _savePages() { + // Skip saving pages when search app grid mode is active + // and the grid is showing search results + if (Main.overview._overview.controls._origAppGridContent) + return; + + const pages = []; + + for (let i = 0; i < this._grid.nPages; i++) { + const pageItems = + this._grid.getItemsAtPage(i).filter(c => c.visible); + const pageData = {}; + + pageItems.forEach((item, index) => { + pageData[item.id] = { + position: GLib.Variant.new_int32(index), + }; + }); + pages.push(pageData); + } + + this._pageManager.pages = pages; + }, }; -const BaseAppViewVertical = { +const BaseAppViewCommon = { after__init() { - this._grid.layoutManager._orientation = Clutter.Orientation.VERTICAL; - this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); - this._orientation = Clutter.Orientation.VERTICAL; - this._swipeTracker.orientation = Clutter.Orientation.VERTICAL; + // Only folders can run this init + this._isFolder = true; + + this._adaptForOrientation(opt.ORIENTATION, true); + + // Because the original class prototype is not exported, we need to inject every instance + const overrides = new Me.Util.Overrides(); + if (opt.ORIENTATION) { + overrides.addOverride('FolderGridLayoutVertical', this._appGridLayout, BaseAppViewGridLayoutVertical); + this._pageIndicators.set_style('margin-right: 12px;'); + } else { + overrides.addOverride('FolderGridLayoutHorizontal', this._appGridLayout, BaseAppViewGridLayoutHorizontal); + this._pageIndicators.set_style('margin-bottom: 12px;'); + } + }, + + _adaptForOrientation(orientation, folder) { + const vertical = !!orientation; + + this._grid.layoutManager.fixedIconSize = folder ? opt.APP_GRID_FOLDER_ICON_SIZE : opt.APP_GRID_ICON_SIZE; + this._grid.layoutManager._orientation = orientation; + this._orientation = orientation; + this._swipeTracker.orientation = orientation; this._swipeTracker._reset(); - this._pageIndicators.vertical = true; - this._box.vertical = false; - this._pageIndicators.x_expand = false; - this._pageIndicators.y_align = Clutter.ActorAlign.CENTER; - this._pageIndicators.x_align = Clutter.ActorAlign.START; - this._pageIndicators.set_style('margin-right: 10px;'); - // moving these bars needs more patching of the this's code - // for now we just change bars style to be more like vertically oriented arrows indicating direction to prev/next page - this._nextPageIndicator.add_style_class_name('nextPageIndicator'); - this._prevPageIndicator.add_style_class_name('prevPageIndicator'); - - // setting their x_scale to 0 removes the arrows and avoid allocation issues compared to .hide() them - this._nextPageArrow.scale_x = 0; - this._prevPageArrow.scale_x = 0; - - this._adjustment = this._scrollView.get_vscroll_bar().adjustment; - - this._adjustment.connect('notify::value', adj => { - const value = adj.value / adj.page_size; - this._pageIndicators.setCurrentPosition(value); - }); + + this._adjustment = vertical + ? this._scrollView.get_vscroll_bar().adjustment + : this._scrollView.get_hscroll_bar().adjustment; + + this._prevPageArrow.pivot_point = new Graphene.Point({ x: 0.5, y: 0.5 }); + this._prevPageArrow.rotation_angle_z = vertical ? 90 : 0; + + this._nextPageArrow.pivot_point = new Graphene.Point({ x: 0.5, y: 0.5 }); + this._nextPageArrow.rotation_angle_z = vertical ? 90 : 0; + + const pageIndicators = this._pageIndicators; + pageIndicators.vertical = vertical; + this._box.vertical = !vertical; + pageIndicators.x_expand = !vertical; + pageIndicators.y_align = vertical ? Clutter.ActorAlign.CENTER : Clutter.ActorAlign.START; + pageIndicators.x_align = vertical ? Clutter.ActorAlign.START : Clutter.ActorAlign.CENTER; + + this._grid.layoutManager.allow_incomplete_pages = folder ? false : opt.APP_GRID_ALLOW_INCOMPLETE_PAGES; + const spacing = folder ? opt.APP_GRID_FOLDER_SPACING : opt.APP_GRID_SPACING; + this._grid.set_style(`column-spacing: ${spacing}px; row-spacing: ${spacing}px;`); + + if (vertical) { + this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); + if (!this._scrollConId) { + this._scrollConId = this._adjustment.connect('notify::value', adj => { + const value = adj.value / adj.page_size; + this._pageIndicators.setCurrentPosition(value); + }); + } + pageIndicators.remove_style_class_name('page-indicators-horizontal'); + pageIndicators.add_style_class_name('page-indicators-vertical'); + this._prevPageIndicator.add_style_class_name('prev-page-indicator'); + this._nextPageIndicator.add_style_class_name('next-page-indicator'); + this._nextPageArrow.translationY = 0; + this._prevPageArrow.translationY = 0; + this._nextPageIndicator.translationX = 0; + this._prevPageIndicator.translationX = 0; + } else { + this._scrollView.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.NEVER); + if (this._scrollConId) { + this._adjustment.disconnect(this._scrollConId); + this._scrollConId = 0; + } + pageIndicators.remove_style_class_name('page-indicators-vertical'); + pageIndicators.add_style_class_name('page-indicators-horizontal'); + this._prevPageIndicator.remove_style_class_name('prev-page-indicator'); + this._nextPageIndicator.remove_style_class_name('next-page-indicator'); + this._nextPageArrow.translationX = 0; + this._prevPageArrow.translationX = 0; + this._nextPageIndicator.translationY = 0; + this._prevPageIndicator.translationY = 0; + } + + const scale = opt.APP_GRID_SHOW_PAGE_ARROWS ? 1 : 0; + this._prevPageArrow.set_scale(scale, scale); + this._nextPageArrow.set_scale(scale, scale); }, -}; -const BaseAppViewCommon = { - _sortOrderedItemsAlphabetically(icons = null) { - if (!icons) - icons = this._orderedItems; - icons.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())); + _sortItemsByName(items) { + items.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())); }, - _setLinearPositions(icons) { + _updateItemPositions(icons, allowIncompletePages = false) { + // Avoid recursion when relocating icons + this._grid.layoutManager._skipRelocateSurplusItems = true; + const { itemsPerPage } = this._grid; - icons.forEach((icon, i) => { - const page = Math.floor(i / itemsPerPage); - const position = i % itemsPerPage; - try { + + icons.slice().forEach((icon, index) => { + const [currentPage, currentPosition] = this._grid.layoutManager.getItemPosition(icon); + + let page, position; + if (allowIncompletePages) { + [page, position] = this._getItemPosition(icon); + } else { + page = Math.floor(index / itemsPerPage); + position = index % itemsPerPage; + } + + if (currentPage !== page || currentPosition !== position) { this._moveItem(icon, page, position); - } catch (e) { - console.warn(`Warning:${e}`); } }); + + this._grid.layoutManager._skipRelocateSurplusItems = false; + // Disable animating the icons to their new positions + // since it can cause glitches when the app grid search mode is active + // and many icons are repositioning at once + this._grid.layoutManager._shouldEaseItems = false; }, - // adds sorting options and option to add favorites and running apps + // Adds sorting options _redisplay() { - if (this._folderIcons) { - this._folderIcons.forEach(icon => { - icon.view._redisplay(); - }); - } - let oldApps = this._orderedItems.slice(); - let oldAppIds = oldApps.map(icon => icon.id); + // different options for main app grid and app folders + const thisIsFolder = this instanceof AppDisplay.FolderView; + const thisIsAppDisplay = !thisIsFolder; - let newApps = this._loadApps().sort(this._compareItems.bind(this)); - let newAppIds = newApps.map(icon => icon.id); + // When an app was dragged from a folder and dropped to the main grid + // folders (if exist) need to be redisplayed even if we temporary block it for the appDisplay + this._folderIcons?.forEach(icon => { + icon.view._redisplay(); + }); - let addedApps = newApps.filter(icon => !oldAppIds.includes(icon.id)); - let removedApps = oldApps.filter(icon => !newAppIds.includes(icon.id)); + // Avoid unwanted updates + if (thisIsAppDisplay && !this._readyToRedisplay) + return; + + const oldApps = this._orderedItems.slice(); + const oldAppIds = oldApps.map(icon => icon.id); + + const newApps = this._loadApps(); + const newAppIds = newApps.map(icon => icon.id); + + const addedApps = newApps.filter(icon => !oldAppIds.includes(icon.id)); + const removedApps = oldApps.filter(icon => !newAppIds.includes(icon.id)); + + // Don't update folder without dialog if its content didn't change + if (!addedApps.length && !removedApps.length && thisIsFolder && !this.get_parent()) + return; // Remove old app icons removedApps.forEach(icon => { @@ -808,37 +715,26 @@ const BaseAppViewCommon = { icon.destroy(); }); - // Add new app icons, or move existing ones - newApps.forEach(icon => { - const [page, position] = this._getItemPosition(icon); - if (addedApps.includes(icon)) { - this._addItem(icon, page, position); - } else if (page !== -1 && position !== -1) { - this._moveItem(icon, page, position); - } else { - // App is part of a folder - } - }); + // For the main app grid only + let allowIncompletePages = thisIsAppDisplay && opt.APP_GRID_ALLOW_INCOMPLETE_PAGES; - // different options for root app grid and app folders - const thisIsFolder = this instanceof AppDisplay.FolderView; - const thisIsAppDisplay = !thisIsFolder; - if ((opt.APP_GRID_ORDER && thisIsAppDisplay) || - (opt.APP_FOLDER_ORDER && thisIsFolder)) { - // const { itemsPerPage } = this._grid; - let appIcons = this._orderedItems; - // sort all alphabetically - this._sortOrderedItemsAlphabetically(appIcons); - // appIcons.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())); - // then sort used apps by usage + const customOrder = !((opt.APP_GRID_ORDER && thisIsAppDisplay) || (opt.APP_FOLDER_ORDER && thisIsFolder)); + if (!customOrder) { + allowIncompletePages = false; + + // Sort by name + this._sortItemsByName(newApps); + + // Sort by usage if ((opt.APP_GRID_USAGE && thisIsAppDisplay) || - (opt.APP_FOLDER_USAGE && thisIsFolder)) - appIcons.sort((a, b) => Shell.AppUsage.get_default().compare(a.app.id, b.app.id)); + (opt.APP_FOLDER_USAGE && thisIsFolder)) { + newApps.sort((a, b) => Shell.AppUsage.get_default().compare(a.app?.id, b.app?.id)); + } - // sort favorites first - if (opt.APP_GRID_DASH_FIRST) { + // Sort favorites first + if (!opt.APP_GRID_EXCLUDE_FAVORITES && opt.APP_GRID_DASH_FIRST) { const fav = Object.keys(this._appFavorites._favorites); - appIcons.sort((a, b) => { + newApps.sort((a, b) => { let aFav = fav.indexOf(a.id); if (aFav < 0) aFav = 999; @@ -849,25 +745,47 @@ const BaseAppViewCommon = { }); } - // sort running first - if (opt.APP_GRID_DASH_FIRST && thisIsAppDisplay) - appIcons.sort((a, b) => a.app.get_state() !== Shell.AppState.RUNNING && b.app.get_state() === Shell.AppState.RUNNING); + // Sort running first + if (!opt.APP_GRID_EXCLUDE_RUNNING && opt.APP_GRID_DASH_FIRST) { + newApps.sort((a, b) => a.app?.get_state() !== Shell.AppState.RUNNING && b.app?.get_state() === Shell.AppState.RUNNING); + } + + // Sort folders first + if (thisIsAppDisplay && opt.APP_GRID_FOLDERS_FIRST) + newApps.sort((a, b) => b._folder && !a._folder); + + // Sort folders last + else if (thisIsAppDisplay && opt.APP_GRID_FOLDERS_LAST) + newApps.sort((a, b) => a._folder && !b._folder); + } else { + // Sort items according to the custom order stored in pageManager + newApps.sort(this._compareItems.bind(this)); + } + + // Add new app icons to the grid + newApps.forEach(icon => { + const [page, position] = this._grid.getItemPosition(icon); + if (page === -1 && position === -1) + this._addItem(icon, -1, -1); + }); + // When a placeholder icon was added to the custom sorted grid during DND from a folder + // update its initial position on the page + if (customOrder) + newApps.sort(this._compareItems.bind(this)); - if (opt.APP_GRID_FOLDERS_FIRST) - appIcons.sort((a, b) => b._folder && !a._folder); - else if (opt.APP_GRID_FOLDERS_LAST) - appIcons.sort((a, b) => a._folder && !b._folder); + this._orderedItems = newApps; - this._setLinearPositions(appIcons); + // Update icon positions if needed + this._updateItemPositions(this._orderedItems, allowIncompletePages); - this._orderedItems = appIcons; + // Relocate items with invalid positions + if (thisIsAppDisplay) { + const nPages = this._grid.layoutManager.nPages; + for (let pageIndex = 0; pageIndex < nPages; pageIndex++) + this._grid.layoutManager._relocateSurplusItems(pageIndex); } this.emit('view-loaded'); - if (!opt.APP_GRID_ALLOW_INCOMPLETE_PAGES) { - for (let i = 0; i < this._grid.nPages; i++) - this._grid.layoutManager._fillItemVacancies(i); - } }, _canAccept(source) { @@ -878,16 +796,13 @@ const BaseAppViewCommon = { _acceptDropCommon(source) { const dropTarget = this._dropTarget; delete this._dropTarget; - if (!this._canAccept(source)) return false; if (dropTarget === this._prevPageIndicator || dropTarget === this._nextPageIndicator) { let increment; - increment = dropTarget === this._prevPageIndicator ? -1 : 1; - const { currentPage, nPages } = this._grid; const page = Math.min(currentPage + increment, nPages); const position = page < nPages ? -1 : 0; @@ -897,7 +812,6 @@ const BaseAppViewCommon = { } else if (this._delayedMoveData) { // Dropped before the icon was moved const { page, position } = this._delayedMoveData; - try { this._moveItem(source, page, position); } catch (e) { @@ -939,14 +853,17 @@ const BaseAppViewCommon = { const thisIsFolder = this instanceof AppDisplay.FolderView; const thisIsAppDisplay = !thisIsFolder; - if ((!opt.APP_GRID_ORDER && thisIsAppDisplay) || (!opt.APP_FOLDER_ORDER && thisIsFolder)) + + // Prevent reorganizing the main app grid icons when an app folder is open and when sorting is not custom + // For some reason in V-Shell the drag motion events propagate from folder to main grid, which is not a problem in default code - so test the open dialog + if (!this._currentDialog && (!opt.APP_GRID_ORDER && thisIsAppDisplay) || (!opt.APP_FOLDER_ORDER && thisIsFolder)) this._maybeMoveItem(dragEvent); return DND.DragMotionResult.CONTINUE; }, }; -const BaseAppViewGridLayout = { +const BaseAppViewGridLayoutHorizontal = { _getIndicatorsWidth(box) { const [width, height] = box.get_size(); const arrows = [ @@ -954,26 +871,221 @@ const BaseAppViewGridLayout = { this._previousPageArrow, ]; - const minArrowsWidth = arrows.reduce( + let minArrowsWidth; + + minArrowsWidth = arrows.reduce( (previousWidth, accessory) => { const [min] = accessory.get_preferred_width(height); return Math.max(previousWidth, min); }, 0); - const idealIndicatorWidth = (width * 0.1/* PAGE_PREVIEW_RATIO*/) / 2; + minArrowsWidth = opt.APP_GRID_SHOW_PAGE_ARROWS ? minArrowsWidth : 0; - return Math.max(idealIndicatorWidth, minArrowsWidth); + const indicatorWidth = !this._grid._isFolder + ? minArrowsWidth + ((width - minArrowsWidth) * (1 - opt.APP_GRID_PAGE_WIDTH_SCALE)) / 2 + : minArrowsWidth + 6; + + return Math.round(indicatorWidth); + }, + + vfunc_allocate(container, box) { + const ltr = container.get_text_direction() !== Clutter.TextDirection.RTL; + const indicatorsWidth = this._getIndicatorsWidth(box); + + const pageIndicatorsHeight = 20; // _appDisplay._pageIndicators.height is unstable, 20 is determined by the style + const availHeight = box.get_height() - pageIndicatorsHeight; + const vPadding = Math.round((availHeight - availHeight * opt.APP_GRID_PAGE_HEIGHT_SCALE) / 2); + this._grid.indicatorsPadding = new Clutter.Margin({ + left: indicatorsWidth, + right: indicatorsWidth, + top: vPadding + pageIndicatorsHeight, + bottom: vPadding, + }); + + this._scrollView.allocate(box); + + const leftBox = box.copy(); + leftBox.x2 = leftBox.x1 + indicatorsWidth; + + const rightBox = box.copy(); + rightBox.x1 = rightBox.x2 - indicatorsWidth; + + this._previousPageIndicator.allocate(ltr ? leftBox : rightBox); + this._previousPageArrow.allocate_align_fill(ltr ? leftBox : rightBox, + 0.5, 0.5, false, false); + this._nextPageIndicator.allocate(ltr ? rightBox : leftBox); + this._nextPageArrow.allocate_align_fill(ltr ? rightBox : leftBox, + 0.5, 0.5, false, false); + + this._pageWidth = box.get_width(); + + // Center page arrow buttons + this._previousPageArrow.translationY = pageIndicatorsHeight / 2; + this._nextPageArrow.translationY = pageIndicatorsHeight / 2; + // Reset page indicators vertical position + this._nextPageIndicator.translationY = 0; + this._previousPageIndicator.translationY = 0; + }, +}; + +const BaseAppViewGridLayoutVertical = { + _getIndicatorsHeight(box) { + const [width, height] = box.get_size(); + const arrows = [ + this._nextPageArrow, + this._previousPageArrow, + ]; + + let minArrowsHeight; + + minArrowsHeight = arrows.reduce( + (previousHeight, accessory) => { + const [min] = accessory.get_preferred_height(width); + return Math.max(previousHeight, min); + }, 0); + + minArrowsHeight = opt.APP_GRID_SHOW_PAGE_ARROWS ? minArrowsHeight : 0; + + const indicatorHeight = !this._grid._isFolder + ? minArrowsHeight + ((height - minArrowsHeight) * (1 - opt.APP_GRID_PAGE_HEIGHT_SCALE)) / 2 + : minArrowsHeight + 6; + + return Math.round(indicatorHeight); + }, + + _syncPageIndicators() { + if (!this._container) + return; + + const { value } = this._pageIndicatorsAdjustment; + + const { top, bottom } = this._grid.indicatorsPadding; + const topIndicatorOffset = -top * (1 - value); + const bottomIndicatorOffset = bottom * (1 - value); + + this._previousPageIndicator.translationY = + topIndicatorOffset; + this._nextPageIndicator.translationY = + bottomIndicatorOffset; + + const leftArrowOffset = -top * value; + const rightArrowOffset = bottom * value; + + this._previousPageArrow.translationY = + leftArrowOffset; + this._nextPageArrow.translationY = + rightArrowOffset; + + // Page icons + this._translatePreviousPageIcons(value); + this._translateNextPageIcons(value); + + if (this._grid.nPages > 0) { + this._grid.getItemsAtPage(this._currentPage).forEach(icon => { + icon.translationY = 0; + }); + } + }, + + _translatePreviousPageIcons(value) { + if (this._currentPage === 0) + return; + + const pageHeight = this._grid.layoutManager._pageHeight; + const previousPage = this._currentPage - 1; + const icons = this._grid.getItemsAtPage(previousPage).filter(i => i.visible); + if (icons.length === 0) + return; + + const { top } = this._grid.indicatorsPadding; + const { rowSpacing } = this._grid.layoutManager; + const endIcon = icons[icons.length - 1]; + let iconOffset; + + const currentPageOffset = pageHeight * this._currentPage; + iconOffset = currentPageOffset - endIcon.allocation.y1 - endIcon.width + top - rowSpacing; + + for (const icon of icons) + icon.translationY = iconOffset * value; + }, + + _translateNextPageIcons(value) { + if (this._currentPage >= this._grid.nPages - 1) + return; + + const nextPage = this._currentPage + 1; + const icons = this._grid.getItemsAtPage(nextPage).filter(i => i.visible); + if (icons.length === 0) + return; + + const { bottom } = this._grid.indicatorsPadding; + const { rowSpacing } = this._grid.layoutManager; + let iconOffset; + + const pageOffset = this._pageHeight * nextPage; + iconOffset = pageOffset - icons[0].allocation.y1 - bottom + rowSpacing; + + for (const icon of icons) + icon.translationY = iconOffset * value; + }, + + vfunc_allocate(container, box) { + const indicatorsHeight = this._getIndicatorsHeight(box); + + const pageIndicatorsWidth = 20; // _appDisplay._pageIndicators.width is not stable, 20 is determined by the style + const availWidth = box.get_width() - pageIndicatorsWidth; + const hPadding = Math.round((availWidth - availWidth * opt.APP_GRID_PAGE_WIDTH_SCALE) / 2); + + this._grid.indicatorsPadding = new Clutter.Margin({ + top: indicatorsHeight, + bottom: indicatorsHeight, + left: hPadding + pageIndicatorsWidth, + right: hPadding, + }); + + this._scrollView.allocate(box); + + const topBox = box.copy(); + topBox.y2 = topBox.y1 + indicatorsHeight; + + const bottomBox = box.copy(); + bottomBox.y1 = bottomBox.y2 - indicatorsHeight; + + this._previousPageIndicator.allocate(topBox); + this._previousPageArrow.allocate_align_fill(topBox, + 0.5, 0.5, false, false); + this._nextPageIndicator.allocate(bottomBox); + this._nextPageArrow.allocate_align_fill(bottomBox, + 0.5, 0.5, false, false); + + this._pageHeight = box.get_height(); + + // Center page arrow buttons + this._previousPageArrow.translationX = pageIndicatorsWidth / 2; + this._nextPageArrow.translationX = pageIndicatorsWidth / 2; + // Reset page indicators vertical position + this._nextPageIndicator.translationX = 0; + this._previousPageIndicator.translationX = 0; + }, +}; + +const AppGridCommon = { + _updatePadding() { + const { rowSpacing, columnSpacing } = this.layoutManager; + + const padding = this._indicatorsPadding.copy(); + + padding.left += rowSpacing; + padding.right += rowSpacing; + padding.top += columnSpacing; + padding.bottom += columnSpacing; + + this.layoutManager.pagePadding = padding; }, }; const FolderIcon = { after__init() { - /* // If folder preview icons are clickable, - // disable opening the folder with primary mouse button and enable the secondary one - const buttonMask = opt.APP_GRID_ACTIVE_PREVIEW - ? St.ButtonMask.TWO | St.ButtonMask.THREE - : St.ButtonMask.ONE | St.ButtonMask.TWO; - this.button_mask = buttonMask;*/ this.button_mask = St.ButtonMask.ONE | St.ButtonMask.TWO; if (shellVersion46) this.add_style_class_name('app-folder-46'); @@ -982,33 +1094,61 @@ const FolderIcon = { }, open() { - this._ensureFolderDialog(); - this._dialog._updateFolderSize(); - // always open folder with the first page - this.view._scrollView.get_vscroll_bar().adjustment.value = 0; - this._dialog.popup(); + // Prevent switching page when an item on another page is selected + GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + // Select folder icon to prevent switching page to the one with currently selected icon + this._parentView._selectAppInternal(this._id); + // Remove key focus from the selected icon to prevent switching page after dropping the removed folder icon on another page of the main grid + this._parentView.grab_key_focus(); + this._ensureFolderDialog(); + this._dialog.popup(); + }); }, -}; -const ActiveFolderIcon = { - handleDragOver() { - return DND.DragMotionResult.CONTINUE; + vfunc_clicked() { + this.open(); }, - acceptDrop() { - return false; + _canAccept(source) { + if (!(source instanceof AppDisplay.AppIcon)) + return false; + + const view = _getViewFromIcon(source); + if (!view /* || !(view instanceof AppDisplay.AppDisplay)*/) + return false; + + // Disable this test to allow the user to cancel the current DND by dropping the icon on its original source + /* if (this._folder.get_strv('apps').includes(source.id)) + return false;*/ + + return true; }, - _onDragEnd() { - this._dragging = false; - this.undoScaleAndFade(); - Main.overview.endItemDrag(this._sourceItem.icon); + acceptDrop(source) { + if (source._sourceItem) + source = source._sourceItem; + + const accepted = AppViewItemCommon.acceptDrop.bind(this)(source); + + if (!accepted) + return false; + + // If the icon is already in the folder (user dropped it back on the same folder), skip re-adding it + if (this._folder.get_strv('apps').includes(source.id)) + return true; + + this._onDragEnd(); + + this.view.addApp(source.app); + + return true; }, }; const FolderView = { _createGrid() { let grid = new FolderGrid(); + grid._view = this; return grid; }, @@ -1055,6 +1195,7 @@ const FolderView = { child.icon.set_style('margin: 0; padding: 0;'); child._dot.set_style('margin-bottom: 1px;'); child.icon.setIconSize(subSize); + child._canAccept = () => false; bin.child = child; @@ -1078,10 +1219,6 @@ const FolderView = { layout.attach(bin, rtl ? (i + 1) % gridSize : i % gridSize, Math.floor(i / gridSize), 1, 1); } - // if folder content changed, update folder size, but not if it's empty - /* if (this._dialog && this._dialog._designCapacity !== this._orderedItems.length && this._orderedItems.length) - this._dialog._updateFolderSize();*/ - return icon; }, @@ -1137,25 +1274,9 @@ const FolderView = { items.push(icon); }); - if (opt.APP_FOLDER_ORDER) - Main.overview._overview.controls._appDisplay._sortOrderedItemsAlphabetically(items); - - if (opt.APP_FOLDER_USAGE) - items.sort((a, b) => Shell.AppUsage.get_default().compare(a.app.id, b.app.id)); - - this._appIds = this._apps.map(app => app.get_id()); return items; }, - // 42 only - don't apply appGrid scale on folders - adaptToSize(width, height) { - if (!opt.ORIENTATION) { - const [, indicatorHeight] = this._pageIndicators.get_preferred_height(-1); - height -= indicatorHeight; - } - BaseAppViewCommon.adaptToSize.bind(this)(width, height, true); - }, - acceptDrop(source) { /* if (!BaseAppViewCommon.acceptDrop.bind(this)(source)) return false;*/ @@ -1174,31 +1295,46 @@ const FolderView = { }, }; -const FolderGrid = GObject.registerClass( -class FolderGrid extends AppDisplay.AppGrid { +const FolderGrid = GObject.registerClass({ + // Registered name should be unique + GTypeName: `FolderGrid${Math.floor(Math.random() * 1000)}`, +}, class FolderGrid extends AppDisplay.AppGrid { _init() { super._init({ allow_incomplete_pages: false, - columns_per_page: opt.APP_GRID_FOLDER_COLUMNS ? opt.APP_GRID_FOLDER_COLUMNS : 20, - rows_per_page: opt.APP_GRID_FOLDER_ROWS ? opt.APP_GRID_FOLDER_ROWS : 20, + // For adaptive size (0), set the numbers high enough to fit all the icons + // to avoid splitting the icons to pages upon creating the grid + columns_per_page: 20, + rows_per_page: 20, page_halign: Clutter.ActorAlign.CENTER, page_valign: Clutter.ActorAlign.CENTER, }); - this.layout_manager._isFolder = true; - const spacing = opt.APP_GRID_SPACING; + this.layoutManager._isFolder = true; + this._isFolder = true; + const spacing = opt.APP_GRID_FOLDER_SPACING; this.set_style(`column-spacing: ${spacing}px; row-spacing: ${spacing}px;`); this.layoutManager.fixedIconSize = opt.APP_GRID_FOLDER_ICON_SIZE; this.setGridModes([ { - columns: opt.APP_GRID_FOLDER_COLUMNS ? opt.APP_GRID_FOLDER_COLUMNS : 3, - rows: opt.APP_GRID_FOLDER_ROWS ? opt.APP_GRID_FOLDER_ROWS : 3, + columns: 20, + rows: 20, }, ]); } - adaptToSize(width, height) { - this.layout_manager.adaptToSize(width, height); + _updatePadding() { + const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); + const padding = this._indicatorsPadding.copy(); + const pageIndicatorSize = opt.ORIENTATION + ? this._view._pageIndicators.get_preferred_width(1000)[1] / scaleFactor + : this._view._pageIndicators.get_preferred_height(1000)[1] / scaleFactor; + Math.round(Math.min(...this._view._pageIndicators.get_size()));// / scaleFactor);// ~28; + padding.left = opt.ORIENTATION ? pageIndicatorSize : 0; + padding.right = 0; + padding.top = opt.ORIENTATION ? 0 : pageIndicatorSize; + padding.bottom = 0; + this.layoutManager.pagePadding = padding; } }); @@ -1207,7 +1343,6 @@ const FOLDER_DIALOG_ANIMATION_TIME = 200; // AppDisplay.FOLDER_DIALOG_ANIMATION_ const AppFolderDialog = { // injection to _init() after__init() { - this._viewBox.add_style_class_name('app-folder-dialog-vshell'); // GS 46 changed the aligning to CENTER which restricts max folder dialog size this._viewBox.set({ x_align: Clutter.ActorAlign.FILL, @@ -1238,8 +1373,6 @@ const AppFolderDialog = { after__addFolderNameEntry() { // edit-folder-button class has been replaced with icon-button class which is not transparent in 46 this._editButton.add_style_class_name('edit-folder-button'); - if (shellVersion46) - this._editButton.add_style_class_name('edit-folder-button-46'); // Edit button this._removeButton = new St.Button({ @@ -1258,12 +1391,21 @@ const AppFolderDialog = { this._removeButton.connect('clicked', () => { if (Date.now() - this._removeButton._lastClick < Clutter.Settings.get_default().double_click_time) { + // Close dialog to avoid crashes + this._isOpen = false; this._grabHelper.ungrab({ actor: this }); - // without hiding the dialog, Shell crashes (at least on X11) + this.emit('open-state-changed', false); this.hide(); - this._view._deletingFolder = true; + this._popdownCallbacks.forEach(func => func()); + this._popdownCallbacks = []; + _appDisplay.ease({ + opacity: 255, + duration: FOLDER_DIALOG_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + }); - // Resetting all keys deletes the relocatable schema + // Reset all keys to delete the relocatable schema + this._view._deletingFolder = true; // Upstream property let keys = this._folder.settings_schema.list_keys(); for (const key of keys) this._folder.reset(key); @@ -1273,7 +1415,7 @@ const AppFolderDialog = { folders.splice(folders.indexOf(this._view._id), 1); // remove all abandoned folders (usually my own garbage and unwanted default folders...) - /* const appFolders = this._appDisplay._folderIcons.map(icon => icon._id); + /* const appFolders = _appDisplay._folderIcons.map(icon => icon._id); folders.forEach(folder => { if (!appFolders.includes(folder)) { folders.splice(folders.indexOf(folder._id), 1); @@ -1288,9 +1430,27 @@ const AppFolderDialog = { }); this._entryBox.add_child(this._removeButton); + this._entryBox.set_child_at_index(this._removeButton, 0); - // Adjust empty actor to center the title - this._entryBox.get_first_child().width = 82; + this._closeButton = new St.Button({ + style_class: 'icon-button edit-folder-button', + button_mask: St.ButtonMask.ONE, + toggle_mode: false, + reactive: true, + can_focus: true, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER, + child: new St.Icon({ + icon_name: 'window-close-symbolic', + icon_size: 16, + }), + }); + + this._closeButton.connect('clicked', () => { + this.popdown(); + }); + + this._entryBox.add_child(this._closeButton); }, popup() { @@ -1299,6 +1459,7 @@ const AppFolderDialog = { this._isOpen = this._grabHelper.grab({ actor: this, + focus: this._editButton, onUngrab: () => this.popdown(), }); @@ -1307,46 +1468,159 @@ const AppFolderDialog = { this.get_parent().set_child_above_sibling(this, null); + // _zoomAndFadeIn() is called from the dialog's allocate() this._needsZoomAndFade = true; - // the first folder dialog realization needs size correction - // so set the folder size, let it realize and then update the folder content - if (!this.realized) { - this._updateFolderSize(); - GLib.idle_add( - GLib.PRIORITY_DEFAULT, - () => { - this._updateFolderSize(); - } - ); - } - this.show(); + // force update folder size + this._folderAreaBox = null; + this._updateFolderSize(); + this.emit('open-state-changed', true); }, + _setupPopdownTimeout() { + if (this._popdownTimeoutId > 0) + return; + + // This timeout is handled in the original code and removed in _onDestroy() + // All dialogs are destroyed on extension disable() + this._popdownTimeoutId = + GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => { + this._popdownTimeoutId = 0; + // Following line fixes upstream bug + // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6164 + this._view._onDragEnd(); + this.popdown(); + return GLib.SOURCE_REMOVE; + }); + }, + + vfunc_allocate(box) { + this._updateFolderSize(); + + // super.allocate(box) + St.Bin.prototype.vfunc_allocate.bind(this)(box); + + // Override any attempt to resize the folder dialog, that happens when some child gets wild + // Re-allocate the child only if necessary, because it terminates grid animations + if (this._width && this._height && (this._width !== this.child.width || this._height !== this.child.height)) + this._allocateChild(); + + // We can only start zooming after receiving an allocation + if (this._needsZoomAndFade) + this._zoomAndFadeIn(); + }, + + _allocateChild() { + const childBox = new Clutter.ActorBox(); + childBox.set_size(this._width, this._height); + this.child.allocate(childBox); + }, + + // Note that the appDisplay may be off-screen so its coordinates may be shifted + // However, for _updateFolderSize() it doesn't matter + // and when _zoomAndFadeIn() is called, appDisplay is on the right place + _getFolderAreaBox() { + const appDisplay = this._source._parentView; + const folderAreaBox = appDisplay.get_allocation_box().copy(); + const searchEntryHeight = opt.SHOW_SEARCH_ENTRY ? Main.overview._overview.controls._searchEntryBin.height : 0; + folderAreaBox.y1 -= searchEntryHeight; + + // _zoomAndFadeIn() needs an absolute position within a multi-monitor workspace + const monitorGeometry = global.display.get_monitor_geometry(global.display.get_primary_monitor()); + folderAreaBox.x1 += monitorGeometry.x; + folderAreaBox.x2 += monitorGeometry.x; + folderAreaBox.y1 += monitorGeometry.y; + folderAreaBox.y2 += monitorGeometry.y; + + return folderAreaBox; + }, + _updateFolderSize() { const view = this._view; + const nItems = view._orderedItems.length; const [firstItem] = view._grid.layoutManager._container; if (!firstItem) return; - // adapt folder size according to the settings and number of icons - const appDisplay = this._source._parentView; - if (!appDisplay.width || appDisplay.allocation.x2 === Infinity || appDisplay.allocation.x2 === -Infinity) { - return; - } const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); - const itemPadding = 55; // default icon item padding on Fedora 44 - // const dialogMargin = 30; - const nItems = view._orderedItems.length; + const margin = 18; // see stylesheet .app-folder-dialog-container; + + const folderAreaBox = this._getFolderAreaBox(); + + const maxDialogWidth = folderAreaBox.get_width() / scaleFactor; + const maxDialogHeight = folderAreaBox.get_height() / scaleFactor; + + // We can't build folder if the available space is not available + if (!isFinite(maxDialogWidth) || !isFinite(maxDialogHeight) || !maxDialogWidth || !maxDialogHeight) + return; + + // We don't need to recalculate grid if nothing changed + if ( + this._folderAreaBox?.get_width() === folderAreaBox.get_width() && + this._folderAreaBox?.get_height() === folderAreaBox.get_height() && + nItems === this._nItems + ) + return; + + const layoutManager = view._grid.layoutManager; + const spacing = opt.APP_GRID_FOLDER_SPACING; + const padding = 40; + + const titleBoxHeight = + Math.round(this._entryBox.get_preferred_height(-1)[1] / scaleFactor); // ~75 + const minDialogWidth = Math.max(640, + Math.round(this._entryBox.get_preferred_width(-1)[1] / scaleFactor + 2 * margin)); + const navigationArrowsSize = // padding + one arrow width is sufficient for both arrows + Math.round(view._nextPageArrow.get_preferred_width(-1)[1] / scaleFactor); + const pageIndicatorSize = + Math.round(Math.min(...view._pageIndicators.get_size()) / scaleFactor);// ~28; + const horizontalNavigation = opt.ORIENTATION ? pageIndicatorSize : navigationArrowsSize; // either add padding or arrows + const verticalNavigation = opt.ORIENTATION ? navigationArrowsSize : pageIndicatorSize; + + // Horizontal size + const baseWidth = horizontalNavigation + 3 * padding + 2 * margin; + const maxGridPageWidth = maxDialogWidth - baseWidth; + // Vertical size + const baseHeight = titleBoxHeight + verticalNavigation + 2 * padding + 2 * margin; + const maxGridPageHeight = maxDialogHeight - baseHeight; + + // Will be updated to the actual value later + let itemPadding = 55; + const minItemSize = 48 + itemPadding; + let columns = opt.APP_GRID_FOLDER_COLUMNS; let rows = opt.APP_GRID_FOLDER_ROWS; - const fullAdaptiveGrid = !columns && !rows; - let spacing = opt.APP_GRID_SPACING; - const minItemSize = 48 + itemPadding; + const maxColumns = columns ? columns : 100; + const maxRows = rows ? rows : 100; + + // Find best icon size + let iconSize = opt.APP_GRID_FOLDER_ICON_SIZE < 0 ? opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT : opt.APP_GRID_FOLDER_ICON_SIZE; + if (opt.APP_GRID_FOLDER_ICON_SIZE === -1) { + let maxIconSize; + if (columns) { + const maxItemWidth = (maxGridPageWidth - (columns - 1) * opt.APP_GRID_FOLDER_SPACING) / columns; + maxIconSize = maxItemWidth - itemPadding; + } + if (rows) { + const maxItemHeight = (maxGridPageHeight - (rows - 1) * spacing) / rows; + maxIconSize = Math.min(maxItemHeight - itemPadding, maxIconSize); + } - if (fullAdaptiveGrid) { + if (maxIconSize) { + // We only need sizes from the default to the smallest + let iconSizes = Object.values(IconSize).sort((a, b) => b - a); + iconSizes = iconSizes.slice(iconSizes.indexOf(iconSize)); + for (const size of iconSizes) { + iconSize = size; + if (iconSize <= maxIconSize) + break; + } + } + } + + if ((!columns && !rows) || opt.APP_GRID_FOLDER_ICON_SIZE !== -1) { columns = Math.ceil(Math.sqrt(nItems)); rows = columns; if (columns * (columns - 1) >= nItems) { @@ -1355,94 +1629,98 @@ const AppFolderDialog = { rows = columns - 1; columns += 1; } - } else if (!columns && rows) { - columns = Math.ceil(nItems / rows); } else if (columns && !rows) { rows = Math.ceil(nItems / columns); + } else if (rows && !columns) { + columns = Math.ceil(nItems / rows); } - const iconSize = opt.APP_GRID_FOLDER_ICON_SIZE < 0 ? opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT : opt.APP_GRID_FOLDER_ICON_SIZE; - view._grid.layoutManager.fixedIconSize = iconSize; - view._grid.set_style(`column-spacing: ${opt.APP_GRID_SPACING}px; row-spacing: ${opt.APP_GRID_SPACING}px;`); - view._grid.layoutManager._pageWidth += 1; - view._grid.layoutManager.adaptToSize(view._grid.layoutManager._pageWidth - 1, view._grid.layoutManager._pageHeight); + columns = Math.clamp(columns, 1, maxColumns); + columns = Math.min(nItems, columns); + rows = Math.clamp(rows, 1, maxRows); - let itemSize = iconSize + 55; // icon padding - // first run sets the grid before we can read the real icon size + let itemSize = iconSize + itemPadding; + // First run sets the grid before we can read the real icon size // so we estimate the size from default properties // and correct it in the second run if (this.realized) { firstItem.icon.setIconSize(iconSize); - const [firstItemWidth] = firstItem.get_preferred_size(); + // Item height is inconsistent because it depends on its label height + const [, firstItemWidth] = firstItem.get_preferred_width(-1); const realSize = firstItemWidth / scaleFactor; - // if the preferred item size is smaller than icon plus some padding, ignore it - // (icons that are not yet realized are returning sizes like 45 or 53) - if (realSize > (iconSize + 24)) - itemSize = realSize; + itemSize = realSize; + itemPadding = realSize - iconSize; } - let width = columns * (itemSize + spacing) + /* padding for nav arrows*/64; - width = Math.round(width + (opt.ORIENTATION ? 100 : 160/* space for navigation arrows*/)); - let height = rows * (itemSize + spacing) + /* header*/75 + /* padding*/ 2 * 30 + /* padding + ?page indicator*/(!opt.ORIENTATION || !opt.APP_GRID_FOLDER_COLUMNS ? 100 : 70); + const gridWidth = columns * (itemSize + spacing); + let width = gridWidth + baseWidth; + const gridHeight = rows * (itemSize + spacing); + let height = gridHeight + baseHeight; - // allocation is more reliable than appDisplay width/height properties - const appDisplayWidth = appDisplay.allocation.x2 - appDisplay.allocation.x1; - const appDisplayHeight = appDisplay.allocation.y2 - appDisplay.allocation.y1 + (opt.SHOW_SEARCH_ENTRY ? Main.overview._overview.controls._searchEntryBin.height : 0); + // Folder must fit the appDisplay area plus searchEntryBin if visible + // reduce columns/rows if needed + while (height > maxDialogHeight && rows > 1) { + height -= itemSize + spacing; + rows -= 1; + } - // folder must fit the appDisplay area - // reduce columns/rows if needed and count with the scaled values - if (!opt.APP_GRID_FOLDER_ROWS) { - while ((height * scaleFactor) > appDisplayHeight) { - height -= itemSize + spacing; - rows -= 1; - } + while (width > maxDialogWidth && columns > 1) { + width -= itemSize + spacing; + columns -= 1; } - if (!opt.APP_GRID_FOLDER_COLUMNS) { - while ((width * scaleFactor) > appDisplayWidth) { - width -= itemSize + spacing; - columns -= 1; - } + // Try to compensate for the previous reduction if there is a space + while ((nItems > columns * rows) && ((width + (itemSize + spacing)) <= maxDialogWidth) && (columns < maxColumns)) { + width += itemSize + spacing; + columns += 1; } - // try to compensate for the previous reduction if there is a space - if (!opt.APP_GRID_FOLDER_COLUMNS) { - while ((nItems > columns * rows) && ((width * scaleFactor + itemSize + spacing) <= appDisplayWidth)) { - width += itemSize + spacing; - columns += 1; - } - // remove columns that cannot be displayed - if ((columns * minItemSize + (columns - 1) * spacing) > appDisplayWidth) - columns = Math.floor(appDisplayWidth / (minItemSize + spacing)); + + // remove columns that cannot be displayed + if (((columns * minItemSize + (columns - 1) * spacing)) > maxDialogWidth) + columns = Math.floor(maxDialogWidth / (minItemSize + spacing)); + + while ((nItems > columns * rows) && ((height + (itemSize + spacing)) <= maxDialogHeight) && (rows < maxRows)) { + height += itemSize + spacing; + rows += 1; } - if (!opt.APP_GRID_FOLDER_ROWS) { - while ((nItems > columns * rows) && ((height * scaleFactor + itemSize + spacing) <= appDisplayHeight)) { - height += itemSize + spacing; - rows += 1; - } - // remove rows that cannot be displayed - if ((rows * minItemSize + (rows - 1) * spacing) > appDisplayHeight) - rows = Math.floor(appDisplayWidth / (minItemSize + spacing)); + // remove rows that cannot be displayed + if ((((rows * minItemSize + (rows - 1) * spacing))) > maxDialogHeight) + rows = Math.floor(maxDialogWidth / (minItemSize + spacing)); + + // remove size for rows that are empty + const rowsNeeded = Math.ceil(nItems / columns); + if (rows > rowsNeeded) { + height -= (rows - rowsNeeded) * (itemSize + spacing); + rows -= rows - rowsNeeded; + } + + // Remove space reserved for page controls and indicator if not used + if (rows * columns >= nItems) { + width -= horizontalNavigation; + height -= verticalNavigation; } - width = Math.clamp(width, 640, appDisplayWidth); - height = Math.min(height, appDisplayHeight); + width = Math.clamp(width, minDialogWidth, maxDialogWidth); + height = Math.min(height, maxDialogHeight); - const layoutManager = view._grid.layoutManager; - layoutManager.rows_per_page = rows; layoutManager.columns_per_page = columns; + layoutManager.rows_per_page = rows; + + layoutManager.fixedIconSize = iconSize; + - // this line is required by GS 43 - // view._grid.setGridModes([{ columns, rows }]); + // Store data for further use + this._width = width * scaleFactor; + this._height = height * scaleFactor; + this._folderAreaBox = folderAreaBox; + this._nItems = nItems; - this.child.set_style(` - width: ${width}px; - height: ${height}px; - padding: 30px; - `); + // Set fixed dialog size to prevent size instability + this.child.set_size(this._width, this._height); + this._viewBox.set_style(`width: ${this._width - 2 * margin}px; height: ${this._height - 2 * margin}px;`); + this._viewBox.set_size(this._width - 2 * margin, this._height - 2 * margin); view._redisplay(); - // store original item count - this._designCapacity = nItems; }, _zoomAndFadeIn() { @@ -1460,27 +1738,43 @@ const AppFolderDialog = { const appDisplay = this._source._parentView; - const [appDisplayX, appDisplayY] = this._source._parentView.get_transformed_position(); - if (!opt.APP_GRID_FOLDER_CENTER) { - dialogTargetX = sourceCenterX - this.child.width / 2; - dialogTargetY = sourceCenterY - this.child.height / 2; + const folderAreaBox = this._getFolderAreaBox(); - // keep the dialog in appDisplay area if possible + let folderAreaX = folderAreaBox.x1; + let folderAreaY = folderAreaBox.y1; + const folderAreaWidth = folderAreaBox.get_width(); + const folderAreaHeight = folderAreaBox.get_height(); + const folder = this.child; + + if (opt.APP_GRID_FOLDER_CENTER) { + dialogTargetX = folderAreaX + folderAreaWidth / 2 - folder.width / 2; + dialogTargetY = folderAreaY + (folderAreaHeight / 2 - folder.height / 2) / 2; + } else { + const { pagePadding } = appDisplay._grid.layoutManager; + const hPadding = (pagePadding.left + pagePadding.right) / 2; + const vPadding = (pagePadding.top + pagePadding.bottom) / 2; + const minX = Math.min(folderAreaX + hPadding, folderAreaX + (folderAreaWidth - folder.width) / 2); + const maxX = Math.max(folderAreaX + folderAreaWidth - hPadding - folder.width, folderAreaX + folderAreaWidth / 2 - folder.width / 2); + const minY = Math.min(folderAreaY + vPadding, folderAreaY + (folderAreaHeight - folder.height) / 2); + const maxY = Math.max(folderAreaY + folderAreaHeight - vPadding - folder.height, folderAreaY + folderAreaHeight / 2 - folder.height / 2); + + dialogTargetX = sourceCenterX - folder.width / 2; + dialogTargetX = Math.clamp(dialogTargetX, minX, maxX); + dialogTargetY = sourceCenterY - folder.height / 2; + dialogTargetY = Math.clamp(dialogTargetY, minY, maxY); + + // keep the dialog in the appDisplay area dialogTargetX = Math.clamp( dialogTargetX, - appDisplayX, - appDisplayX + appDisplay.width - this.child.width + folderAreaX, + folderAreaX + folderAreaWidth - folder.width ); dialogTargetY = Math.clamp( dialogTargetY, - appDisplayY, - appDisplayY + appDisplay.height - this.child.height + folderAreaY, + folderAreaY + folderAreaHeight - folder.height ); - } else { - const searchEntryHeight = opt.SHOW_SEARCH_ENTRY ? Main.overview._overview.controls._searchEntryBin.height : 0; - dialogTargetX = appDisplayX + appDisplay.width / 2 - this.child.width / 2; - dialogTargetY = appDisplayY - searchEntryHeight + ((appDisplay.height + searchEntryHeight) / 2 - this.child.height / 2) / 2; } const dialogOffsetX = Math.round(dialogTargetX - dialogX); @@ -1556,7 +1850,7 @@ const AppFolderDialog = { scale_y: this._source.height / this.child.height, opacity: 0, duration: FOLDER_DIALOG_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, + mode: Clutter.AnimationMode.EASE_IN_QUAD, onComplete: () => { this.child.set({ translation_x: 0, @@ -1576,14 +1870,14 @@ const AppFolderDialog = { appDisplay.ease({ opacity: 255, duration: FOLDER_DIALOG_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, + mode: Clutter.AnimationMode.EASE_IN_QUAD, }); if (opt.SHOW_SEARCH_ENTRY) { Main.overview.searchEntry.ease({ opacity: 255, duration: FOLDER_DIALOG_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, + mode: Clutter.AnimationMode.EASE_IN_QUAD, }); } @@ -1591,17 +1885,31 @@ const AppFolderDialog = { }, _setLighterBackground(lighter) { + let opacity = 255; if (this._isOpen) - Main.overview._overview._controls._appDisplay.opacity = lighter ? 20 : 0; - /* const backgroundColor = lighter - ? this.DIALOG_SHADE_HIGHLIGHT - : this.DIALOG_SHADE_NORMAL; + opacity = lighter ? 20 : 0; - this.ease({ - backgroundColor, + _appDisplay.ease({ + opacity, duration: FOLDER_DIALOG_ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, - }); */ + }); + }, + + vfunc_key_press_event(event) { + if (global.focus_manager.navigate_from_event(event)) + return Clutter.EVENT_STOP; + return Clutter.EVENT_PROPAGATE; + }, + + _showFolderLabel() { + if (this._editButton.checked) + this._editButton.checked = false; + + this._maybeUpdateFolderName(); + this._switchActor(this._entry, this._folderNameLabel); + // This line has been added in 47 to fix focus after editing the folder name + this.navigate_focus(this, St.DirectionType.TAB_FORWARD, false); }, }; @@ -1612,15 +1920,21 @@ const AppIcon = { }, // avoid accepting by placeholder when dragging active preview - // and also by icon if alphabet or usage sorting are used + // and also by icon if usage sorting is used _canAccept(source) { if (source._sourceItem) source = source._sourceItem; - let view = /* AppDisplay.*/_getViewFromIcon(source); + // Folders in folder are not supported + if (!(_getViewFromIcon(this) instanceof AppDisplay.AppDisplay) || !this.opacity) + return false; + + const view = /* AppDisplay.*/_getViewFromIcon(source); return source !== this && (source instanceof this.constructor) && - (view instanceof AppDisplay.AppDisplay && + // Include drops from folders + // (view instanceof AppDisplay.AppDisplay && + (view && !opt.APP_GRID_USAGE); }, }; @@ -1683,12 +1997,18 @@ const AppViewItemCommon = { return false; // added - remove app from the source folder after dnd to other folder - if (source._sourceItem) { - const app = source._sourceItem.app; - source._sourceFolder.removeApp(app); - } + let view = /* AppDisplay.*/_getViewFromIcon(source); + if (view instanceof AppDisplay.FolderView) + view.removeApp(source.app); return true; }, }; + +const PageIndicatorsCommon = { + after_setNPages() { + this.visible = true; + this.opacity = this._nPages > 1 ? 255 : 0; + }, +}; diff --git a/extensions/46/vertical-workspaces/lib/dash.js b/extensions/46/vertical-workspaces/lib/dash.js index 719c3de..c7ebbff 100644 --- a/extensions/46/vertical-workspaces/lib/dash.js +++ b/extensions/46/vertical-workspaces/lib/dash.js @@ -64,6 +64,7 @@ export const DashModule = class { this.moduleEnabled = opt.get('dashModule'); const conflict = !!(Me.Util.getEnabledExtensions('dash-to-dock').length || + Me.Util.getEnabledExtensions('dash2dock').length || Me.Util.getEnabledExtensions('ubuntu-dock').length || Me.Util.getEnabledExtensions('dash-to-panel').length); @@ -139,6 +140,7 @@ export const DashModule = class { ? 'vertical-46' : 'vertical' ); + this._setOrientation(Clutter.Orientation.VERTICAL); } else { this._setOrientation(Clutter.Orientation.HORIZONTAL); @@ -212,6 +214,7 @@ export const DashModule = class { } _resetStyle(dash) { + dash.remove_style_class_name('dash-46'); dash.remove_style_class_name('vertical'); dash.remove_style_class_name('vertical-46'); dash.remove_style_class_name('vertical-gs3-left'); @@ -662,7 +665,14 @@ const DashCommon = { const [, , buttonWidth, buttonHeight] = firstButton.get_preferred_size(); let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let availWidth, availHeight, maxIconSize; + let maxIconSize = opt.MAX_ICON_SIZE; + if (!maxIconSize) { + maxIconSize = Me.Util.monitorHasLowResolution() + ? 48 + : 64; + } + + let availWidth, availHeight; if (dashHorizontal) { availWidth = maxContent.x2 - maxContent.x1; // Subtract icon padding and box spacing from the available width @@ -676,7 +686,7 @@ const DashCommon = { availHeight -= themeNode.get_vertical_padding(); availHeight -= buttonHeight - iconHeight; - maxIconSize = Math.min(availWidth / iconChildren.length, availHeight, opt.MAX_ICON_SIZE * scaleFactor); + maxIconSize = Math.min(availWidth / iconChildren.length, availHeight, maxIconSize * scaleFactor); } else { availWidth = this._maxWidth; availWidth -= this._background.get_theme_node().get_horizontal_padding(); @@ -688,7 +698,7 @@ const DashCommon = { (iconChildren.length - 1) * spacing + 2 * this._background.get_theme_node().get_vertical_padding(); - maxIconSize = Math.min(availWidth, availHeight / iconChildren.length, opt.MAX_ICON_SIZE * scaleFactor); + maxIconSize = Math.min(availWidth, availHeight / iconChildren.length, maxIconSize * scaleFactor); } let iconSizes = BaseIconSizes.map(s => s * scaleFactor); @@ -838,54 +848,17 @@ const DashCommon = { }, }; -const DashIconCommon = { +const AppIconCommon = { after__init() { - if (opt.DASH_ICON_SCROLL && !Me.Util.dashNotDefault()) { - this._scrollConId = this.connect('scroll-event', DashExtensions.onScrollEvent.bind(this)); - this._leaveConId = this.connect('leave-event', DashExtensions.onLeaveEvent.bind(this)); - } - if (this._updateRunningDotStyle) this._updateRunningDotStyle(); }, - /* popupMenu() { - const side = opt.DASH_VERTICAL ? St.Side.LEFT : St.Side.BOTTOM; - AppIconCommon.popupMenu.bind(this)(side); - },*/ - - _updateRunningStyle() { - const currentWs = global.workspace_manager.get_active_workspace(); - const show = opt.DASH_ISOLATE_WS - ? this.app.get_windows().filter(w => w.get_workspace() === currentWs).length - : this.app.state !== Shell.AppState.STOPPED; - - if (show) - this._dot.show(); - else - this._dot.hide(); - }, - - /* after__init() { - if (this._updateRunningDotStyle) - this._updateRunningDotStyle(); - },*/ - _updateRunningDotStyle() { if (opt.RUNNING_DOT_STYLE) - this._dot.add_style_class_name('app-well-app-running-dot-custom'); + this._dot.add_style_class_name('app-grid-running-dot-custom'); else - this._dot.remove_style_class_name('app-well-app-running-dot-custom'); - - if (!this.label && shellVersion46) { - if (opt.DASH_VERTICAL) { - this._dot.translation_y = 0; - this._dot.translation_x = 0; // opt.DASH_LEFT ? -4 : 4; - } else { - this._dot.translation_y = 8; - this._dot.translation_x = 0; - } - } + this._dot.remove_style_class_name('app-grid-running-dot-custom'); }, activate(button) { @@ -957,9 +930,6 @@ const DashIconCommon = { }, popupMenu(side = St.Side.LEFT) { - side = opt.DASH_VERTICAL ? St.Side.LEFT : St.Side.BOTTOM; - // AppIconCommon.popupMenu.bind(this)(side); - this.setForcedHighlight(true); this._removeMenuTimeout(); this.fake_release(); @@ -1027,7 +997,6 @@ const DashIconCommon = { }]); } - popupItems.push([_('Move App to Current Workspace ( Shift + Click )'), this._moveAppToCurrentWorkspace]); // WTMB (Windows Thumbnails) extension required if (global.windowThumbnails) { @@ -1081,6 +1050,48 @@ const DashIconCommon = { }, }; +const DashIconCommon = { + after__init() { + if (opt.DASH_ICON_SCROLL && !Me.Util.dashNotDefault()) { + this._scrollConId = this.connect('scroll-event', DashExtensions.onScrollEvent.bind(this)); + this._leaveConId = this.connect('leave-event', DashExtensions.onLeaveEvent.bind(this)); + } + }, + + popupMenu() { + const side = opt.DASH_VERTICAL ? St.Side.LEFT : St.Side.BOTTOM; + AppIconCommon.popupMenu.bind(this)(side); + }, + + _updateRunningDotStyle() { + if (opt.RUNNING_DOT_STYLE) + this._dot.add_style_class_name('app-grid-running-dot-custom'); + else + this._dot.remove_style_class_name('app-grid-running-dot-custom'); + + this._dot.translation_x = 0; + // _updateDotStyle() has been added in GS 46.2 to apply translation_y value from the CSS on style change + if (shellVersion46 && !this._updateDotStyle && !opt.DASH_VERTICAL) + this._dot.translation_y = 8; + + // GS 46.0 (Ubuntu) only + if (opt.DASH_VERTICAL) + this._dot.translationY = 0; + }, + + _updateRunningStyle() { + const currentWs = global.workspace_manager.get_active_workspace(); + const show = opt.DASH_ISOLATE_WS + ? this.app.get_windows().filter(w => w.get_workspace() === currentWs).length + : this.app.state !== Shell.AppState.STOPPED; + + if (show) + this._dot.show(); + else + this._dot.hide(); + }, +}; + const DashExtensions = { onScrollEvent(source, event) { if ((this.app && !opt.DASH_ICON_SCROLL) || (this._isSearchWindowsIcon && !opt.SEARCH_WINDOWS_ICON_SCROLL)) { @@ -1255,20 +1266,6 @@ const DashExtensions = { }, }; -const AppIconCommon = { - after__init() { - if (this._updateRunningDotStyle) - this._updateRunningDotStyle(); - }, - - _updateRunningDotStyle() { - if (opt.RUNNING_DOT_STYLE) - this._dot.add_style_class_name('app-well-app-running-dot-custom'); - else - this._dot.remove_style_class_name('app-well-app-running-dot-custom'); - }, -}; - const AppMenuCommon = { _updateWindowsSection() { if (global.compositor) { diff --git a/extensions/46/vertical-workspaces/lib/iconGrid.js b/extensions/46/vertical-workspaces/lib/iconGrid.js index 87f6adb..f0c6b18 100644 --- a/extensions/46/vertical-workspaces/lib/iconGrid.js +++ b/extensions/46/vertical-workspaces/lib/iconGrid.js @@ -11,14 +11,16 @@ 'use strict'; import St from 'gi://St'; +import GLib from 'gi://GLib'; +import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as IconGrid from 'resource:///org/gnome/shell/ui/iconGrid.js'; let Me; let opt; // added sizes for better scaling -const IconSize = { +export const IconSize = { LARGEST: 256, 224: 224, 208: 208, @@ -34,8 +36,6 @@ const IconSize = { TINY: 48, }; -const PAGE_WIDTH_CORRECTION = 100; - export const IconGridModule = class { constructor(me) { Me = me; @@ -90,39 +90,52 @@ const IconGridCommon = { return layoutManager.getItemsAtPage(page); }, + _shouldUpdateGrid(width, height) { + if (this.layoutManager._isFolder) + return false; + else if (this._currentMode === -1) + return true; + + // Update if page size changed + // Page dimensions may change within a small range + const range = 5; + return (Math.abs(width - (this._gridForWidth ?? 0)) > range) || + (Math.abs(height - (this._gridForHeight ?? 0)) > range); + }, + _findBestModeForSize(width, height) { // this function is for main grid only, folder grid calculation is in appDisplay.AppFolderDialog class - if (this._currentMode > -1 || this.layoutManager._isFolder) + if (!this._shouldUpdateGrid(width, height)) return; + + this._gridForWidth = width; + this._gridForHeight = height; + + this._updateDefaultIconSize(); const { pagePadding } = this.layout_manager; const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); - const iconPadding = 51 * scaleFactor; - // provided width is usually about 100px wider in horizontal orientation with prev/next page indicators - const pageIndicatorCompensation = opt.ORIENTATION ? 0 : PAGE_WIDTH_CORRECTION; + const itemPadding = 55; - width -= pagePadding.left + pagePadding.right + pageIndicatorCompensation; - width *= opt.APP_GRID_PAGE_WIDTH_SCALE; + // pagePadding is already affected by the scaleFactor + width -= pagePadding.left + pagePadding.right; height -= pagePadding.top + pagePadding.bottom; - // store grid max dimensions for icon size algorithm + // Sync with _findBestIconSize() + this.layoutManager._gridSizeChanged = true; this.layoutManager._gridWidth = width; this.layoutManager._gridHeight = height; - width -= 80; // compensation for default padding - height -= 80; + // All widgets are affected by the scaleFactor so we need to apply it also on the page size + width /= scaleFactor; + height /= scaleFactor; const spacing = opt.APP_GRID_SPACING; - // set the icon size as fixed to avoid changes in size later const iconSize = opt.APP_GRID_ICON_SIZE > 0 ? opt.APP_GRID_ICON_SIZE : opt.APP_GRID_ICON_SIZE_DEFAULT; - // this.layout_manager.fixedIconSize = iconSize; - const itemSize = iconSize * scaleFactor + iconPadding; - // if this._gridModes.length === 1, custom grid should be used - // if (iconSize > 0 && this._gridModes.length > 1) { + const itemSize = iconSize + itemPadding; let columns = opt.APP_GRID_COLUMNS; let rows = opt.APP_GRID_ROWS; // 0 means adaptive size let unusedSpaceH = -1; - let unusedSpaceV = -1; if (!columns) { // calculate #columns + 1 without spacing columns = Math.floor(width / itemSize) + 1; @@ -133,6 +146,7 @@ const IconGridCommon = { unusedSpaceH = width - columns * itemSize - (columns - 1) * spacing; } } + let unusedSpaceV = -1; if (!rows) { rows = Math.floor(height / itemSize) + 1; while (unusedSpaceV < 0) { @@ -142,9 +156,45 @@ const IconGridCommon = { } this._gridModes = [{ columns, rows }]; - // } - + this._currentMode = -1; this._setGridMode(0); + this.layoutManager.updateIconSize(); + // Call _redisplay() from timeout to avoid allocation errors + GLib.idle_add(GLib.PRIORITY_LOW, () => + Main.overview._overview.controls.appDisplay._redisplay() + ); + }, + + _updateDefaultIconSize() { + // Reduce default icon size for low resolution screens and high screen scales + if (Me.Util.monitorHasLowResolution()) { + opt.APP_GRID_ICON_SIZE_DEFAULT = opt.APP_GRID_ACTIVE_PREVIEW && !opt.APP_GRID_USAGE ? 128 : 64; + opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT = 64; + } else { + opt.APP_GRID_ICON_SIZE_DEFAULT = opt.APP_GRID_ACTIVE_PREVIEW && !opt.APP_GRID_USAGE ? 192 : 96; + } + }, + + // Workaround for the upstream bug + // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5753 + // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5240 + // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6892 + // The appGridLayout._currentPage is not updated when the page is changed in the grid + // For example, when user navigates app icons using a keyboard + // Related issues open on GNOME's gitlab: + after_goToPage() { + if (this._delegate._appGridLayout._currentPage !== this._currentPage) + this._delegate._appGridLayout.goToPage(this._currentPage); + }, + + // Workaround for the upstream bug + // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7700 + // Return INVALID target if x or y is out of the grid view to prevent pages[page] undefined error (horizontal orientation only) + getDropTarget(x, y) { + if (x < 0 || y < 0) + return [0, 0, 0]; // [0, 0, DragLocation.INVALID] + const layoutManager = this.layout_manager; + return layoutManager.getDropTarget(x, y, this._currentPage); }, }; @@ -153,45 +203,45 @@ const IconGridLayoutCommon = { if (this.fixedIconSize !== -1) return this.fixedIconSize; + if (!this._isFolder && !this._gridSizeChanged) + return this._iconSize; + this._gridSizeChanged = false; + + const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); const nColumns = this.columnsPerPage; const nRows = this.rowsPerPage; - // if grid is not defined return default icon size + // If grid is not defined, return default icon size if (nColumns < 1 && nRows < 1) { - let iconSize; - if (this._isFolder) - iconSize = opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT; - else - iconSize = opt.APP_GRID_ICON_SIZE_DEFAULT; - - return iconSize; + return this._isFolder + ? opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT + : opt.APP_GRID_ICON_SIZE_DEFAULT; } - const columnSpacingPerPage = /* opt.APP_GRID_SPACING*/ 1 * (nColumns - 1); - const rowSpacingPerPage = /* opt.APP_GRID_SPACING*/ 1 * (nRows - 1); - const iconPadding = 55 * scaleFactor; + const spacing = this._isFolder + ? opt.APP_GRID_FOLDER_SPACING + : opt.APP_GRID_SPACING; - const paddingH = this._isFolder ? this.pagePadding.left + this.pagePadding.right : 0; - const paddingV = this._isFolder ? this.pagePadding.top + this.pagePadding.bottom : 0; + const columnSpacingPerPage = spacing * (nColumns - 1); + const rowSpacingPerPage = spacing * (nRows - 1); + const itemPadding = 55; + + const width = (this._gridWidth ? this._gridWidth : this._pageWidth) / scaleFactor; + let height = (this._gridHeight ? this._gridHeight : this._pageHeight) / scaleFactor; - const width = this._gridWidth ? this._gridWidth : this._pageWidth; - const height = this._gridHeight ? this._gridHeight : this._pageHeight; if (!width || !height) return opt.APP_GRID_ICON_SIZE_DEFAULT; const [firstItem] = this._container; - /* if (opt.APP_GRID_ADAPTIVE && !this._isFolder) - return opt.APP_GRID_ICON_SIZE_DEFAULT;*/ - let iconSizes = Object.values(IconSize).sort((a, b) => b - a); - // limit max icon size for folders and fully adaptive folder grids, the whole range is for the main grid with active folders - if (this._isFolder && opt.APP_GRID_FOLDER_ADAPTIVE && opt.APP_GRID_FOLDER_ICON_SIZE < 0) + // Limit max icon size for folders and fully adaptive folder grids, the whole range is for the main grid with active folders + if (this._isFolder && opt.APP_GRID_FOLDER_ICON_SIZE < 0) iconSizes = iconSizes.slice(iconSizes.indexOf(opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT), -1); else if (this._isFolder) iconSizes = iconSizes.slice(iconSizes.indexOf(IconSize.LARGE), -1); - else if (opt.APP_GRID_ADAPTIVE && opt.APP_GRID_ICON_SIZE < 0) + else if (opt.APP_GRID_ICON_SIZE < 0) iconSizes = iconSizes.slice(iconSizes.indexOf(opt.APP_GRID_ICON_SIZE_DEFAULT), -1); let sizeInvalid = false; @@ -202,7 +252,7 @@ const IconGridLayoutCommon = { firstItem.icon.setIconSize(size); const [firstItemWidth] = firstItem.get_preferred_size(); - const itemSize = firstItemWidth; + const itemSize = firstItemWidth / scaleFactor; if (itemSize < size) sizeInvalid = true; @@ -211,19 +261,16 @@ const IconGridLayoutCommon = { } if (!firstItem || sizeInvalid) { - usedWidth = (size + iconPadding) * nColumns; - usedHeight = (size + iconPadding) * nRows; + usedWidth = (size + itemPadding) * nColumns; + usedHeight = (size + itemPadding) * nRows; } const emptyHSpace = - width - usedWidth - columnSpacingPerPage - paddingH; - // this.pagePadding.left - this.pagePadding.right; + width - usedWidth - columnSpacingPerPage; const emptyVSpace = - height - usedHeight - rowSpacingPerPage - paddingV; - // this.pagePadding.top - this.pagePadding.bottom; + height - usedHeight - rowSpacingPerPage; - if (emptyHSpace >= 0 && emptyVSpace >= 0) { + if (emptyHSpace >= 0 && emptyVSpace >= 0) return size; - } } return IconSize.TINY; @@ -266,7 +313,9 @@ const IconGridLayoutCommon = { page = this._findBestPageToAppend(page); this._shouldEaseItems = true; - this._container.add_child(item); + + if (!this._container.get_children().includes(item)) + this._container.add_child(item); this._addItemToPage(item, page, index); }, @@ -331,6 +380,28 @@ const IconGridLayoutCommon = { this._relocateSurplusItems(pageIndex); }, + _relocateSurplusItems(pageIndex) { + // Avoid recursion during relocations in _redisplay() + if (this._skipRelocateSurplusItems) + return; + + const visiblePageItems = this._pages[pageIndex].visibleChildren; + const itemsPerPage = this.columnsPerPage * this.rowsPerPage; + + // No overflow + if (visiblePageItems.length <= itemsPerPage) + return; + + const nExtraItems = visiblePageItems.length - itemsPerPage; + for (let i = 0; i < nExtraItems; i++) { + const overflowIndex = visiblePageItems.length - i - 1; + const overflowItem = visiblePageItems[overflowIndex]; + + this._removeItemData(overflowItem); + this._addItemToPage(overflowItem, pageIndex + 1, 0); + } + }, + _findBestPageToAppend(startPage) { const itemsPerPage = this.columnsPerPage * this.rowsPerPage; @@ -343,4 +414,16 @@ const IconGridLayoutCommon = { return this._pages.length; }, + + updateIconSize() { + const iconSize = this._findBestIconSize(); + if (this._iconSize !== iconSize) { + this._iconSize = iconSize; + + for (const child of this._container) + child.icon.setIconSize(iconSize); + + this.notify('icon-size'); + } + }, }; diff --git a/extensions/46/vertical-workspaces/lib/optionsFactory.js b/extensions/46/vertical-workspaces/lib/optionsFactory.js index 05e14b0..7284085 100644 --- a/extensions/46/vertical-workspaces/lib/optionsFactory.js +++ b/extensions/46/vertical-workspaces/lib/optionsFactory.js @@ -300,10 +300,10 @@ export const ItemFactory = class ItemFactory { function setName() { const ProfileNames = [ - _('GNOME 3'), - _('GNOME 40+ - Bottom Hot Edge'), - _('Hot Corner Centric - Top Left Hot Corner'), - _('Dock Overview - Bottom Hot Edge'), + _('GNOME 3 Layout (Vertical WS)'), + _('GNOME 4x Layout, Bottom Hot Edge (Horizontal WS)'), + _('Top Left Hot Corner Centric (Vertical WS)'), + _('Dock-Like Overview, Bottom Hot Edge (Horizontal WS)'), ]; let name = opt.get(`profileName${profileIndex}`, true); diff --git a/extensions/46/vertical-workspaces/lib/overviewControls.js b/extensions/46/vertical-workspaces/lib/overviewControls.js index 41db47f..c5a74f1 100644 --- a/extensions/46/vertical-workspaces/lib/overviewControls.js +++ b/extensions/46/vertical-workspaces/lib/overviewControls.js @@ -10,16 +10,14 @@ 'use strict'; -import GLib from 'gi://GLib'; import Clutter from 'gi://Clutter'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; import St from 'gi://St'; -import Meta from 'gi://Meta'; import Shell from 'gi://Shell'; -import GObject from 'gi://GObject'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as Overview from 'resource:///org/gnome/shell/ui/overview.js'; -import * as Layout from 'resource:///org/gnome/shell/ui/layout.js'; import * as OverviewControls from 'resource:///org/gnome/shell/ui/overviewControls.js'; import * as WorkspacesView from 'resource:///org/gnome/shell/ui/workspacesView.js'; import * as Background from 'resource:///org/gnome/shell/ui/background.js'; @@ -33,11 +31,10 @@ let _; const ControlsState = OverviewControls.ControlsState; const FitMode = WorkspacesView.FitMode; +const STARTUP_ANIMATION_TIME = 500; const ANIMATION_TIME = Overview.ANIMATION_TIME; -const DASH_MAX_SIZE_RATIO = 0.25; +const DASH_MAX_SIZE_RATIO = 0.35; -let _originalSearchControllerSigId; -let _searchControllerSigId; let _timeouts; export const OverviewControlsModule = class { @@ -84,13 +81,18 @@ export const OverviewControlsModule = class { this._replaceOnSearchChanged(); this._overrides.addOverride('ControlsManager', OverviewControls.ControlsManager.prototype, ControlsManagerCommon); - + this._overrides.addOverride('ControlsManagerLayoutCommon', Main.overview._overview.controls.layoutManager, ControlsManagerLayoutCommon); if (opt.ORIENTATION === Clutter.Orientation.VERTICAL) this._overrides.addOverride('ControlsManagerLayout', Main.overview._overview.controls.layoutManager, ControlsManagerLayoutVertical); else this._overrides.addOverride('ControlsManagerLayout', Main.overview._overview.controls.layoutManager, ControlsManagerLayoutHorizontal); - this._overrides.addOverride('LayoutManager', Layout.LayoutManager.prototype, LayoutManager); + // Allow user to close the overview by clicking on an empty space on the primary monitor's overview + // Secondary monitors are handled in workspacesView + this._addClickToCloseOverview(); + + // Update custom workAreaBox + Main.overview._overview.controls.layoutManager._updateWorkAreaBox(); console.debug(' OverviewControlsModule - Activated'); } @@ -103,6 +105,7 @@ export const OverviewControlsModule = class { const reset = true; this._replaceOnSearchChanged(reset); Main.overview._overview._controls._appDisplay.opacity = 255; + this._addClickToCloseOverview(reset); console.debug(' OverviewControlsModule - Disabled'); } @@ -120,29 +123,55 @@ export const OverviewControlsModule = class { _replaceOnSearchChanged(reset) { const searchController = Main.overview.searchController; if (reset) { - if (_searchControllerSigId) { - searchController.disconnect(_searchControllerSigId); - _searchControllerSigId = 0; + if (this._searchControllerSigId) { + searchController.disconnect(this._searchControllerSigId); + this._searchControllerSigId = 0; } - if (_originalSearchControllerSigId) { - searchController.unblock_signal_handler(_originalSearchControllerSigId); - _originalSearchControllerSigId = 0; + if (this._originalSearchControllerSigId) { + searchController.unblock_signal_handler(this._originalSearchControllerSigId); + this._originalSearchControllerSigId = 0; } - Main.overview.searchController._searchResults.translation_x = 0; - Main.overview.searchController._searchResults.translation_y = 0; + searchController._searchResults.translation_x = 0; + searchController._searchResults.translation_y = 0; Main.overview.searchEntry.visible = true; Main.overview.searchEntry.opacity = 255; } else { // reconnect signal to use custom function (callbacks cannot be overridden in class prototype, they are already in memory as a copy for the given callback) - if (!_originalSearchControllerSigId) - _originalSearchControllerSigId = GObject.signal_handler_find(searchController, { signalId: 'notify', detail: 'search-active' }); - if (_originalSearchControllerSigId) - searchController.block_signal_handler(_originalSearchControllerSigId); + if (!this._originalSearchControllerSigId) { + this._originalSearchControllerSigId = GObject.signal_handler_find(searchController, { signalId: 'notify', detail: 'search-active' }); + if (this._originalSearchControllerSigId) + searchController.block_signal_handler(this._originalSearchControllerSigId); + } - if (!_searchControllerSigId) - _searchControllerSigId = searchController.connect('notify::search-active', ControlsManagerCommon._onSearchChanged.bind(Main.overview._overview.controls)); + if (!this._searchControllerSigId) + this._searchControllerSigId = searchController.connect('notify::search-active', () => Main.overview._overview.controls._onSearchChanged()); } } + + _addClickToCloseOverview(reset) { + const overview = Main.overview._overview; + + overview.reactive = false; + if (this._clickEmptyConId) { + overview.disconnect(this._clickEmptyConId); + this._clickEmptyConId = 0; + } + + if (reset || !opt.CLICK_EMPTY_CLOSE) + return; + + overview.reactive = true; + this._clickEmptyConId = overview.connect('button-release-event', (actor, event) => { + const button = event.get_button(); + const overviewState = overview.controls._stateAdjustment.value; + const buttonPrimary = button === Clutter.BUTTON_PRIMARY; + const buttonSecondary = button === Clutter.BUTTON_SECONDARY; + const buttonAny = buttonPrimary || buttonSecondary; + + if ((overviewState === 1 && buttonAny) || (overviewState === 2 && buttonSecondary)) + Main.overview.hide(); + }); + } }; const ControlsManagerCommon = { @@ -151,19 +180,32 @@ const ControlsManagerCommon = { ... }*/ + prepareToEnterOverview() { + this._searchController.prepareToEnterOverview(); + this._workspacesDisplay.prepareToEnterOverview(); + // Workaround for thumbnailsBox not re-scaling after switching workspace outside of overview using a trackpad + this._thumbnailsBox._updateIndicator(); + + Main.overview._overview.controls.opacity = 255; + + // Ensure that overview backgrounds are ready when needed + if (!this._bgManagers && (opt.SHOW_BG_IN_OVERVIEW || !opt.SHOW_WS_PREVIEW_BG)) + this._setBackground(); + else if (this._bgManagers && !(opt.SHOW_BG_IN_OVERVIEW || !opt.SHOW_WS_PREVIEW_BG)) + this._setBackground(true); + + // store pointer X coordinate for OVERVIEW_MODE 1 - to prevent immediate switch to WORKSPACE_MODE 1 if the mouse pointer is steady + opt.showingPointerX = global.get_pointer()[0]; + }, + // this function has duplicate in WorkspaceView so we use one function for both to avoid issues with syncing them _getFitModeForState(state) { return _getFitModeForState(state); }, _updateThumbnailsBox() { - const { currentState } = this._stateAdjustment.getStateTransitionParams(); const { shouldShow } = this._thumbnailsBox; - const thumbnailsBoxVisible = shouldShow && - ((currentState < ControlsState.APP_GRID && opt.SHOW_WS_TMB) || - (currentState > ControlsState.WINDOW_PICKER && opt.SHOW_WS_TMB_APPGRID) || - (currentState > ControlsState.WINDOW_PICKER && this._searchController.searchActive && opt.SHOW_WS_TMB) - ); + const thumbnailsBoxVisible = shouldShow; this._thumbnailsBox.visible = thumbnailsBoxVisible; // this call should be directly in _update(), but it's used as a callback function and it would require to reconnect the signal @@ -210,13 +252,18 @@ const ControlsManagerCommon = { if (currentState === 0 && opt.OVERVIEW_MODE && opt.WORKSPACE_MODE) opt.WORKSPACE_MODE = 0; - if (!opt.WS_ANIMATION || !opt.SHOW_WS_TMB) { + if (!opt.WS_ANIMATION || (!opt.SHOW_WS_TMB && opt.SHOW_WS_PREVIEW_BG)) { this._workspacesDisplay.opacity = opacity; - } else if (!opt.SHOW_WS_TMB_BG) { + } else if (!opt.SHOW_WS_TMB_BG && opt.SHOW_WS_PREVIEW_BG) { // fade out ws wallpaper during transition to ws switcher if ws switcher background disabled - const ws = this._workspacesDisplay._workspacesViews[global.display.get_primary_monitor()]?._workspaces[this._workspaceAdjustment.value]; - if (ws) - ws._background.opacity = opacity; + const workspaces = this._workspacesDisplay._workspacesViews[global.display.get_primary_monitor()]?._workspaces; + // Speed up the workspace background opacity transition + if (opt.WORKSPACE_MAX_SPACING < opt.WS_MAX_SPACING_OFF_SCREEN && workspaces) + // If workspacesDisplay max spacing is set so adjacent workspaces could be visible on the screen + workspaces.forEach(w => w._background.set_opacity(Math.max(0, opacity - (255 - opacity)))); + else if (workspaces) + // If adjacent workspaces should not be visible on the screen, set the opacity only for the visible one + workspaces[this._workspaceAdjustment.value]?._background.set_opacity(Math.max(0, opacity - (255 - opacity))); } // if ws preview background is disabled, animate tmb box and dash @@ -229,7 +276,7 @@ const ControlsManagerCommon = { // OVERVIEW_MODE 2 should animate dash and wsTmbBox only if WORKSPACE_MODE === 0 (windows not spread) const animateOverviewMode2 = opt.OVERVIEW_MODE2 && !(finalState === 1 && opt.WORKSPACE_MODE); if (!Main.layoutManager._startingUp && ((!opt.SHOW_WS_PREVIEW_BG && !opt.OVERVIEW_MODE2) || animateOverviewMode2)) { - if (!tmbBox._translationOriginal || Math.abs(tmbBox._translationOriginal[0]) > 500) { // swipe gesture can call this calculation before tmbBox is finalized, giving nonsense width + if (!tmbBox._translationOriginal || Math.abs(tmbBox._translationOriginal[0]) > 500) { // swipe gesture can call this calculation before tmbBox is realized, giving nonsense width const [dashTranslationX, dashTranslationY, tmbTranslationX, tmbTranslationY, searchTranslationY] = this._getOverviewTranslations(dash, tmbBox, searchEntryBin); tmbBox._translationOriginal = [tmbTranslationX, tmbTranslationY]; dash._translationOriginal = [dashTranslationX, dashTranslationY]; @@ -275,6 +322,10 @@ const ControlsManagerCommon = { } else { this._workspacesDisplay.scale_x = 1; } + if (opt.LEAVING_SEARCH && currentState <= ControlsState.WINDOW_PICKER) { + opt.LEAVING_SEARCH = false; + } + this._workspacesDisplay.setPrimaryWorkspaceVisible(workspacesDisplayVisible); if (!this.dash._isAbove && progress > 0 && opt.OVERVIEW_MODE2) { @@ -292,11 +343,14 @@ const ControlsManagerCommon = { this.set_child_above_sibling(this._searchEntryBin, null); if (!Me.Util.dashNotDefault()) this.set_child_above_sibling(this.dash, null); - + if (Main.layoutManager.panelBox.get_parent() === Main.layoutManager.overviewGroup) + Main.layoutManager.overviewGroup.set_child_above_sibling(Main.layoutManager.panelBox, Main.overview._overview); this.dash._isAbove = true; } else if (this.dash._isAbove && progress < 1) { // keep dash below for ws transition between the overview and hidden state this.set_child_above_sibling(this._workspacesDisplay, null); + if (Main.layoutManager.panelBox.get_parent() === Main.layoutManager.overviewGroup) + Main.layoutManager.overviewGroup.set_child_below_sibling(Main.layoutManager.panelBox, Main.overview._overview); this.dash._isAbove = false; } }, @@ -319,6 +373,41 @@ const ControlsManagerCommon = { !this._searchTransition; }, + _activateSearchAppGridMode() { + if (!this._origAppGridContent) { + this._origAppGridContent = { + usage: opt.APP_GRID_USAGE, + favorites: opt.APP_GRID_EXCLUDE_FAVORITES, + running: opt.APP_GRID_EXCLUDE_RUNNING, + incompletePages: this._appDisplay._grid.layoutManager.allowIncompletePages, + order: opt.APP_GRID_ORDER, + }; + opt.APP_GRID_ORDER = 3; + opt.APP_GRID_USAGE = true; + opt.APP_GRID_EXCLUDE_FAVORITES = false; + opt.APP_GRID_EXCLUDE_RUNNING = false; + this._appDisplay._grid.layoutManager.allowIncompletePages = false; + this._appDisplay._redisplay(); + } + }, + + _deactivateSearchAppGridMode() { + if (this._origAppGridContent) { + const icons = this._appDisplay._orderedItems; + icons.forEach(icon => { + icon.visible = true; + }); + + opt.APP_GRID_ORDER = this._origAppGridContent.order; + opt.APP_GRID_USAGE = this._origAppGridContent.usage; + opt.APP_GRID_EXCLUDE_FAVORITES = this._origAppGridContent.favorites; + opt.APP_GRID_EXCLUDE_RUNNING = this._origAppGridContent.running; + this._appDisplay._grid.layoutManager.allowIncompletePages = this._origAppGridContent.incompletePages; + this._origAppGridContent = null; + this._appDisplay._redisplay(); + } + }, + _onSearchChanged() { // something is somewhere setting the opacity to 0 if V-Shell is rebased while in overview / search this._searchController.opacity = 255; @@ -351,9 +440,20 @@ const ControlsManagerCommon = { return; if (!searchActive) { + if (!this.dash.showAppsButton.checked) + opt.LEAVING_SEARCH = true; + + if (this._origAppGridContent) + this._deactivateSearchAppGridMode(); + this._workspacesDisplay.reactive = true; this._workspacesDisplay.setPrimaryWorkspaceVisible(true); } else { + if (opt.SEARCH_APP_GRID_MODE && this.dash.showAppsButton.checked) { + this._activateSearchAppGridMode(); + return; + } + if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) this._searchController._searchResults._statusText.add_style_class_name('search-statustext-om2'); else @@ -361,6 +461,7 @@ const ControlsManagerCommon = { this._searchController.show(); entry.visible = true; entry.opacity = 255; + opt.LEAVING_SEARCH = false; } if (opt.SHOW_BG_IN_OVERVIEW && this._bgManagers) @@ -445,7 +546,6 @@ const ControlsManagerCommon = { // reuse already tuned overview transition, just replace APP_GRID with the search view if (!(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) && !Main.overview._animationInProgress && finalState !== ControlsState.HIDDEN && !this.dash.showAppsButton.checked) { this._searchController._searchResults._content.remove_style_class_name('search-section-content-bg-om2'); - this._searchController._searchResults._content.add_style_class_name('search-section-content-bg'); this._searchEntry.remove_style_class_name('search-entry-om2'); const duration = opt.SEARCH_VIEW_ANIMATION ? 140 : 0; this._stateAdjustment.ease(searchActive ? ControlsState.APP_GRID : ControlsState.WINDOW_PICKER, { @@ -464,11 +564,9 @@ const ControlsManagerCommon = { }); } else if (opt.OVERVIEW_MODE2 && !(opt.WORKSPACE_MODE || this.dash.showAppsButton.checked)) { // add background to search results and make searchEntry border thicker for better visibility - this._searchController._searchResults._content.remove_style_class_name('search-section-content-bg'); this._searchController._searchResults._content.add_style_class_name('search-section-content-bg-om2'); - Main.overview.searchEntry.add_style_class_name('search-entry-om2'); + this._searchEntry.add_style_class_name('search-entry-om2'); } else { - this._searchController._searchResults._content.add_style_class_name('search-section-content-bg'); this._searchController._searchResults._content.remove_style_class_name('search-section-content-bg-om2'); this._searchEntry.remove_style_class_name('search-entry-om2'); } @@ -496,18 +594,14 @@ const ControlsManagerCommon = { await this.layout_manager.ensureAllocation(); this._setBackground(); + Me.Modules.panelModule.update(); Main.panel.opacity = 255; - const STARTUP_ANIMATION_TIME = 500; // Opacity this.ease({ opacity: opt.STARTUP_STATE === 1 ? 0 : 255, duration: STARTUP_ANIMATION_TIME, mode: Clutter.AnimationMode.LINEAR, - onComplete: () => { - // part of the workaround for stuttering first app grid animation - this._appDisplay.visible = true; - }, }); const dash = this.dash; @@ -560,7 +654,6 @@ const ControlsManagerCommon = { STARTUP_ANIMATION_TIME * 2 * St.Settings.get().slow_down_factor, () => { onComplete(); - Main.overview._startupInitComplete = true; _timeouts.startupAnim2 = 0; return GLib.SOURCE_REMOVE; } @@ -622,16 +715,13 @@ const ControlsManagerCommon = { _realizeAppDisplayAndFinishSequence() { const appDisplayModule = Me.Modules.appDisplayModule; // realize app grid for smoother first animation - appDisplayModule._updateAppGrid(false, this._finishStartupSequence.bind(this)); + appDisplayModule._repopulateAppDisplay(false, this._finishStartupSequence.bind(this)); }, _finishStartupSequence() { if (!this._bgManagers) this._setBackground(); - /* if (Me.Util.dashIsDashToDock()) - return;*/ - _timeouts.finishStartup = GLib.idle_add( GLib.PRIORITY_LOW, () => { this._appDisplay.opacity = 255; @@ -666,7 +756,6 @@ const ControlsManagerCommon = { }, _getOverviewTranslations(dash, tmbBox, searchEntryBin) { - // const tmbBox = Main.overview._overview._controls._thumbnailsBox; const animationsDisabled = !St.Settings.get().enable_animations || ((opt.SHOW_WS_PREVIEW_BG && !opt.OVERVIEW_MODE2) && !Main.layoutManager._startingUp); if (animationsDisabled) return [0, 0, 0, 0, 0]; @@ -775,7 +864,7 @@ const ControlsManagerCommon = { _setBackground(reset = false) { if (this._bgManagers) { this._bgManagers.forEach(bg => { - Main.overview._overview._controls._stateAdjustment.disconnect(bg._fadeSignal); + this._stateAdjustment.disconnect(bg._fadeSignal); bg.destroy(); }); } @@ -797,8 +886,7 @@ const ControlsManagerCommon = { bgManager.backgroundActor.content.vignette_sharpness = 0; bgManager.backgroundActor.content.brightness = 1; - - bgManager._fadeSignal = Main.overview._overview._controls._stateAdjustment.connect('notify::value', v => { + bgManager._fadeSignal = this._stateAdjustment.connect('notify::value', v => { this._updateBackground(bgManager, v.value, v); }); @@ -813,10 +901,10 @@ const ControlsManagerCommon = { }, _updateBackground(bgManager, stateValue = 2, stateAdjustment = null) { - // Blur My Shell extension destroys all background actors in the overview and doesn't care about consequences + // Just in case something destroys our background (like older versions of Blur My Shell) if (this._bgManagers[0] && !Main.layoutManager.overviewGroup.get_children().includes(this._bgManagers[0].backgroundActor)) { - Main.notifyError(`[${Me.metadata.name}]`, _('Overview background crashed!\nIf you are using Blur My Shell, disable overview blur in its settings and re-enable V-Shell Overview Background to avoid visual glitches.')); - // remove and disconnect our destroyed backgrounds to avoid more errors + console.error(`[${Me.metadata.name}]`, 'Error: The overview background has been destroyed, possibly by another incompatible extension'); + // remove and disconnect our destroyed backgrounds to avoid further errors this._setBackground(true); return; } @@ -824,9 +912,12 @@ const ControlsManagerCommon = { const finalState = stateAdjustment?.getStateTransitionParams().finalState; if (!opt.SHOW_BG_IN_OVERVIEW && !opt.SHOW_WS_PREVIEW_BG) { // if no bg shown in the overview, fade out the wallpaper + if (bgManager.backgroundActor.get_effect('blur')) + bgManager.backgroundActor.remove_effect_by_name('blur'); if (!(opt.OVERVIEW_MODE2 && opt.WORKSPACE_MODE && finalState === 1)) bgManager.backgroundActor.opacity = Util.lerp(255, 0, Math.min(stateValue, 1)); } else { + bgManager.backgroundActor.opacity = 255; let VIGNETTE, BRIGHTNESS, bgValue; if (opt.OVERVIEW_MODE2 && stateValue <= 1 && !opt.WORKSPACE_MODE) { VIGNETTE = 0; @@ -852,7 +943,6 @@ const ControlsManagerCommon = { // In GNOME 46 the "sigma" property has been renamed to "radius" const radius = blurEffect.sigma !== undefined ? 'sigma' : 'radius'; - blurEffect[radius] = 0; const searchActive = this._searchController.searchActive; if (searchActive) @@ -911,6 +1001,30 @@ const ControlsManagerCommon = { } } }, +}; + +const ControlsManagerLayoutCommon = { + after__updateWorkAreaBox() { + const workArea = this._workAreaBox.copy(); + + // opt.PANEL_OVERVIEW_ONLY removes affectsStruts panel property + if (opt.get('panelModule') && opt.PANEL_OVERVIEW_ONLY) { + let offsetY = 0; + let reduction = 0; + reduction = Main.panel.height; + offsetY = opt.PANEL_POSITION_TOP ? reduction : 0; + + const startX = workArea.x1; + const startY = workArea.y1 + offsetY; + const width = workArea.get_width(); + const height = workArea.get_height() - reduction; + + workArea.set_origin(startX, startY); + workArea.set_size(width, height); + } + + this._workAreaBoxForVShellConfig = workArea; + }, _updatePositionFromDashToDock() { // update variables that cannot be processed within settings @@ -922,153 +1036,104 @@ const ControlsManagerCommon = { opt.DASH_LEFT = opt.DASH_POSITION === 3; opt.DASH_VERTICAL = opt.DASH_LEFT || opt.DASH_RIGHT; }, + + _dashToDockAffectsWorkArea() { + const dash = Main.overview.dash; + const dtd = dash.get_parent()?.get_parent()?.get_parent(); + const layoutManager = Main.layoutManager; + const index = layoutManager._findActor(dtd); + const data = index > -1 ? layoutManager._trackedActors[index] : null; + const affectsStruts = data?.affectsStruts; + return !!affectsStruts; + }, }; const ControlsManagerLayoutVertical = { - _computeWorkspacesBoxForState(state, box, workAreaBox, dashWidth, dashHeight, thumbnailsWidth, thumbnailsHeight, searchHeight, startY) { - // in case the function is called from the DtD - if (startY === undefined) - workAreaBox = box; - + _computeWorkspacesBoxForState(state, box, wsTmbWidth, wsTmbHeight, leftBoxOffset, rightBoxOffset, topBoxOffset, bottomBoxOffset, centeredBoxOffset) { const workspaceBox = box.copy(); - let [width, height] = workspaceBox.get_size(); - const spacing = 12; - - const dash = Main.overview.dash; - // including Dash to Dock and clones properties for compatibility - - if (Me.Util.dashIsDashToDock()) { - // ensure or position variables are updated - ControlsManagerCommon._updatePositionFromDashToDock(); - // Dash to Dock also always affects workAreaBox - Main.layoutManager._trackedActors.forEach(actor => { - if (actor.affectsStruts && actor.actor.width === dash.width) { - if (dash._isHorizontal) { - // disabled inteli-hide don't needs compensation - // startY needs to be corrected in allocate() - if (dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled) - height += dash.height; - } else { - width += dash.width; - } - } - }); - } + let [width, height] = this._workAreaBoxForVShellConfig.get_size(); + const startX = this._workAreaBoxForVShellConfig.x1; + const startY = this._workAreaBoxForVShellConfig.y1; - let wWidth; - let wHeight; - let wsBoxY; + let wsBoxWidth, wsBoxHeight, wsBoxY, wsBoxX; switch (state) { case ControlsState.HIDDEN: - // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering - // therefore we added panel height to startY for the overview allocation, - // but here we need to remove the correction because the panel will be in the hidden state - if (opt.START_Y_OFFSET) { - let [x, y] = workAreaBox.get_origin(); - y -= opt.START_Y_OFFSET; - workspaceBox.set_origin(x, y); - } else { - workspaceBox.set_origin(...workAreaBox.get_origin()); - } - workspaceBox.set_size(...workAreaBox.get_size()); + workspaceBox.set_origin(...this._workAreaBox.get_origin()); + workspaceBox.set_size(...this._workAreaBox.get_size()); break; case ControlsState.WINDOW_PICKER: case ControlsState.APP_GRID: if (opt.WS_ANIMATION && opt.SHOW_WS_TMB && state === ControlsState.APP_GRID) { workspaceBox.set_origin(...this._workspacesThumbnails.get_position()); - workspaceBox.set_size(thumbnailsWidth, thumbnailsHeight); + workspaceBox.set_size(wsTmbWidth, wsTmbHeight); } else if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) { - if (opt.START_Y_OFFSET) { - let [x, y] = workAreaBox.get_origin(); - y -= opt.START_Y_OFFSET; - workspaceBox.set_origin(x, y); - } else { - workspaceBox.set_origin(...workAreaBox.get_origin()); - } - workspaceBox.set_size(...workAreaBox.get_size()); + workspaceBox.set_origin(...this._workAreaBox.get_origin()); + workspaceBox.set_size(...this._workAreaBox.get_size()); } else { - // if PANEL_OVERVIEW_ONLY, panel doesn't affect workArea height (affectStruts === false), it is necessary to compensate - height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height; - searchHeight = opt.SHOW_SEARCH_ENTRY ? searchHeight : 0; - wWidth = width - - (opt.DASH_VERTICAL ? dashWidth : 0) - - thumbnailsWidth - - 4 * spacing; - wHeight = height - - (opt.DASH_VERTICAL ? 0 : dashHeight) - - searchHeight - - 4 * spacing; + wsBoxWidth = width - leftBoxOffset - rightBoxOffset; + wsBoxHeight = height - topBoxOffset - bottomBoxOffset; const ratio = width / height; - let wRatio = wWidth / wHeight; + let wRatio = wsBoxWidth / wsBoxHeight; let scale = ratio / wRatio; if (scale > 1) { - wHeight /= scale; - wWidth = wHeight * ratio; + wsBoxHeight /= scale; + wsBoxWidth = wsBoxHeight * ratio; } else { - wWidth *= scale; - wHeight = wWidth / ratio; + wsBoxWidth *= scale; + wsBoxHeight = wsBoxWidth / ratio; } - // height decides the actual size, ratio is given by the workarea - wHeight *= opt.WS_PREVIEW_SCALE; - wWidth *= opt.WS_PREVIEW_SCALE; + // height decides the actual size, ratio is given by the workArea + wsBoxHeight = Math.round(wsBoxHeight * opt.WS_PREVIEW_SCALE); + wsBoxWidth = Math.round(wsBoxWidth * opt.WS_PREVIEW_SCALE); let xOffset = 0; let yOffset = 0; - const yOffsetT = (opt.DASH_TOP ? dashHeight : 0) + searchHeight; - const yOffsetB = opt.DASH_BOTTOM ? dashHeight : 0; - const yAvailableSpace = (height - yOffsetT - wHeight - yOffsetB) / 2; - yOffset = yOffsetT + yAvailableSpace; + const yAvailableSpace = Math.round((height - topBoxOffset - wsBoxHeight - bottomBoxOffset) / 2); + yOffset = topBoxOffset + yAvailableSpace; - const centeredBoxX = (width - wWidth) / 2; - - const xOffsetL = (opt.DASH_LEFT ? dashWidth : 0) + (opt.WS_TMB_LEFT ? thumbnailsWidth : 0) + 2 * spacing; - const xOffsetR = (opt.DASH_RIGHT ? dashWidth : 0) + (opt.WS_TMB_RIGHT ? thumbnailsWidth : 0) + 2 * spacing; + const centeredBoxX = Math.round((width - wsBoxWidth) / 2); this._xAlignCenter = false; - if (centeredBoxX < Math.max(xOffsetL, xOffsetR)) { - xOffset = xOffsetL + spacing + (width - xOffsetL - wWidth - xOffsetR - 2 * spacing) / 2; + if (centeredBoxX < centeredBoxOffset) { + xOffset = Math.round(leftBoxOffset + (width - leftBoxOffset - wsBoxWidth - rightBoxOffset) / 2); } else { xOffset = centeredBoxX; this._xAlignCenter = true; } - const wsBoxX = /* startX + */xOffset; + wsBoxX = startX + xOffset; wsBoxY = startY + yOffset; - workspaceBox.set_origin(Math.round(wsBoxX), Math.round(wsBoxY)); - workspaceBox.set_size(Math.round(wWidth), Math.round(wHeight)); + workspaceBox.set_origin(wsBoxX, wsBoxY); + workspaceBox.set_size(wsBoxWidth, wsBoxHeight); } } return workspaceBox; }, - _getAppDisplayBoxForState(state, box, workAreaBox, searchHeight, dashWidth, dashHeight, thumbnailsWidth, startY) { - // in case the function is called from the DtD - if (startY === undefined) - workAreaBox = box; - - const [width] = box.get_size(); - const { x1: startX } = workAreaBox; - // const { y1: startY } = workAreaBox; - let height = workAreaBox.get_height(); + _getAppDisplayBoxForState(state, box, leftBoxOffset, rightBoxOffset, topBoxOffset, bottomBoxOffset) { const appDisplayBox = new Clutter.ActorBox(); - const spacing = 12; - searchHeight = opt.SHOW_SEARCH_ENTRY ? searchHeight : 0; - - const xOffsetL = (opt.WS_TMB_LEFT ? thumbnailsWidth : 0) + (opt.DASH_LEFT ? dashWidth : 0); - const xOffsetR = (opt.WS_TMB_RIGHT ? thumbnailsWidth : 0) + (opt.DASH_RIGHT ? dashWidth : 0); - const yOffsetT = (opt.DASH_TOP ? dashHeight : 0) + (opt.SHOW_SEARCH_ENTRY ? searchHeight : 0); - const yOffsetB = opt.DASH_BOTTOM ? dashHeight : 0; - const adWidth = opt.CENTER_APP_GRID ? width - 2 * Math.max(xOffsetL, xOffsetR) - 2 * spacing : width - xOffsetL - xOffsetR - 2 * spacing; - const adHeight = height - yOffsetT - yOffsetB; - - const appDisplayX = opt.CENTER_APP_GRID ? (width - adWidth) / 2 : xOffsetL + 2 * spacing; - const appDisplayY = startY + yOffsetT; + const startX = this._workAreaBoxForVShellConfig.x1; + const startY = this._workAreaBoxForVShellConfig.y1; + let [width, height] = this._workAreaBoxForVShellConfig.get_size(); + const centeredBoxOffset = Math.max(leftBoxOffset, rightBoxOffset); + + const adWidth = opt.CENTER_APP_GRID + ? width - 2 * centeredBoxOffset + : width - leftBoxOffset - rightBoxOffset; + const adHeight = height - topBoxOffset - bottomBoxOffset; + + const appDisplayX = startX + + (opt.CENTER_APP_GRID + ? Math.round((width - adWidth) / 2) + : leftBoxOffset + ); + const appDisplayY = startY + topBoxOffset; switch (state) { case ControlsState.HIDDEN: @@ -1076,73 +1141,64 @@ const ControlsManagerLayoutVertical = { // 1 - left, 2 - right, 3 - bottom, 5 - top switch (opt.APP_GRID_ANIMATION) { case 0: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY)); + appDisplayBox.set_origin(appDisplayX, appDisplayY); break; case 1: - appDisplayBox.set_origin(Math.round(startX + width), Math.round(appDisplayY)); + appDisplayBox.set_origin(startX + width, appDisplayY); break; case 2: - appDisplayBox.set_origin(Math.round(startX - adWidth), Math.round(appDisplayY)); + appDisplayBox.set_origin(box.x1 - adWidth, appDisplayY); break; case 3: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y2)); + appDisplayBox.set_origin(appDisplayX, box.y2); break; case 5: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y1 - adHeight)); + appDisplayBox.set_origin(appDisplayX, box.y1 - adHeight); break; } break; case ControlsState.APP_GRID: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY)); + appDisplayBox.set_origin(appDisplayX, appDisplayY); break; } - appDisplayBox.set_size(Math.round(adWidth), Math.round(adHeight)); + appDisplayBox.set_size(adWidth, adHeight); return appDisplayBox; }, vfunc_allocate(container, box) { const childBox = new Clutter.ActorBox(); + const startX = this._workAreaBoxForVShellConfig.x1; + const startY = this._workAreaBoxForVShellConfig.y1; + let [width, height] = this._workAreaBoxForVShellConfig.get_size(); + const transitionParams = this._stateAdjustment.getStateTransitionParams(); - const spacing = 12; - const halfSpacing = spacing / 2; - const monitor = Main.layoutManager.findMonitorForActor(this._container); - const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index); - const startX = workArea.x - monitor.x; - // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering - // therefore we need to add panel height to startY - let startY = workArea.y - monitor.y + opt.START_Y_OFFSET; - const workAreaBox = new Clutter.ActorBox(); - workAreaBox.set_origin(startX, startY); - workAreaBox.set_size(workArea.width, workArea.height); - box.y1 += startY; - box.x1 += startX; - let [width, height] = box.get_size(); - // if panel is at bottom position, - // compensate the height of the available box (the box size is calculated for top panel) - height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height; - let availableHeight = height; + const spacing = opt.SPACING; // Dash - const maxDashHeight = box.get_height() * DASH_MAX_SIZE_RATIO; - const maxDashWidth = maxDashHeight * 0.8; + const maxDashHeight = Math.round(box.get_height() * DASH_MAX_SIZE_RATIO); + const maxDashWidth = Math.round(maxDashHeight * 0.8); let dashHeight = 0; let dashWidth = 0; // dash cloud be overridden by the Dash to Dock clone - const dash = Main.overview.dash; if (Me.Util.dashIsDashToDock()) { - // ensure our position variables are updated - ControlsManagerCommon._updatePositionFromDashToDock(); - // if Dash to Dock replaced the default dash and its inteli-hide is disabled we need to compensate for affected startY - if (!Main.overview.dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled) { - if (Main.panel.y === monitor.y) - startY = Main.panel.height + spacing; + this._updatePositionFromDashToDock(); + // If DtD affects workArea, dash size needs to be 0 + spacing + const dash = Main.overview.dash; + if (this._dashToDockAffectsWorkArea()) { + if (opt.DASH_VERTICAL) + dashWidth = spacing; + else + dashHeight = spacing; + } else { + dashHeight = dash.height; + dashWidth = dash.width; + if (opt.DASH_VERTICAL) + dashWidth += spacing; + else + dashHeight += spacing; } - dashHeight = dash.height; - dashWidth = dash.width; - opt.DASH_VERTICAL = [1, 3].includes(dash._position); - this._dash.allocate(childBox); } else if (this._dash.visible) { // default dock if (opt.DASH_VERTICAL) { @@ -1164,40 +1220,42 @@ const ControlsManagerLayoutVertical = { let wsTmbWidth = 0; let wsTmbHeight = 0; - let maxWsTmbScale = opt.MAX_THUMBNAIL_SCALE; if (opt.SHOW_WS_TMB) { - const dashHeightReservation = !opt.WS_TMB_FULL && !opt.DASH_VERTICAL ? dashHeight : 0; - const searchActive = this._searchController.searchActive; - if (!opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive) { + let maxWsTmbScale = this._dash.showAppsButton.checked && !(searchActive && !opt.SEARCH_APP_GRID_MODE) + ? opt.MAX_THUMBNAIL_SCALE_APPGRID + : opt.MAX_THUMBNAIL_SCALE; + if (transitionParams.currentState % 1 && !opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive && !opt.LEAVING_SEARCH) { const initState = transitionParams.initialState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE; const finalState = transitionParams.finalState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE; maxWsTmbScale = Util.lerp(initState, finalState, transitionParams.progress); } + wsTmbWidth = Math.round(width * maxWsTmbScale); - wsTmbWidth = width * maxWsTmbScale; let totalTmbSpacing; [totalTmbSpacing, wsTmbHeight] = this._workspacesThumbnails.get_preferred_height(wsTmbWidth); wsTmbHeight += totalTmbSpacing; - const wsTmbHeightMax = opt.WS_TMB_FULL - ? height - spacing - : height - dashHeightReservation - 2 * spacing; + const wstTopOffset = !opt.WS_TMB_FULL && opt.DASH_TOP ? dashHeight : spacing; + const wstBottomOffset = !opt.WS_TMB_FULL && opt.DASH_BOTTOM ? dashHeight : spacing; + const wstLeftOffset = opt.DASH_LEFT ? dashWidth : spacing; + const wstRightOffset = opt.DASH_RIGHT ? dashWidth : spacing; + + const wsTmbHeightMax = height - wstTopOffset - wstBottomOffset; + // Reduce size to fit wsTmb to the screen if (wsTmbHeight > wsTmbHeightMax) { wsTmbHeight = wsTmbHeightMax; - wsTmbWidth = Math.round(this._workspacesThumbnails.get_preferred_width(wsTmbHeight)[1]); + wsTmbWidth = this._workspacesThumbnails.get_preferred_width(wsTmbHeight)[1]; } - let wsTmbX; - if (opt.WS_TMB_RIGHT) - wsTmbX = Math.round(startX + width - (opt.DASH_RIGHT ? dashWidth : 0) - wsTmbWidth /* - halfSpacing*/); // this halfSpacing is a part od dash style - else - wsTmbX = Math.round(opt.DASH_LEFT ? dashWidth : 0/* + halfSpacing*/); // this halfSpacing is a part od dash style + let wsTmbX = opt.WS_TMB_LEFT + ? startX + wstLeftOffset + : startX + width - wstRightOffset - wsTmbWidth; - let wstOffset = (height - wsTmbHeight - (opt.DASH_VERTICAL ? 0 : dashHeightReservation)) / 2; - wstOffset -= opt.WS_TMB_POSITION_ADJUSTMENT * (wstOffset - halfSpacing); - let wsTmbY = Math.round(startY + (dashHeightReservation && opt.DASH_TOP ? dashHeight : 0) + wstOffset); + let offset = (height - wstTopOffset - wsTmbHeight - wstBottomOffset) / 2; + offset = Math.round(offset - (opt.WS_TMB_POSITION_ADJUSTMENT * offset)); + const wsTmbY = startY + wstTopOffset + offset; childBox.set_origin(wsTmbX, wsTmbY); childBox.set_size(Math.max(wsTmbWidth, 1), Math.max(wsTmbHeight, 1)); @@ -1215,50 +1273,72 @@ const ControlsManagerLayoutVertical = { dashWidth = Math.min(dashWidth, wMaxWidth); } - let dashX, dashY, offset; - if (opt.DASH_RIGHT) - dashX = width - dashWidth; - else if (opt.DASH_LEFT) - dashX = 0; - - else if (opt.DASH_TOP) - dashY = startY; - else - dashY = startY + height - dashHeight; + let dashX = opt.DASH_RIGHT ? width - dashWidth : 0; + let dashY = opt.DASH_TOP ? startY : startY + height - dashHeight; if (!opt.DASH_VERTICAL) { - offset = (width - ((opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && !this._xAlignCenter ? wsTmbWidth : 0) - dashWidth) / 2; - offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing); - dashX = offset; - - if ((opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && !this._xAlignCenter) { - if (!opt.WS_TMB_RIGHT) { - dashX = (wsTmbWidth ? wsTmbWidth : 0) + offset; - dashX = Math.max(dashX, wsTmbWidth ? wsTmbWidth + spacing : 0); - dashX = Math.min(dashX, width - dashWidth - spacing); - } - } - if (opt.WS_TMB_FULL && !opt.CENTER_DASH_WS) { - dashX = opt.WS_TMB_RIGHT - ? Math.min(width - wsTmbWidth - dashWidth, dashX + wsTmbWidth / 2 * (1 - Math.abs(opt.DASH_POSITION_ADJUSTMENT))) - : Math.max(wsTmbWidth, dashX - wsTmbWidth / 2 * (1 - Math.abs(opt.DASH_POSITION_ADJUSTMENT))); - } + const dashLeftOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_LEFT ? wsTmbWidth + spacing : 0; + const dashRightOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_RIGHT ? wsTmbWidth + spacing : 0; + let offset = (width - dashWidth - (opt.CENTER_DASH_WS && !this._xAlignCenter ? dashLeftOffset + dashRightOffset : 0)) / 2; + offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - spacing); + dashX = startX + (opt.CENTER_DASH_WS ? dashLeftOffset : 0) + offset; + if (opt.WS_TMB_FULL) // Limit the adjustment while keeping the center of adjustment on the screen center + dashX = Math.clamp(startX + dashLeftOffset + spacing, dashX, startX + width - dashRightOffset - spacing - dashWidth); } else { - offset = (height - dashHeight) / 2; - dashY = startY + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing)); + const offset = (height - dashHeight) / 2; + dashY = startY + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - spacing)); } + dashY = Math.round(dashY); - childBox.set_origin(Math.round(startX + dashX), Math.round(dashY)); - childBox.set_size(Math.round(dashWidth), Math.round(dashHeight)); + childBox.set_origin(startX + dashX, dashY); + childBox.set_size(dashWidth, dashHeight); this._dash.allocate(childBox); } - availableHeight -= opt.DASH_VERTICAL ? 0 : dashHeight + spacing; + // View box offsets + const leftBoxOffset = (opt.DASH_LEFT ? dashWidth : spacing) + (opt.WS_TMB_LEFT ? wsTmbWidth + spacing : 0); + const rightBoxOffset = (opt.DASH_RIGHT ? dashWidth : spacing) + (opt.WS_TMB_RIGHT ? wsTmbWidth + spacing : 0); + let topBoxOffset = (opt.DASH_TOP ? dashHeight : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0); + const bottomBoxOffset = (opt.DASH_BOTTOM ? dashHeight : spacing) + (opt.WS_TMB_BOTTOM ? wsTmbHeight + spacing : 0); + const centeredBoxOffset = Math.max(leftBoxOffset, rightBoxOffset); + + // App grid needs to be calculated for the max wsTmbWidth in app grid, independently on the current wsTmb scale + const wsTmbWidthAppGrid = Math.round(width * opt.MAX_THUMBNAIL_SCALE_APPGRID); + const leftBoxOffsetAppGrid = (opt.DASH_LEFT ? dashWidth : spacing) + (opt.WS_TMB_LEFT ? wsTmbWidthAppGrid + spacing : 0); + const rightBoxOffsetAppGrid = (opt.DASH_RIGHT ? dashWidth : spacing) + (opt.WS_TMB_RIGHT ? wsTmbWidthAppGrid + spacing : 0); + + // searchEntry + const [searchEntryHeight] = this._searchEntry.get_preferred_height(width - wsTmbWidth); + const searchEntryY = startY + topBoxOffset; + + const searchX = startX + + (opt.CENTER_SEARCH_VIEW || this._xAlignCenter + ? centeredBoxOffset + : leftBoxOffset); // xAlignCenter is set by wsBox + + const searchWidth = + width - (opt.CENTER_SEARCH_VIEW || this._xAlignCenter + ? 2 * centeredBoxOffset + : leftBoxOffset + rightBoxOffset); + + childBox.set_origin(searchX, searchEntryY); + childBox.set_size(searchWidth, searchEntryHeight); - let [searchHeight] = this._searchEntry.get_preferred_height(width - wsTmbWidth); + this._searchEntry.allocate(childBox); + + // searchResults + const searchY = startY + topBoxOffset + searchEntryHeight + spacing; + const searchHeight = height - topBoxOffset - bottomBoxOffset - searchEntryHeight - 2 * spacing; + + childBox.set_origin(searchX, searchY); + childBox.set_size(searchWidth, searchHeight); + this._searchController.allocate(childBox); - // Workspaces - let params = [box, workAreaBox, dashWidth, dashHeight, wsTmbWidth, wsTmbHeight, searchHeight, startY]; + // Add searchEntry height if needed + topBoxOffset += opt.SHOW_SEARCH_ENTRY ? searchEntryHeight + spacing : 0; + + // workspace + let params = [box, wsTmbWidth, wsTmbHeight, leftBoxOffset, rightBoxOffset, topBoxOffset, bottomBoxOffset, centeredBoxOffset]; // Update cached boxes for (const state of Object.values(ControlsState)) { @@ -1278,38 +1358,14 @@ const ControlsManagerLayoutVertical = { this._workspacesDisplay.allocate(workspacesBox); - // Search entry - const searchXoffset = (opt.DASH_LEFT ? dashWidth : 0) + spacing + (opt.WS_TMB_RIGHT ? 0 : wsTmbWidth + spacing); - - // Y position under top Dash - let searchEntryX, searchEntryY; - if (opt.DASH_TOP) - searchEntryY = startY + dashHeight; - else - searchEntryY = startY; - - searchEntryX = searchXoffset; - let searchWidth = width - 2 * spacing - wsTmbWidth - (opt.DASH_VERTICAL ? dashWidth : 0); // xAlignCenter is given by wsBox - searchWidth = this._xAlignCenter ? width - 2 * (wsTmbWidth + spacing) : searchWidth; - - if (opt.CENTER_SEARCH_VIEW) { - childBox.set_origin(0, Math.round(searchEntryY)); - childBox.set_size(Math.round(width), Math.round(searchHeight)); - } else { - childBox.set_origin(Math.round(this._xAlignCenter ? 0 : searchEntryX), Math.round(searchEntryY)); - childBox.set_size(Math.round(this._xAlignCenter ? width : searchWidth - spacing), Math.round(searchHeight)); - } - - this._searchEntry.allocate(childBox); - - availableHeight -= searchHeight + spacing; - - // if (this._appDisplay.visible)... ? Can cause problems - // Calculate appDisplay always for AppGrid state WsTmb scale - let wsTmbWidthAppGrid = opt.MAX_THUMBNAIL_SCALE_APPGRID > 0 - ? wsTmbWidth / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE_APPGRID - : wsTmbWidth / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE; - params = [box, workAreaBox, searchHeight, dashWidth, dashHeight, wsTmbWidthAppGrid, startY]; // send startY, can be corrected + // appDisplay + params = [ + box, + leftBoxOffsetAppGrid, + rightBoxOffsetAppGrid, + topBoxOffset, + bottomBoxOffset, + ]; let appDisplayBox; if (!transitionParams.transitioning) { appDisplayBox = @@ -1324,240 +1380,48 @@ const ControlsManagerLayoutVertical = { } this._appDisplay.allocate(appDisplayBox); - // Search - if (opt.CENTER_SEARCH_VIEW) { - const dashW = (opt.DASH_VERTICAL ? dashWidth : 0) + spacing; - searchWidth = width - 2 * wsTmbWidth - 2 * dashW; - childBox.set_origin(Math.round(wsTmbWidth + dashW), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + searchHeight)); - } else { - childBox.set_origin(Math.round(this._xAlignCenter ? wsTmbWidth + spacing : searchXoffset), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + searchHeight)); - } - - childBox.set_size(Math.round(searchWidth), Math.round(availableHeight)); - this._searchController.allocate(childBox); - this._runPostAllocation(); }, }; const ControlsManagerLayoutHorizontal = { - _computeWorkspacesBoxForState(state, box, workAreaBox, dashWidth, dashHeight, thumbnailWidth, thumbnailsHeight, searchHeight, startY) { - // in case the function is called from the DtD - if (startY === undefined) - workAreaBox = box; - - const workspaceBox = box.copy(); - let [width, height] = workspaceBox.get_size(); - const spacing = 12; - - const dash = Main.overview.dash; - // including Dash to Dock and clones properties for compatibility - if (Me.Util.dashIsDashToDock()) { - // ensure our position variables are updated - ControlsManagerCommon._updatePositionFromDashToDock(); - // Dash to Dock always affects workAreaBox - Main.layoutManager._trackedActors.forEach(actor => { - if (actor.affectsStruts && actor.actor.width === dash.width) { - if (dash._isHorizontal) { - // disabled inteli-hide don't need compensation - // startY needs to be corrected in allocate() - if (dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled) - height += dash.height; - else if (opt.DASH_TOP) - height += dash.height; - } else { - width += dash.width; - } - } - }); - } - - let wWidth, wHeight, wsBoxY, wsBoxX; + _computeWorkspacesBoxForState: ControlsManagerLayoutVertical._computeWorkspacesBoxForState, - switch (state) { - case ControlsState.HIDDEN: - // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering - // therefore we added panel height to startY for the overview allocation, - // but here we need to remove the correction since the panel will be in the hidden state - if (opt.START_Y_OFFSET) { - let [x, y] = workAreaBox.get_origin(); - y -= opt.START_Y_OFFSET; - workspaceBox.set_origin(x, y); - } else { - workspaceBox.set_origin(...workAreaBox.get_origin()); - } - workspaceBox.set_size(...workAreaBox.get_size()); - break; - case ControlsState.WINDOW_PICKER: - case ControlsState.APP_GRID: - if (opt.WS_ANIMATION && opt.SHOW_WS_TMB && state === ControlsState.APP_GRID) { - workspaceBox.set_origin(...this._workspacesThumbnails.get_position()); - workspaceBox.set_size(thumbnailWidth, thumbnailsHeight); - } else if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) { - if (opt.START_Y_OFFSET) { - let [x, y] = workAreaBox.get_origin(); - y -= opt.START_Y_OFFSET; - workspaceBox.set_origin(x, y); - } else { - workspaceBox.set_origin(...workAreaBox.get_origin()); - } - workspaceBox.set_size(...workAreaBox.get_size()); - } else { - // if PANEL_OVERVIEW_ONLY, panel doesn't affect workArea height (affectStruts === false), it is necessary to compensate - height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height; - searchHeight = opt.SHOW_SEARCH_ENTRY ? searchHeight : 0; - wWidth = width - - spacing - - (opt.DASH_VERTICAL ? dashWidth : 0) - - 4 * spacing; - wHeight = height - - (opt.DASH_VERTICAL ? spacing : dashHeight) - - thumbnailsHeight - - searchHeight - - 4 * spacing; - - const ratio = width / height; - let wRatio = wWidth / wHeight; - let scale = ratio / wRatio; - - if (scale > 1) { - wHeight /= scale; - wWidth = wHeight * ratio; - } else { - wWidth *= scale; - wHeight = wWidth / ratio; - } - - // height decides the actual size, ratio is given by the workarea - wHeight *= opt.WS_PREVIEW_SCALE; - wWidth *= opt.WS_PREVIEW_SCALE; - - let xOffset = 0; - let yOffset = 0; - - const yOffsetT = (opt.DASH_TOP ? dashHeight : 0) + (opt.WS_TMB_TOP ? thumbnailsHeight : 0) + searchHeight; - const yOffsetB = (opt.DASH_BOTTOM ? dashHeight : 0) + (opt.WS_TMB_BOTTOM ? thumbnailsHeight : 0); - - const yAvailableSpace = (height - yOffsetT - wHeight - yOffsetB) / 2; - yOffset = yOffsetT + yAvailableSpace; - - const xOffsetL = (opt.DASH_LEFT ? dashWidth : 0) + spacing; - const xOffsetR = (opt.DASH_RIGHT ? dashWidth : 0) + spacing; - const centeredBoxX = (width - wWidth) / 2; - - this._xAlignCenter = false; - if (centeredBoxX < Math.max(xOffsetL, xOffsetR)) { - xOffset = xOffsetL + spacing + (width - xOffsetL - wWidth - xOffsetR) / 2; - } else { - xOffset = centeredBoxX; - this._xAlignCenter = true; - } - - wsBoxX = /* startX + */xOffset; - wsBoxY = startY + yOffset; - workspaceBox.set_origin(Math.round(wsBoxX), Math.round(wsBoxY)); - workspaceBox.set_size(Math.round(wWidth), Math.round(wHeight)); - } - } - - return workspaceBox; - }, - - _getAppDisplayBoxForState(state, box, workAreaBox, searchHeight, dashWidth, dashHeight, thumbnailsHeight, startY) { - // in case the function is called from the DtD - if (startY === undefined) { - workAreaBox = box; - } - const [width] = box.get_size(); - const { x1: startX } = workAreaBox; - // const { y1: startY } = workAreaBox; - let height = workAreaBox.get_height(); - const appDisplayBox = new Clutter.ActorBox(); - const spacing = 12; - - const yOffsetT = (opt.WS_TMB_TOP ? thumbnailsHeight + spacing : 0) + (opt.DASH_TOP ? dashHeight : 0) + (opt.SHOW_SEARCH_ENTRY ? searchHeight : 0); - const yOffsetB = (opt.WS_TMB_BOTTOM ? thumbnailsHeight + spacing : 0) + (opt.DASH_BOTTOM ? dashHeight : 0); - const xOffsetL = opt.DASH_LEFT ? dashWidth : 0; - const xOffsetR = opt.DASH_RIGHT ? dashWidth : 0; - const hSpacing = xOffsetL + xOffsetR ? spacing : 0; - const adWidth = opt.CENTER_APP_GRID ? width - 2 * Math.max(xOffsetL, xOffsetR) - 2 * hSpacing : width - xOffsetL - xOffsetR - 2 * hSpacing; - const adHeight = height - yOffsetT - yOffsetB; - - const appDisplayX = opt.CENTER_APP_GRID ? (width - adWidth) / 2 : xOffsetL + hSpacing; - const appDisplayY = startY + yOffsetT; - - switch (state) { - case ControlsState.HIDDEN: - case ControlsState.WINDOW_PICKER: - // 1 - left, 2 - right, 3 - bottom, 5 - top - switch (opt.APP_GRID_ANIMATION) { - case 0: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY)); - break; - case 1: - appDisplayBox.set_origin(Math.round(startX + width), Math.round(appDisplayY)); - break; - case 2: - appDisplayBox.set_origin(Math.round(startX - adWidth), Math.round(appDisplayY)); - break; - case 3: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y2)); - break; - case 5: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y1 - adHeight)); - break; - } - break; - case ControlsState.APP_GRID: - appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY)); - break; - } - - appDisplayBox.set_size(Math.round(adWidth), Math.round(adHeight)); - return appDisplayBox; - }, + _getAppDisplayBoxForState: ControlsManagerLayoutVertical._getAppDisplayBoxForState, vfunc_allocate(container, box) { - const transitionParams = this._stateAdjustment.getStateTransitionParams(); const childBox = new Clutter.ActorBox(); - const spacing = 12; - const halfSpacing = spacing / 2; - const monitor = Main.layoutManager.findMonitorForActor(this._container); - const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index); - const startX = workArea.x - monitor.x; - // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering - // therefore we need to add panel height to startY - let startY = workArea.y - monitor.y + opt.START_Y_OFFSET; - const workAreaBox = new Clutter.ActorBox(); - workAreaBox.set_origin(startX, startY); - workAreaBox.set_size(workArea.width, workArea.height); - box.y1 += startY; - box.x1 += startX; - let [width, height] = box.get_size(); - // if panel is at bottom position, - // compensate for the height of the available box (the box size is calculated for top panel) - height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height; - let availableHeight = height; + const startX = this._workAreaBoxForVShellConfig.x1; + const startY = this._workAreaBoxForVShellConfig.y1; + let [width, height] = this._workAreaBoxForVShellConfig.get_size(); + + const transitionParams = this._stateAdjustment.getStateTransitionParams(); + const spacing = opt.SPACING; // Dash - const maxDashHeight = box.get_height() * DASH_MAX_SIZE_RATIO; - const maxDashWidth = maxDashHeight * 0.8; + const maxDashHeight = Math.round(box.get_height() * DASH_MAX_SIZE_RATIO); + const maxDashWidth = Math.round(maxDashHeight * 0.8); let dashHeight = 0; let dashWidth = 0; // dash cloud be overridden by the Dash to Dock clone - const dash = Main.overview.dash; if (Me.Util.dashIsDashToDock()) { - // if Dash to Dock replaced the default dash and its inteli-hide is disabled we need to compensate for affected startY - if (!Main.overview.dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled) { - // if (Main.panel.y === monitor.y) - // startY = Main.panel.height + spacing; + this._updatePositionFromDashToDock(); + // If DtD affects workArea, dash size needs to be 0 + const dash = Main.overview.dash; + if (this._dashToDockAffectsWorkArea()) { + if (opt.DASH_VERTICAL) + dashWidth = spacing; + else + dashHeight = spacing; + } else { + dashHeight = dash.height; + dashWidth = dash.width; + if (opt.DASH_VERTICAL) + dashWidth += spacing; + else + dashHeight += spacing; } - dashHeight = dash.height + halfSpacing; - dashWidth = dash.width; - opt.DASH_TOP = dash._position === 0; - opt.DASH_VERTICAL = [1, 3].includes(dash._position); - this._dash.allocate(childBox); } else if (this._dash.visible) { // default dock if (!opt.DASH_VERTICAL) { @@ -1575,57 +1439,52 @@ const ControlsManagerLayoutHorizontal = { } } - let [searchHeight] = this._searchEntry.get_preferred_height(width); + const [searchEntryHeight] = this._searchEntry.get_preferred_height(width); // Workspace Thumbnails let wsTmbWidth = 0; let wsTmbHeight = 0; - let maxWsTmbScale = opt.MAX_THUMBNAIL_SCALE; if (opt.SHOW_WS_TMB) { - const dashWidthReservation = !opt.WS_TMB_FULL && opt.DASH_VERTICAL ? dashWidth : 0; - const searchActive = this._searchController.searchActive; - if (!opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive) { + let maxWsTmbScale = this._dash.showAppsButton.checked && !(searchActive && !opt.SEARCH_APP_GRID_MODE) + ? opt.MAX_THUMBNAIL_SCALE_APPGRID + : opt.MAX_THUMBNAIL_SCALE; + if (transitionParams.currentState % 1 && !opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive && !opt.LEAVING_SEARCH) { const initState = transitionParams.initialState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE; const finalState = transitionParams.finalState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE; maxWsTmbScale = Util.lerp(initState, finalState, transitionParams.progress); } wsTmbHeight = Math.round(height * maxWsTmbScale); + let totalTmbSpacing; [totalTmbSpacing, wsTmbWidth] = this._workspacesThumbnails.get_preferred_width(wsTmbHeight); wsTmbWidth += totalTmbSpacing; - const wsTmbWidthMax = opt.WS_TMB_FULL - ? width - spacing - : width - dashWidthReservation - 2 * spacing; + const wstLeftOffset = !opt.WS_TMB_FULL && opt.DASH_LEFT ? dashWidth : spacing; + const wstRightOffset = !opt.WS_TMB_FULL && opt.DASH_RIGHT ? dashWidth : spacing; + const wstTopOffset = opt.DASH_TOP ? dashHeight : spacing; + const wstBottomOffset = opt.DASH_BOTTOM ? dashHeight : spacing; + const wsTmbWidthMax = width - wstLeftOffset - wstRightOffset; + // Reduce size to fit wsTmb to the screen if (wsTmbWidth > wsTmbWidthMax) { wsTmbWidth = wsTmbWidthMax; - wsTmbHeight = Math.round(this._workspacesThumbnails.get_preferred_height(wsTmbWidth)[1]); + wsTmbHeight = this._workspacesThumbnails.get_preferred_height(wsTmbWidth)[1]; } - let wsTmbY; - if (opt.WS_TMB_TOP) - wsTmbY = Math.round(startY + (opt.DASH_TOP ? dashHeight : halfSpacing)); - else - wsTmbY = Math.round(startY + height - (opt.DASH_BOTTOM ? dashHeight : halfSpacing) - wsTmbHeight); + let wsTmbY = opt.WS_TMB_TOP + ? startY + wstTopOffset + : startY + height - wstBottomOffset - wsTmbHeight; - let wstOffset = (width - wsTmbWidth) / 2; - wstOffset -= opt.WS_TMB_POSITION_ADJUSTMENT * wstOffset; - let wsTmbX = Math.round(startX + wstOffset); - if (opt.DASH_LEFT) - wsTmbX = Math.max(wsTmbX, startX + dashWidthReservation); - else if (opt.DASH_RIGHT) - wsTmbX = Math.min(wsTmbX, startX + width - wsTmbWidth - dashWidthReservation); + let offset = (width - wstLeftOffset - wsTmbWidth - wstRightOffset) / 2; + offset = Math.round(offset - (opt.WS_TMB_POSITION_ADJUSTMENT * offset)); + const wsTmbX = startX + wstLeftOffset + offset; childBox.set_origin(wsTmbX, wsTmbY); childBox.set_size(Math.max(wsTmbWidth, 1), Math.max(wsTmbHeight, 1)); - this._workspacesThumbnails.allocate(childBox); - - availableHeight -= wsTmbHeight + spacing; } if (this._dash.visible) { @@ -1638,45 +1497,80 @@ const ControlsManagerLayoutHorizontal = { dashHeight = Math.min(dashHeight, wMaxHeight); } - let dashX, dashY, offset; - if (opt.DASH_RIGHT) - dashX = width - dashWidth; - else if (opt.DASH_LEFT) - dashX = 0; - else if (opt.DASH_TOP) - dashY = startY; - else - dashY = startY + height - dashHeight; + let dashX = opt.DASH_RIGHT ? width - dashWidth : 0; + let dashY = opt.DASH_TOP ? startY : startY + height - dashHeight; if (opt.DASH_VERTICAL) { - if (opt.WS_TMB_FULL) { - offset = (height - dashHeight - wsTmbHeight) / 2; - if (opt.WS_TMB_TOP) { - offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing); - dashY = startY + offset + wsTmbHeight; - } else { - offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing); - dashY = startY + offset; - } - } else { - offset = (height - dashHeight) / 2; - offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing); - dashY = startY + offset; - } + const dashTopOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0; + const dashBottomOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_BOTTOM ? wsTmbHeight + spacing : 0; + let offset = (height - dashHeight - (opt.CENTER_DASH_WS ? dashTopOffset + dashBottomOffset : 0)) / 2; + offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - spacing); + dashY = startY + (opt.CENTER_DASH_WS ? dashTopOffset : 0) + offset; + if (opt.WS_TMB_FULL) // Limit the adjustment while keeping the center of adjustment on the screen center + dashY = Math.clamp(startY + dashTopOffset + spacing, dashY, startY + height - dashBottomOffset - spacing - dashHeight); } else { - offset = (width - dashWidth) / 2; - dashX = startX + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing)); + const offset = (width - dashWidth) / 2; + dashX = startX + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - spacing)); } + dashX = Math.round(dashX); - childBox.set_origin(Math.round(startX + dashX), Math.round(dashY)); - childBox.set_size(Math.round(dashWidth), Math.round(dashHeight)); + childBox.set_origin(startX + dashX, dashY); + childBox.set_size(dashWidth, dashHeight); this._dash.allocate(childBox); } - availableHeight -= opt.DASH_VERTICAL ? 0 : dashHeight; + // Main view offsets + const leftBoxOffset = opt.DASH_LEFT ? dashWidth : spacing; + const rightBoxOffset = opt.DASH_RIGHT ? dashWidth : spacing; + let topBoxOffset = (opt.DASH_TOP ? dashHeight : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0); + const bottomBoxOffset = (opt.DASH_BOTTOM ? dashHeight : spacing) + (opt.WS_TMB_BOTTOM ? wsTmbHeight + spacing : 0); + const centeredBoxOffset = Math.max(leftBoxOffset, rightBoxOffset); + + // App grid needs to be calculated for the max wsTmbWidth in app grid, independently on the current wsTmb scale + const wsTmbHeightAppGrid = Math.round(height * opt.MAX_THUMBNAIL_SCALE_APPGRID); + const topBoxOffsetAppGrid = (opt.DASH_TOP ? dashHeight : spacing) + (opt.WS_TMB_TOP ? wsTmbHeightAppGrid + spacing : 0) + (opt.SHOW_SEARCH_ENTRY ? searchEntryHeight + spacing : 0); + const bottomBoxOffsetAppGrid = (opt.DASH_BOTTOM ? dashHeight : spacing) + (opt.WS_TMB_BOTTOM ? wsTmbHeightAppGrid + spacing : 0); + + // searchEntry + const searchEntryY = startY + topBoxOffset; - // Workspaces - let params = [box, workAreaBox, dashWidth, dashHeight, wsTmbWidth, wsTmbHeight, searchHeight, startY]; + const searchX = startX + + (opt.CENTER_SEARCH_VIEW || this._xAlignCenter + ? centeredBoxOffset + : leftBoxOffset); // xAlignCenter is set by wsBox + + const searchWidth = + width - (opt.CENTER_SEARCH_VIEW || this._xAlignCenter + ? 2 * centeredBoxOffset + : leftBoxOffset + rightBoxOffset); + + childBox.set_origin(searchX, searchEntryY); + childBox.set_size(searchWidth, searchEntryHeight); + + this._searchEntry.allocate(childBox); + + // searchResults + const searchY = startY + topBoxOffset + searchEntryHeight + spacing; + const searchHeight = height - topBoxOffset - bottomBoxOffset - searchEntryHeight - 2 * spacing; + + childBox.set_origin(searchX, searchY); + childBox.set_size(searchWidth, searchHeight); + this._searchController.allocate(childBox); + + // Add searchEntry height if needed + topBoxOffset += opt.SHOW_SEARCH_ENTRY ? searchEntryHeight + spacing : 0; + + // Workspace + let params = [ + box, + wsTmbWidth, + wsTmbHeight, + leftBoxOffset, + rightBoxOffset, + topBoxOffset, + bottomBoxOffset, + centeredBoxOffset, + ]; // Update cached boxes for (const state of Object.values(ControlsState)) { @@ -1696,39 +1590,14 @@ const ControlsManagerLayoutHorizontal = { this._workspacesDisplay.allocate(workspacesBox); - // Search entry - const searchXoffset = (opt.DASH_LEFT ? dashWidth : 0) + spacing; - - // Y position under top Dash - let searchEntryX, searchEntryY; - if (opt.DASH_TOP) - searchEntryY = startY + (opt.WS_TMB_TOP ? wsTmbHeight : 0) + dashHeight; - else - searchEntryY = startY + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0); - - - searchEntryX = searchXoffset; - let searchWidth = width - 2 * spacing - (opt.DASH_VERTICAL ? dashWidth : 0); // xAlignCenter is given by wsBox - searchWidth = this._xAlignCenter ? width : searchWidth; - - if (opt.CENTER_SEARCH_VIEW) { - childBox.set_origin(0, Math.round(searchEntryY)); - childBox.set_size(width, Math.round(searchHeight)); - } else { - childBox.set_origin(Math.round(this._xAlignCenter ? 0 : searchEntryX), Math.round(searchEntryY)); - childBox.set_size(Math.round(this._xAlignCenter ? width : searchWidth - spacing), Math.round(searchHeight)); - } - - this._searchEntry.allocate(childBox); - - availableHeight -= searchHeight + spacing; - - // if (this._appDisplay.visible)... ? Can cause problems - // Calculate appDisplay always for AppGrid state WsTmb scale - let wsTmbHeightAppGrid = opt.MAX_THUMBNAIL_SCALE_APPGRID > 0 - ? wsTmbHeight / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE_APPGRID - : wsTmbHeight / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE; - params = [box, workAreaBox, searchHeight, dashWidth, dashHeight, wsTmbHeightAppGrid, startY]; + // appDisplay + params = [ + box, + leftBoxOffset === spacing ? 0 : leftBoxOffset, + rightBoxOffset === spacing ? 0 : rightBoxOffset, + topBoxOffsetAppGrid, + bottomBoxOffsetAppGrid, + ]; let appDisplayBox; if (!transitionParams.transitioning) { appDisplayBox = @@ -1743,18 +1612,6 @@ const ControlsManagerLayoutHorizontal = { } this._appDisplay.allocate(appDisplayBox); - // Search - if (opt.CENTER_SEARCH_VIEW) { - const dashW = (opt.DASH_VERTICAL ? dashWidth : 0) + spacing; - searchWidth = width - 2 * dashW; - childBox.set_origin(Math.round(dashW), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0) + searchHeight)); - } else { - childBox.set_origin(Math.round(this._xAlignCenter ? spacing : searchXoffset), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0) + searchHeight)); - } - - childBox.set_size(Math.round(searchWidth), Math.round(availableHeight)); - this._searchController.allocate(childBox); - this._runPostAllocation(); }, }; @@ -1774,22 +1631,3 @@ function _getFitModeForState(state) { return FitMode.SINGLE; } } - -const LayoutManager = { - _startupAnimation() { - const dtdEnabled = !!((Me.Util.getEnabledExtensions('dash-to-dock').length && !Me.Util.getEnabledExtensions('dash-to-dock-vshell').length) || - Me.Util.getEnabledExtensions('ubuntu-dock').length); - if (dtdEnabled && !Meta.is_restart()) { - // DtD without V-Shell patch breaks overview on startup - // Skip animation to hide the mess - this._startupAnimationComplete(); - Main.overview._overview.controls._finishStartupSequence(); - } else if (Meta.is_restart()) { - this._startupAnimationComplete(); - } else if (Main.sessionMode.isGreeter) { - this._startupAnimationGreeter(); - } else { - this._startupAnimationSession(); - } - }, -}; diff --git a/extensions/46/vertical-workspaces/lib/panel.js b/extensions/46/vertical-workspaces/lib/panel.js index f78ab6f..ba6d01a 100644 --- a/extensions/46/vertical-workspaces/lib/panel.js +++ b/extensions/46/vertical-workspaces/lib/panel.js @@ -47,7 +47,9 @@ export const PanelModule = class { if (conflict && !reset) console.warn(`[${Me.metadata.name}] Warning: "Panel" module disabled due to potential conflict with another extension`); - reset = reset || !this.moduleEnabled || conflict || Main.sessionMode.isLocked; + reset = reset || !this.moduleEnabled || conflict; + + this.moduleEnabled = !reset; // don't touch original code if module disabled if (reset && !this._firstActivation) { @@ -69,13 +71,13 @@ export const PanelModule = class { this._setPanelPosition(); this._updateStyleChangedConnection(); - if (opt.PANEL_MODE === 0) { + if (!opt.PANEL_MODE) { this._updateOverviewConnection(true); this._reparentPanel(false); panelBox.translation_y = 0; Main.panel.opacity = 255; this._setPanelStructs(true); - } else if (opt.PANEL_MODE === 1) { + } else if (opt.PANEL_OVERVIEW_ONLY) { if (opt.SHOW_WS_PREVIEW_BG) { this._reparentPanel(true); if (opt.OVERVIEW_MODE2) { @@ -83,8 +85,6 @@ export const PanelModule = class { Main.layoutManager.overviewGroup.set_child_above_sibling(panelBox, null); this._updateOverviewConnection(); } else { - // otherwise move the panel below overviewGroup so it can get below workspacesDisplay - Main.layoutManager.overviewGroup.set_child_below_sibling(panelBox, Main.overview._overview); this._updateOverviewConnection(true); } this._showPanel(true); @@ -95,13 +95,13 @@ export const PanelModule = class { this._updateOverviewConnection(); } // _connectPanel(); - } else if (opt.PANEL_MODE === 2) { + } else if (opt.PANEL_DISABLED) { this._updateOverviewConnection(true); this._reparentPanel(false); this._showPanel(false); // _connectPanel(); } - this._setPanelStructs(opt.PANEL_MODE === 0); + this._setPanelStructs(!opt.PANEL_MODE); Main.layoutManager._updateHotCorners(); this._overrides.addOverride('ActivitiesButton', Main.panel.statusArea.activities, ActivitiesButton); @@ -147,7 +147,7 @@ export const PanelModule = class { } } else if (!this._styleChangedConId) { this._styleChangedConId = Main.panel.connect('style-changed', () => { - if (opt.PANEL_MODE === 1 && !opt.OVERVIEW_MODE2) + if (opt.PANEL_OVERVIEW_ONLY && !opt.OVERVIEW_MODE2) Main.panel.add_style_pseudo_class('overview'); else if (opt.OVERVIEW_MODE2) Main.panel.remove_style_pseudo_class('overview'); @@ -185,10 +185,10 @@ export const PanelModule = class { _reparentPanel(reparent = false) { const panel = Main.layoutManager.panelBox; - if (reparent && panel.get_parent() === Main.layoutManager.uiGroup) { + if (reparent && panel.get_parent() === Main.layoutManager.uiGroup && !Main.sessionMode.isLocked) { Main.layoutManager.uiGroup.remove_child(panel); Main.layoutManager.overviewGroup.add_child(panel); - } else if (!reparent && panel.get_parent() === Main.layoutManager.overviewGroup) { + } else if ((!reparent || Main.sessionMode.isLocked) && panel.get_parent() === Main.layoutManager.overviewGroup) { Main.layoutManager.overviewGroup.remove_child(panel); // return the panel at default position, panel shouldn't cover objects that should be above Main.layoutManager.uiGroup.insert_child_at_index(panel, 4); @@ -217,17 +217,17 @@ export const PanelModule = class { duration: ANIMATION_TIME, translation_y: 0, onComplete: () => { - this._setPanelStructs(opt.PANEL_MODE === 0); + this._setPanelStructs(!opt.PANEL_MODE); }, }); - } else { + } else if (!Main.layoutManager._startingUp) { const panelHeight = Main.panel.height; Main.layoutManager.panelBox.ease({ duration: ANIMATION_TIME, translation_y: opt.PANEL_POSITION_TOP ? -panelHeight + 1 : panelHeight - 1, onComplete: () => { Main.panel.opacity = 0; - this._setPanelStructs(opt.PANEL_MODE === 0); + this._setPanelStructs(!opt.PANEL_MODE); }, }); } diff --git a/extensions/46/vertical-workspaces/lib/search.js b/extensions/46/vertical-workspaces/lib/search.js index fc15862..47198a7 100644 --- a/extensions/46/vertical-workspaces/lib/search.js +++ b/extensions/46/vertical-workspaces/lib/search.js @@ -28,7 +28,7 @@ let Me; let _; let opt; -let SEARCH_MAX_WIDTH; +const SEARCH_MAX_WIDTH = 1092; export const SearchModule = class { constructor(me) { @@ -110,16 +110,14 @@ export const SearchModule = class { _updateSearchViewWidth(reset = false) { const searchContent = Main.overview.searchController._searchResults._content; - if (!SEARCH_MAX_WIDTH) { // just store original value; - const themeNode = searchContent.get_theme_node(); - const width = themeNode.get_max_width(); - SEARCH_MAX_WIDTH = width; - } if (reset) { searchContent.set_style(''); } else { - let width = Math.round(SEARCH_MAX_WIDTH * opt.SEARCH_VIEW_SCALE); + let width = SEARCH_MAX_WIDTH; + if (Me.Util.monitorHasLowResolution()) + width = Math.round(width * 0.8); + width = Math.round(width * opt.SEARCH_VIEW_SCALE); searchContent.set_style(`max-width: ${width}px;`); } } @@ -204,34 +202,53 @@ const AppSearchProvider = { let results = appInfoList.map(app => app.get_id()); + if (opt.SEARCH_APP_GRID_MODE && Main.overview.dash.showAppsButton.checked) + this._filterAppGrid(results); + results = results.concat(this._systemActions.getMatchingActions(terms)); return new Promise(resolve => resolve(results)); }, + _filterAppGrid(results) { + const icons = Main.overview._overview.controls._appDisplay._orderedItems; + icons.forEach(icon => { + icon.visible = results.includes(icon.id); + }); + }, + // App search result size createResultObject(resultMeta) { + let iconSize = opt.SEARCH_ICON_SIZE; + if (!iconSize) { + iconSize = Me.Util.monitorHasLowResolution() + ? 64 + : 96; + } + if (resultMeta.id.endsWith('.desktop')) { const icon = new AppDisplay.AppIcon(this._appSys.lookup_app(resultMeta['id']), { expandTitleOnHover: false, }); - icon.icon.setIconSize(opt.SEARCH_ICON_SIZE); + icon.icon.setIconSize(iconSize); return icon; } else { + this._iconSize = iconSize; return new SystemActionIcon(this, resultMeta); - // icon.icon._setSizeManually = true; - // icon.icon.setIconSize(opt.SEARCH_ICON_SIZE); - // return icon; } }, }; -const SystemActionIcon = GObject.registerClass( -class SystemActionIcon extends Search.GridSearchResult { +const SystemActionIcon = GObject.registerClass({ + // Registered name should be unique + GTypeName: `SystemAction${Math.floor(Math.random() * 1000)}`, +}, class SystemActionIcon extends Search.GridSearchResult { _init(provider, metaInfo, resultsView) { super._init(provider, metaInfo, resultsView); + if (!Clutter.Container) + this.add_style_class_name('grid-search-result-46'); this.icon._setSizeManually = true; - this.icon.setIconSize(opt.SEARCH_ICON_SIZE); + this.icon.setIconSize(provider._iconSize); } activate() { @@ -331,6 +348,58 @@ const SearchResultsView = { this._statusText.set_text(_('No results.')); } }, + + _highlightFirstVisibleAppGridIcon() { + const appDisplay = Main.overview._overview.controls._appDisplay; + // appDisplay.grab_key_focus(); + for (const icon of appDisplay._orderedItems) { + if (icon.visible) { + appDisplay.selectApp(icon.id); + break; + } + } + }, + + _maybeSetInitialSelection() { + if (opt.SEARCH_APP_GRID_MODE && Main.overview.dash.showAppsButton.checked) { + this._highlightFirstVisibleAppGridIcon(); + return; + } + + let newDefaultResult = null; + + let providers = this._providers; + for (let i = 0; i < providers.length; i++) { + let provider = providers[i]; + let display = provider.display; + + if (!display.visible) + continue; + + let firstResult = display.getFirstResult(); + if (firstResult) { + newDefaultResult = firstResult; + break; // select this one! + } + } + + if (newDefaultResult !== this._defaultResult) { + this._setSelected(this._defaultResult, false); + this._setSelected(newDefaultResult, this._highlightDefault); + + this._defaultResult = newDefaultResult; + } + }, + + highlightDefault(highlight) { + if (opt.SEARCH_APP_GRID_MODE && Main.overview.dash.showAppsButton.checked) { + if (highlight) + this._highlightFirstVisibleAppGridIcon(); + } else { + this._highlightDefault = highlight; + this._setSelected(this._defaultResult, highlight); + } + }, }; // Add highlighting of the "name" part of the result for all providers diff --git a/extensions/46/vertical-workspaces/lib/settings.js b/extensions/46/vertical-workspaces/lib/settings.js index dcfc8f9..563063c 100644 --- a/extensions/46/vertical-workspaces/lib/settings.js +++ b/extensions/46/vertical-workspaces/lib/settings.js @@ -30,7 +30,7 @@ export const Options = class Options { 400, () => { this._gsettings.apply(); - this._updateCachedSettings(); + this._updateSettings(); this._writeTimeoutId = 0; return GLib.SOURCE_REMOVE; } @@ -102,10 +102,14 @@ export const Options = class Options { appGridActivePreview: ['boolean', 'app-grid-active-preview'], appGridFolderCenter: ['boolean', 'app-grid-folder-center'], appGridPageWidthScale: ['int', 'app-grid-page-width-scale'], + appGridPageHeightScale: ['int', 'app-grid-page-height-scale'], appGridSpacing: ['int', 'app-grid-spacing'], + appGridFolderSpacing: ['int', 'app-grid-folder-spacing'], + appGridShowPageArrows: ['boolean', 'app-grid-show-page-arrows'], searchWindowsOrder: ['int', 'search-windows-order'], searchFuzzy: ['boolean', 'search-fuzzy'], searchMaxResultsRows: ['int', 'search-max-results-rows'], + searchAppGridMode: ['int', 'search-app-grid-mode'], dashShowWindowsBeforeActivation: ['int', 'dash-show-windows-before-activation'], dashIconScroll: ['int', 'dash-icon-scroll'], dashIsolateWorkspaces: ['boolean', 'dash-isolate-workspaces'], @@ -133,10 +137,12 @@ export const Options = class Options { overlayKeyPrimary: ['int', 'overlay-key-primary'], overlayKeySecondary: ['int', 'overlay-key-secondary'], overviewEscBehavior: ['int', 'overview-esc-behavior'], + clickEmptyClose: ['boolean', 'click-empty-close'], newWindowFocusFix: ['boolean', 'new-window-focus-fix'], newWindowMonitorFix: ['boolean', 'new-window-monitor-fix'], appGridPerformance: ['boolean', 'app-grid-performance'], highlightingStyle: ['int', 'highlighting-style'], + delayStartup: ['boolean', 'delay-startup'], workspaceSwitcherPopupModule: ['boolean', 'workspace-switcher-popup-module'], workspaceAnimationModule: ['boolean', 'workspace-animation-module'], @@ -162,6 +168,7 @@ export const Options = class Options { profileName4: ['string', 'profile-name-4'], }; this.cachedOptions = {}; + this._updateSettings(); } connect(name, callback) { @@ -285,6 +292,10 @@ export const Options = class Options { _updateSettings() { this._updateCachedSettings(); + + // Basic spacing of the overview elements + this.SPACING = 12; + this.DASH_BG_ALPHA = this.get('dashBgOpacity') / 100; this.DASH_BG_OPACITY = this.get('dashBgOpacity') * 2.5; this.DASH_BG_COLOR = this.get('dashBgColor'); @@ -323,6 +334,8 @@ export const Options = class Options { this.WS_TMB_POSITION = this.get('workspaceThumbnailsPosition'); this.ORIENTATION = this.WS_TMB_POSITION > 4 ? 0 : 1; this.WORKSPACE_MAX_SPACING = this.get('wsMaxSpacing'); + this.WS_MAX_SPACING_OFF_SCREEN = 350; + this.FORCE_SINGLE_WS_TRANSITION = false; // ORIENTATION || DASH_LEFT || DASH_RIGHT ? 350 : 80; this.SHOW_WS_TMB = ![4, 9].includes(this.WS_TMB_POSITION); // 4, 9 - disable this.WS_TMB_FULL = this.get('wsThumbnailsFull'); @@ -347,29 +360,16 @@ export const Options = class Options { this.SHOW_WST_LABELS_ON_HOVER = this.get('showWsTmbLabelsOnHover'); this.CLOSE_WS_BUTTON_MODE = this.get('closeWsButtonMode'); - this.MAX_THUMBNAIL_SCALE = this.get('wsThumbnailScale') / 100; - if (this.MAX_THUMBNAIL_SCALE === 0) { - this.MAX_THUMBNAIL_SCALE = 0.01; - this.SHOW_WS_TMB = false; - } - this.MAX_THUMBNAIL_SCALE_APPGRID = this.get('wsThumbnailScaleAppGrid') / 100; + this.MAX_THUMBNAIL_SCALE = this.get('wsThumbnailScale') / 100 + 0.01; + this.MAX_THUMBNAIL_SCALE_APPGRID = this.get('wsThumbnailScaleAppGrid') / 100 + 0.01; this.SHOW_WS_TMB_APPGRID = true; - if (this.MAX_THUMBNAIL_SCALE_APPGRID === 0) { - this.MAX_THUMBNAIL_SCALE_APPGRID = 0.01; - this.SHOW_WS_TMB_APPGRID = false; - } this.MAX_THUMBNAIL_SCALE_STABLE = this.MAX_THUMBNAIL_SCALE === this.MAX_THUMBNAIL_SCALE_APPGRID; - - this.SEC_MAX_THUMBNAIL_SCALE = this.get('secWsThumbnailScale') / 100; - if (this.SEC_MAX_THUMBNAIL_SCALE === 0) { - this.SEC_MAX_THUMBNAIL_SCALE = 0.01; - this.SHOW_SEC_WS_TMB = false; - } + this.SEC_MAX_THUMBNAIL_SCALE = this.get('secWsThumbnailScale') / 100 + 0.01; this.WS_PREVIEW_SCALE = this.get('wsPreviewScale') / 100; this.SEC_WS_PREVIEW_SCALE = this.get('secWsPreviewScale') / 100; // calculate number of possibly visible neighbor previews according to ws scale - this.NUMBER_OF_VISIBLE_NEIGHBORS = Math.round(1 + (1 - this.WS_PREVIEW_SCALE) / 4); + this.NUMBER_OF_VISIBLE_NEIGHBORS = Math.round(2 + (1 - this.WS_PREVIEW_SCALE)); this.SHOW_WS_TMB_BG = this.get('showWsSwitcherBg') && this.SHOW_WS_TMB; this.WS_PREVIEW_BG_RADIUS = this.get('wsPreviewBgRadius'); @@ -412,6 +412,7 @@ export const Options = class Options { this.SEARCH_MAX_ROWS = this.get('searchMaxResultsRows'); this.SEARCH_FUZZY = this.get('searchFuzzy'); this.SEARCH_DELAY = 0; + this.SEARCH_APP_GRID_MODE = this.get('searchAppGridMode'); this.APP_GRID_ALLOW_INCOMPLETE_PAGES = this.get('appGridIncompletePages'); this.APP_GRID_ICON_SIZE = this.get('appGridIconSize'); @@ -420,7 +421,7 @@ export const Options = class Options { this.APP_GRID_ADAPTIVE = !this.APP_GRID_COLUMNS && !this.APP_GRID_ROWS; this.APP_GRID_ORDER = this.get('appGridOrder'); - this.APP_GRID_ALPHABET = [1, 2].includes(this.APP_GRID_ORDER); + this.APP_GRID_ALPHABET = [1, 2, 4].includes(this.APP_GRID_ORDER); this.APP_GRID_FOLDERS_FIRST = this.APP_GRID_ORDER === 1; this.APP_GRID_FOLDERS_LAST = this.APP_GRID_ORDER === 2; this.APP_GRID_USAGE = this.APP_GRID_ORDER === 3; @@ -448,24 +449,26 @@ export const Options = class Options { this.APP_GRID_FOLDER_COLUMNS = this.get('appGridFolderColumns'); this.APP_GRID_FOLDER_ROWS = this.get('appGridFolderRows'); this.APP_GRID_SPACING = this.get('appGridSpacing'); + this.APP_GRID_FOLDER_SPACING = this.get('appGridFolderSpacing'); this.APP_GRID_FOLDER_DEFAULT = this.APP_GRID_FOLDER_ROWS === 3 && this.APP_GRID_FOLDER_COLUMNS === 3; this.APP_GRID_FOLDER_ADAPTIVE = !this.APP_GRID_FOLDER_COLUMNS && !this.APP_GRID_FOLDER_ROWS; this.APP_GRID_ACTIVE_PREVIEW = this.get('appGridActivePreview'); this.APP_GRID_FOLDER_CENTER = this.get('appGridFolderCenter'); this.APP_GRID_PAGE_WIDTH_SCALE = this.get('appGridPageWidthScale') / 100; + this.APP_GRID_PAGE_HEIGHT_SCALE = this.get('appGridPageHeightScale') / 100; + this.APP_GRID_SHOW_PAGE_ARROWS = this.get('appGridShowPageArrows'); - this.APP_GRID_ICON_SIZE_DEFAULT = this.APP_GRID_ACTIVE_PREVIEW && !this.APP_GRID_USAGE ? 176 : 96; + // Default icon sizes updates in the IconGrid._findBestModeForSize() + this.APP_GRID_ICON_SIZE_DEFAULT = this.APP_GRID_ACTIVE_PREVIEW && !this.APP_GRID_USAGE ? 192 : 96; this.APP_GRID_FOLDER_ICON_SIZE_DEFAULT = 96; this.APP_GRID_PERFORMANCE = this.get('appGridPerformance'); - this.WINDOW_SEARCH_ORDER = this.get('searchWindowsOrder'); - this.PANEL_POSITION_TOP = this.get('panelPosition') === 0; + this.PANEL_POSITION_BOTTOM = this.get('panelPosition') === 1; this.PANEL_MODE = this.get('panelVisibility'); this.PANEL_DISABLED = this.PANEL_MODE === 2; this.PANEL_OVERVIEW_ONLY = this.PANEL_MODE === 1; - this.START_Y_OFFSET = 0; // set from main module this.WINDOW_ATTENTION_MODE = this.get('windowAttentionMode'); this.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS = this.WINDOW_ATTENTION_MODE === 1; @@ -514,8 +517,7 @@ export const Options = class Options { this.OVERLAY_KEY_SECONDARY = this.get('overlayKeySecondary'); this.ESC_BEHAVIOR = this.get('overviewEscBehavior'); - - this.WINDOW_THUMBNAIL_ENABLED = !!Me.Util.getEnabledExtensions('window-thumbnails').length; + this.CLICK_EMPTY_CLOSE = this.get('clickEmptyClose'); this.FIX_NEW_WINDOW_FOCUS = this.get('newWindowFocusFix'); this.FIX_NEW_WINDOW_MONITOR = this.get('newWindowMonitorFix'); @@ -524,6 +526,8 @@ export const Options = class Options { this.HIGHLIGHT_DEFAULT = this.HIGHLIGHTING_STYLE === 0; this.HIGHLIGHT_UNDERLINE = this.HIGHLIGHTING_STYLE === 1; this.HIGHLIGHT_NONE = this.HIGHLIGHTING_STYLE === 2; + + this.DELAY_STARTUP = this.get('delayStartup'); } _getAnimationDirection() { diff --git a/extensions/46/vertical-workspaces/lib/util.js b/extensions/46/vertical-workspaces/lib/util.js index ab79c48..0da67ce 100644 --- a/extensions/46/vertical-workspaces/lib/util.js +++ b/extensions/46/vertical-workspaces/lib/util.js @@ -10,24 +10,30 @@ 'use strict'; -import GLib from 'gi://GLib'; import Clutter from 'gi://Clutter'; +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; import Meta from 'gi://Meta'; import Shell from 'gi://Shell'; -import Gio from 'gi://Gio'; +import St from 'gi://St'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as ModalDialog from 'resource:///org/gnome/shell/ui/modalDialog.js'; import { InjectionManager } from 'resource:///org/gnome/shell/extensions/extension.js'; let Me; +let _; let _installedExtensions; export function init(me) { Me = me; + _ = Me.gettext; } export function cleanGlobals() { Me = null; + _ = null; _installedExtensions = null; } @@ -373,3 +379,67 @@ export function getWindows(workspace) { // ... and filter out skip-taskbar windows and duplicates }).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) === i); } + +export function monitorHasLowResolution(monitorIndex, resolutionLimit) { + resolutionLimit = resolutionLimit ?? 1200000; + monitorIndex = monitorIndex ?? global.display.get_primary_monitor(); + const monitorGeometry = global.display.get_monitor_geometry(monitorIndex); + const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); + const monitorResolution = monitorGeometry.width * monitorGeometry.height; + return (monitorResolution / scaleFactor) < resolutionLimit; +} + +// ///////////////////////////////////////////////////////////////////////////////////////////// +// Status dialog that appears during updating V-Shell configuration and blocks inputs + +export const RestartMessage = GObject.registerClass({ + // Registered name should be unique + GTypeName: `RestartMessage${Math.floor(Math.random() * 1000)}`, +}, class RestartMessage extends ModalDialog.ModalDialog { + _init() { + super._init({ + shellReactive: false, + styleClass: 'restart-message headline update-message', + shouldFadeIn: false, + destroyOnClose: false, + }); + + const label = new St.Label({ + text: _('Updating V-Shell'), + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + }); + + this.contentLayout.add_child(label); + this.buttonLayout.hide(); + this.connect('destroy', () => this.removeMessage()); + } + + showMessage(timeout = 500) { + if (this._timeoutId || Me._resetInProgress || Main.layoutManager._startingUp) + return; + this._removeTimeout(); + this.open(); + this._timeoutId = GLib.timeout_add( + GLib.PRIORITY_LOW, + timeout, + () => { + this._timeoutId = 0; + this.removeMessage(); + return GLib.SOURCE_REMOVE; + } + ); + } + + _removeTimeout() { + if (this._timeoutId) { + GLib.source_remove(this._timeoutId); + this._timeoutId = 0; + } + } + + removeMessage() { + this._removeTimeout(); + this.close(); + } +}); diff --git a/extensions/46/vertical-workspaces/lib/windowAttentionHandler.js b/extensions/46/vertical-workspaces/lib/windowAttentionHandler.js index 744f5b6..ae115ed 100644 --- a/extensions/46/vertical-workspaces/lib/windowAttentionHandler.js +++ b/extensions/46/vertical-workspaces/lib/windowAttentionHandler.js @@ -10,9 +10,13 @@ 'use strict'; +import Clutter from 'gi://Clutter'; + import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; +const shellVersion46 = !Clutter.Container; + let Me; let opt; @@ -86,9 +90,8 @@ const WindowAttentionHandlerCommon = { } const app = this._tracker.get_window_app(window); - // const source = new WindowAttentionHandler.WindowAttentionSource(app, window); let args; - if (!Main.overview.dash.add_actor) // detects GS 46 - Clutter.Container has been removed + if (shellVersion46) args = { title: app.get_name() }; else args = app.get_name(); @@ -98,24 +101,44 @@ const WindowAttentionHandlerCommon = { source._init(app, window); Main.messageTray.add(source); - let [title, banner] = this._getTitleAndBanner(app, window); + let [title, body] = this._getTitleAndBanner(app, window); + args = shellVersion46 + ? [{ source, title, body, forFeedback: true }] + : [source, title, body]; + + const notification = new MessageTray.Notification(...args); + if (!shellVersion46) + notification.setForFeedback(true); - const notification = new MessageTray.Notification(source, title, banner); notification.connect('activated', () => { source.open(); }); - notification.setForFeedback(true); - if (opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS) - // just push the notification to the message tray without showing notification - source.pushNotification(notification); - else - source.showNotification(notification); - - window.connectObject('notify::title', () => { - [title, banner] = this._getTitleAndBanner(app, window); - notification.update(title, banner); - }, source); + if (shellVersion46) { + notification.acknowledged = opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS; + source.addNotification(notification); + if (opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS) { + // just push the notification to the message tray without showing notification + notification.acknowledged = true; + Main.messageTray._notificationQueue.push(notification); + Main.panel.statusArea.dateMenu._indicator.show(); + } + window.connectObject('notify::title', () => { + [title, body] = this._getTitleAndBanner(app, window); + notification.set({ title, body }); + }, source); + } else { + if (opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS) + // just push the notification to the message tray without showing notification + source.pushNotification(notification); + else + source.showNotification(notification); + + window.connectObject('notify::title', () => { + [title, body] = this._getTitleAndBanner(app, window); + notification.update(title, body); + }, source); + } }, }; diff --git a/extensions/46/vertical-workspaces/lib/windowPreview.js b/extensions/46/vertical-workspaces/lib/windowPreview.js index 3253aa5..a529dc1 100644 --- a/extensions/46/vertical-workspaces/lib/windowPreview.js +++ b/extensions/46/vertical-workspaces/lib/windowPreview.js @@ -32,6 +32,8 @@ const WINDOW_ACTIVE_SIZE_INC = 5; const WINDOW_OVERLAY_FADE_TIME = 200; const WINDOW_DND_SIZE = 256; const DRAGGING_WINDOW_OPACITY = 100; +const ICON_OVERLAP = 0.7; +const ICON_TITLE_SPACING = 6; const ControlsState = OverviewControls.ControlsState; @@ -109,7 +111,6 @@ const WindowPreviewCommon = { this._overviewAdjustment = overviewAdjustment; const ICON_SIZE = opt.WIN_PREVIEW_ICON_SIZE; - const ICON_OVERLAP = 0.7; Shell.WindowPreview.prototype._init.bind(this)({ reactive: true, @@ -589,6 +590,15 @@ const WindowPreviewCommon = { } }, + overlapHeights() { + const [, titleHeight] = this._title.get_preferred_height(-1); + + const topOverlap = 0; + const bottomOverlap = opt.WIN_TITLES_POSITION === 2 ? titleHeight + ICON_TITLE_SPACING : 0; + + return [topOverlap, bottomOverlap]; + }, + _onDestroy() { if (this._activateSelected) this._activate(); diff --git a/extensions/46/vertical-workspaces/lib/workspace.js b/extensions/46/vertical-workspaces/lib/workspace.js index 679a1ab..9f1dbbc 100644 --- a/extensions/46/vertical-workspaces/lib/workspace.js +++ b/extensions/46/vertical-workspaces/lib/workspace.js @@ -11,7 +11,7 @@ 'use strict'; import St from 'gi://St'; -import Graphene from 'gi://Graphene'; +// import Graphene from 'gi://Graphene'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js'; @@ -108,7 +108,6 @@ const WorkspaceLayout = { } }, - // this fixes wrong size and position calculation of window clones while moving overview to the next (+1) workspace if vertical ws orientation is enabled in GS _adjustSpacingAndPadding(rowSpacing, colSpacing, containerBox) { if (this._sortedWindows.length === 0) return [rowSpacing, colSpacing, containerBox]; @@ -120,36 +119,46 @@ const WorkspaceLayout = { const [topOversize, bottomOversize] = window.chromeHeights(); const [leftOversize, rightOversize] = window.chromeWidths(); - const oversize = Math.max(topOversize, bottomOversize, leftOversize, rightOversize); + let oversize = Math.max(topOversize, bottomOversize, leftOversize, rightOversize); if (rowSpacing !== null) rowSpacing += oversize; if (colSpacing !== null) colSpacing += oversize; - if (containerBox) { - const vertical = global.workspaceManager.layout_rows === -1; + // Chrome highlights and window titles may exceed the workspace preview area + // and also the screen area if there is no overview element below/above/on_the_right of the workspace + // The original code tests whether window titles are out of the screen and applies correction accordingly + // That is a problem when workspaces are vertically stacked, because this method is called even during transitions between workspaces + // In V-Shell, this issue can be solved by reducing the workspace preview scale in the Settings + // Original code - horizontal orientation only + /* if (containerBox) { const monitor = Main.layoutManager.monitors[this._monitorIndex]; - const bottomPoint = new Graphene.Point3D(); - if (vertical) - bottomPoint.x = containerBox.x2; - else - bottomPoint.y = containerBox.y2; - - + const bottomPoint = new Graphene.Point3D({ y: containerBox.y2 }); const transformedBottomPoint = this._container.apply_transform_to_point(bottomPoint); - const bottomFreeSpace = vertical - ? (monitor.x + monitor.height) - transformedBottomPoint.x - : (monitor.y + monitor.height) - transformedBottomPoint.y; + const bottomFreeSpace = + (monitor.y + monitor.height) - transformedBottomPoint.y; const [, bottomOverlap] = window.overlapHeights(); - if ((bottomOverlap + oversize) > bottomFreeSpace && !vertical) + if ((bottomOverlap + oversize) > bottomFreeSpace) containerBox.y2 -= (bottomOverlap + oversize) - bottomFreeSpace; - } + }*/ + + // Alternative code reducing the box size unconditionally + /* if (containerBox) { + const [, bottomOverlap] = window.overlapHeights(); + + // Adjusting x1/x2 here is pointless, + // x1 only moves window previews to the right and down, x2 has no effect + // Prevent window previews from overlapping a workspace preview + oversize *= 1.5; + containerBox.y1 += oversize; + containerBox.y2 -= bottomOverlap + oversize; + }*/ return [rowSpacing, colSpacing, containerBox]; }, diff --git a/extensions/46/vertical-workspaces/lib/workspaceThumbnail.js b/extensions/46/vertical-workspaces/lib/workspaceThumbnail.js index d64fda2..cce5046 100644 --- a/extensions/46/vertical-workspaces/lib/workspaceThumbnail.js +++ b/extensions/46/vertical-workspaces/lib/workspaceThumbnail.js @@ -41,7 +41,7 @@ const ThumbnailState = { const ControlsState = OverviewControls.ControlsState; -const WORKSPACE_CUT_SIZE = 10; +const WORKSPACE_CUT_SCALE = 0.15; const WORKSPACE_KEEP_ALIVE_TIME = 100; export const WorkspaceThumbnailModule = class { @@ -85,6 +85,7 @@ export const WorkspaceThumbnailModule = class { this._overrides.addOverride('WorkspaceThumbnail', WorkspaceThumbnail.WorkspaceThumbnail.prototype, WorkspaceThumbnailCommon); this._overrides.addOverride('ThumbnailsBoxCommon', WorkspaceThumbnail.ThumbnailsBox.prototype, ThumbnailsBoxCommon); + this._overrides.addOverride('WindowClone', WorkspaceThumbnail.WindowClone.prototype, WindowClone); // replacing opt.ORIENTATION local constant with boxOrientation internal variable allows external customers such as the AATWS extension to control the box orientation. Main.overview._overview.controls._thumbnailsBox._boxOrientation = opt.ORIENTATION; @@ -702,10 +703,19 @@ const ThumbnailsBoxCommon = { }, }; +function _getWorkspaceCutSize(tmbSize, index) { + let cutSize = WORKSPACE_CUT_SCALE * tmbSize; + // Compensate for the missing thumbnail in front of the first one + if (index === 0) + cutSize *= 1.5; + return Math.floor(cutSize); +} + const ThumbnailsBoxVertical = { _getPlaceholderTarget(index, spacing, rtl) { this._dropPlaceholder.add_style_class_name('placeholder-vertical'); const workspace = this._thumbnails[index]; + const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.height, index); let targetY1; let targetY2; @@ -740,6 +750,7 @@ const ThumbnailsBoxVertical = { _withinWorkspace(y, index, rtl) { const length = this._thumbnails.length; const workspace = this._thumbnails[index]; + const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.height, index); let workspaceY1 = workspace.y + WORKSPACE_CUT_SIZE; let workspaceY2 = workspace.y + workspace.height - WORKSPACE_CUT_SIZE; @@ -788,12 +799,14 @@ const ThumbnailsBoxVertical = { const ratio = this._porthole.width / this._porthole.height; const tmbHeight = themeNode.adjust_for_width(forWidth) / ratio; - const naturalheight = this._thumbnails.reduce((accumulator, thumbnail/* , index*/) => { - const progress = 1 - thumbnail.collapse_fraction; - const height = tmbHeight * progress; - return accumulator + height; - }, 0); - return themeNode.adjust_preferred_width(totalSpacing, Math.round(naturalheight)); + const naturalHeight = Math.round( + this._thumbnails.reduce((accumulator, thumbnail/* , index*/) => { + const progress = 1 - thumbnail.collapse_fraction; + const height = tmbHeight * progress; + return accumulator + height; + }, 0) + ); + return themeNode.adjust_preferred_width(totalSpacing, naturalHeight); }, // removes extra space (extraWidth in the original function), we need the box as accurate as possible @@ -976,6 +989,7 @@ const ThumbnailsBoxVertical = { const ThumbnailsBoxHorizontal = { _getPlaceholderTarget(index, spacing, rtl) { const workspace = this._thumbnails[index]; + const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.width, index); let targetX1; let targetX2; @@ -1010,6 +1024,7 @@ const ThumbnailsBoxHorizontal = { _withinWorkspace(x, index, rtl) { const length = this._thumbnails.length; const workspace = this._thumbnails[index]; + const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.width, index); let workspaceX1 = workspace.x + WORKSPACE_CUT_SIZE; let workspaceX2 = workspace.x + workspace.width - WORKSPACE_CUT_SIZE; @@ -1060,11 +1075,13 @@ const ThumbnailsBoxHorizontal = { const tmbWidth = themeNode.adjust_for_height(forHeight) / ratio; - const naturalWidth = this._thumbnails.reduce((accumulator, thumbnail) => { - const progress = 1 - thumbnail.collapse_fraction; - const width = tmbWidth * progress; - return accumulator + width; - }, 0); + const naturalWidth = Math.round( + this._thumbnails.reduce((accumulator, thumbnail) => { + const progress = 1 - thumbnail.collapse_fraction; + const width = tmbWidth * progress; + return accumulator + width; + }, 0) + ); return themeNode.adjust_preferred_width(totalSpacing, naturalWidth); }, @@ -1234,3 +1251,11 @@ const ThumbnailsBoxHorizontal = { _updateShouldShow: ThumbnailsBoxVertical._updateShouldShow, }; + +const WindowClone = { + after__init() { + // Make it transparent and smaller than usual while dragging + this._draggable._dragActorOpacity = 200; + this._draggable._dragActorMaxSize = 150; + }, +}; diff --git a/extensions/46/vertical-workspaces/lib/workspacesView.js b/extensions/46/vertical-workspaces/lib/workspacesView.js index 8e20db3..5c0d36b 100644 --- a/extensions/46/vertical-workspaces/lib/workspacesView.js +++ b/extensions/46/vertical-workspaces/lib/workspacesView.js @@ -69,6 +69,8 @@ export const WorkspacesViewModule = class { if (!desktopCubeConflict) this._overrides.addOverride('WorkspacesView', WorkspacesView.WorkspacesView.prototype, WorkspacesViewCommon); + else + this._overrides.removeOverride('WorkspacesView'); this._overrides.addOverride('WorkspacesDisplay', WorkspacesView.WorkspacesDisplay.prototype, WorkspacesDisplayCommon); this._overrides.addOverride('ExtraWorkspaceView', WorkspacesView.ExtraWorkspaceView.prototype, ExtraWorkspaceViewCommon); @@ -208,18 +210,26 @@ const WorkspacesViewCommon = { // if we disable workspaces that we can't or don't need to see, transition animations will be noticeably smoother // only the current ws needs to be visible during overview transition animations // and only current and adjacent ws when switching ws - w.visible = (this._animating && wsScrollProgress && distanceToCurrentWorkspace <= (opt.NUMBER_OF_VISIBLE_NEIGHBORS + 1)) || scaleProgress === 1 || - (opt.WORKSPACE_MAX_SPACING > 340 && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && currentState === ControlsState.WINDOW_PICKER) || - (this._monitorIndex !== primaryMonitor && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS) || (!opt.WS_ANIMATION && distanceToCurrentWorkspace < opt.NUMBER_OF_VISIBLE_NEIGHBORS) || - (opt.WORKSPACE_MAX_SPACING < 340 && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && currentState <= ControlsState.WINDOW_PICKER && - ((initialState < ControlsState.APP_GRID && finalState < ControlsState.APP_GRID)) - ); + w.visible = + (this._animating && wsScrollProgress && distanceToCurrentWorkspace <= (opt.NUMBER_OF_VISIBLE_NEIGHBORS + 1)) || + scaleProgress === 1 || + (opt.WORKSPACE_MAX_SPACING >= opt.WS_MAX_SPACING_OFF_SCREEN && + distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && + currentState === ControlsState.WINDOW_PICKER + ) || + (this._monitorIndex !== primaryMonitor && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS) || + (!opt.WS_ANIMATION && distanceToCurrentWorkspace < opt.NUMBER_OF_VISIBLE_NEIGHBORS) || + (distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && + currentState <= ControlsState.WINDOW_PICKER && + (initialState < ControlsState.APP_GRID && finalState < ControlsState.APP_GRID) + ); // after transition from APP_GRID to WINDOW_PICKER state, // adjacent workspaces are hidden and we need them to show up // make them visible during animation can impact smoothness of the animation // so we show them after the animation finished, move them to their position from outside of the monitor - if (!w.visible && distanceToCurrentWorkspace === 1 && initialState === ControlsState.APP_GRID && currentState === ControlsState.WINDOW_PICKER) { + if (currentState === ControlsState.WINDOW_PICKER && !w.visible && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && initialState === ControlsState.APP_GRID) { + w.remove_all_transitions(); w.visible = true; const directionNext = distance > 0; if (!opt.ORIENTATION) { @@ -315,115 +325,103 @@ const SecondaryMonitorDisplayVertical = { return { opacity, scale, translationX }; }, - _getThumbnailsWidth(box, spacing) { - if (opt.SEC_WS_TMB_HIDDEN) - return 0; + _getWorkspacesBoxForState(state, box, workArea, wsTmbWidth, spacing) { + let workspaceBox = box.copy(); - const [width, height] = box.get_size(); - const { expandFraction } = this._thumbnails; - const [, thumbnailsWidth] = this._thumbnails.get_preferred_width(height - 2 * spacing); - let scaledWidth; - if (opt.SEC_WS_PREVIEW_SHIFT && !opt.PANEL_DISABLED) - scaledWidth = ((height - Main.panel.height) * opt.SEC_MAX_THUMBNAIL_SCALE) * (width / height); - else - scaledWidth = width * opt.SEC_MAX_THUMBNAIL_SCALE; + if ( + (state === ControlsState.WINDOW_PICKER || state === ControlsState.APP_GRID) && + !(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) + ) { + workspaceBox = workArea.copy(); + const [startX, startY] = workspaceBox.get_origin(); + let [width, height] = workspaceBox.get_size(); - return Math.min( - thumbnailsWidth * expandFraction, - Math.round(scaledWidth)); - }, + let wsBoxWidth = width - (wsTmbWidth ? wsTmbWidth + spacing : 0) - 2 * spacing; + let wsBoxHeight = height - 2 * spacing; - _getWorkspacesBoxForState(state, box, thumbnailsWidth, spacing, startY, panelHeight) { - // const { ControlsState } = OverviewControls; - const workspaceBox = box.copy(); - let [width, height] = workspaceBox.get_size(); - height -= panelHeight; + const ratio = width / height; + let wRatio = wsBoxWidth / wsBoxHeight; + let scale = ratio / wRatio; - let wWidth, wHeight, wsbX, wsbY, offset; - switch (state) { - case ControlsState.HIDDEN: - break; - case ControlsState.WINDOW_PICKER: - case ControlsState.APP_GRID: - if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) - break; + if (scale > 1) { + wsBoxHeight /= scale; + wsBoxWidth = wsBoxHeight * ratio; + } else { + wsBoxWidth *= scale; + wsBoxHeight = wsBoxWidth / ratio; + } - wWidth = width - thumbnailsWidth - 5 * spacing; - wHeight = Math.min(wWidth / (width / height), height - 4 * spacing); - wWidth = Math.round(wWidth * opt.SEC_WS_PREVIEW_SCALE); - wHeight = Math.round(wHeight * opt.SEC_WS_PREVIEW_SCALE); + // height decides the actual size, ratio is given by the workArea + wsBoxHeight = Math.round(wsBoxHeight * opt.SEC_WS_PREVIEW_SCALE); + wsBoxWidth = Math.round(wsBoxWidth * opt.SEC_WS_PREVIEW_SCALE); - offset = Math.round(width - thumbnailsWidth - wWidth) / 2; - if (opt.SEC_WS_TMB_LEFT) - wsbX = thumbnailsWidth + offset; - else - wsbX = offset; + let offset = Math.round(width - wsTmbWidth - wsBoxWidth - spacing) / 2; - wsbY = Math.round((startY + height - wHeight) / 2); + const wsbX = startX + opt.SEC_WS_TMB_LEFT + ? wsTmbWidth + spacing + offset + : offset; + + const wsbY = Math.round((startY + height - wsBoxHeight) / 2); workspaceBox.set_origin(wsbX, wsbY); - workspaceBox.set_size(wWidth, wHeight); - break; + workspaceBox.set_size(wsBoxWidth, wsBoxHeight); } return workspaceBox; }, + _getWorkAreaBox(box) { + if (!opt.SEC_WS_PREVIEW_SHIFT || !Main.panel.visible) + return box; + + const workArea = box.copy(); + const panelHeight = Main.panel.height; + workArea.y1 += opt.PANEL_POSITION_TOP ? panelHeight : 0; + workArea.y2 -= opt.PANEL_POSITION_BOTTOM ? panelHeight : 0; + + return workArea; + }, + vfunc_allocate(box) { this.set_allocation(box); const themeNode = this.get_theme_node(); const contentBox = themeNode.get_content_box(box); - let [width, height] = contentBox.get_size(); - let [, startY] = contentBox.get_origin(); - // Save some resources - if (this._startY === undefined) { - this._panelHeight = opt.SEC_WS_PREVIEW_SHIFT && Main.panel.visible ? Main.panel.height : 0; - startY += opt.SEC_WS_PREVIEW_SHIFT && opt.PANEL_POSITION_TOP ? this._panelHeight : 0; - this._startY = startY; - } - startY = this._startY; - height -= this._panelHeight; - const { expandFraction } = this._thumbnails; - const spacing = themeNode.get_length('spacing') * expandFraction; + const workArea = this._getWorkAreaBox(contentBox); + + let [width, height] = workArea.get_size(); + let [startX, startY] = workArea.get_origin(); + + const spacing = opt.SPACING; - let thumbnailsWidth = 0; - let thumbnailsHeight = 0; + let wsTmbWidth = 0; + let wsTmbHeight = 0; this._thumbnails.visible = !opt.SEC_WS_TMB_HIDDEN; if (this._thumbnails.visible) { - thumbnailsWidth = Math.round(width * opt.SEC_MAX_THUMBNAIL_SCALE); + wsTmbWidth = Math.round(width * opt.SEC_MAX_THUMBNAIL_SCALE); let totalTmbSpacing; - [totalTmbSpacing, thumbnailsHeight] = this._thumbnails.get_preferred_height(thumbnailsWidth); - thumbnailsHeight = Math.round(thumbnailsHeight + totalTmbSpacing); + [totalTmbSpacing, wsTmbHeight] = this._thumbnails.get_preferred_height(wsTmbWidth); + wsTmbHeight += totalTmbSpacing; const thumbnailsHeightMax = height - spacing; - if (thumbnailsHeight > thumbnailsHeightMax) { - thumbnailsHeight = thumbnailsHeightMax; - thumbnailsWidth = Math.round(this._thumbnails.get_preferred_width(thumbnailsHeight)[1]); + if (wsTmbHeight > thumbnailsHeightMax) { + wsTmbHeight = thumbnailsHeightMax; + wsTmbWidth = Math.round(this._thumbnails.get_preferred_width(wsTmbHeight)[1]); } - let wsTmbX; - if (opt.SEC_WS_TMB_LEFT) { - wsTmbX = 0; - this._thumbnails._positionLeft = true; - } else { - wsTmbX = width - thumbnailsWidth; - this._thumbnails._positionLeft = false; - } + let wsTmbX = opt.SEC_WS_TMB_LEFT + ? startX + spacing + : startX + width - wsTmbWidth - spacing; - const childBox = new Clutter.ActorBox(); - const availSpace = height - thumbnailsHeight; + let offset = (height - wsTmbHeight) / 2; + const wsTmbY = startY + Math.round(offset - opt.SEC_WS_TMB_POSITION_ADJUSTMENT * (offset - spacing)); - let wsTmbY = availSpace / 2; - - wsTmbY -= opt.SEC_WS_TMB_POSITION_ADJUSTMENT * (wsTmbY - spacing / 2); - wsTmbY += startY; - - childBox.set_origin(Math.round(wsTmbX), Math.round(wsTmbY)); - childBox.set_size(thumbnailsWidth, thumbnailsHeight); + const childBox = new Clutter.ActorBox(); + childBox.set_origin(wsTmbX, wsTmbY); + childBox.set_size(wsTmbWidth, wsTmbHeight); this._thumbnails.allocate(childBox); } @@ -432,7 +430,7 @@ const SecondaryMonitorDisplayVertical = { } = this._overviewAdjustment.getStateTransitionParams(); let workspacesBox; - const workspaceParams = [contentBox, thumbnailsWidth, spacing, startY, this._panelHeight]; + const workspaceParams = [contentBox, workArea, wsTmbWidth, spacing]; if (!transitioning) { workspacesBox = this._getWorkspacesBoxForState(currentState, ...workspaceParams); @@ -562,93 +560,93 @@ const SecondaryMonitorDisplayHorizontal = { return { opacity, scale, translationY }; }, - _getWorkspacesBoxForState(state, box, thumbnailsHeight, spacing, startY, panelHeight) { - // const { ControlsState } = OverviewControls; - const workspaceBox = box.copy(); - let [width, height] = workspaceBox.get_size(); - height -= panelHeight; + _getWorkspacesBoxForState(state, box, workArea, wsTmbHeight, spacing) { + let workspaceBox = box.copy(); - let wWidth, wHeight, wsbX, wsbY, offset; - switch (state) { - case ControlsState.HIDDEN: - break; - case ControlsState.WINDOW_PICKER: - case ControlsState.APP_GRID: - if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) - break; + if ( + (state === ControlsState.WINDOW_PICKER || state === ControlsState.APP_GRID) && + !(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) + ) { + workspaceBox = workArea.copy(); + const [startX, startY] = workspaceBox.get_origin(); + let [width, height] = workspaceBox.get_size(); - wHeight = height - (thumbnailsHeight ? thumbnailsHeight + 4 * spacing : 4 * spacing); - wWidth = Math.min(wHeight * (width / height), width - 5 * spacing); - wWidth = Math.round(wWidth * opt.SEC_WS_PREVIEW_SCALE); - wHeight = Math.round(wHeight * opt.SEC_WS_PREVIEW_SCALE); + let wsBoxWidth = width - 2 * spacing; + let wsBoxHeight = height - (wsTmbHeight ? wsTmbHeight + spacing : 0) - 2 * spacing; - offset = Math.round((height - thumbnailsHeight - wHeight) / 2); - if (opt.SEC_WS_TMB_TOP) - wsbY = thumbnailsHeight + offset; - else - wsbY = offset; + const ratio = width / height; + let wRatio = wsBoxWidth / wsBoxHeight; + let scale = ratio / wRatio; + + if (scale > 1) { + wsBoxHeight /= scale; + wsBoxWidth = wsBoxHeight * ratio; + } else { + wsBoxWidth *= scale; + wsBoxHeight = wsBoxWidth / ratio; + } + + // height decides the actual size, ratio is given by the workArea + wsBoxHeight = Math.round(wsBoxHeight * opt.SEC_WS_PREVIEW_SCALE); + wsBoxWidth = Math.round(wsBoxWidth * opt.SEC_WS_PREVIEW_SCALE); - wsbY += startY; - wsbX = Math.round((width - wWidth) / 2); + let offset = Math.round(height - wsTmbHeight - wsBoxHeight - spacing) / 2; + + const wsbX = Math.round((startX + width - wsBoxWidth) / 2); + + const wsbY = startY + opt.SEC_WS_TMB_TOP + ? wsTmbHeight + spacing + offset + : offset; workspaceBox.set_origin(wsbX, wsbY); - workspaceBox.set_size(wWidth, wHeight); - break; + workspaceBox.set_size(wsBoxWidth, wsBoxHeight); } return workspaceBox; }, + _getWorkAreaBox: SecondaryMonitorDisplayVertical._getWorkAreaBox, + vfunc_allocate(box) { this.set_allocation(box); const themeNode = this.get_theme_node(); const contentBox = themeNode.get_content_box(box); - let [width, height] = contentBox.get_size(); - let [, startY] = contentBox.get_origin(); - // Save some resources - if (this._startY === undefined) { - this._panelHeight = opt.SEC_WS_PREVIEW_SHIFT && Main.panel.visible ? Main.panel.height : 0; - startY += opt.SEC_WS_PREVIEW_SHIFT && opt.PANEL_POSITION_TOP ? this._panelHeight : 0; - this._startY = startY; - } - startY = this._startY; - height -= this._panelHeight; - const { expandFraction } = this._thumbnails; - const spacing = themeNode.get_length('spacing') * expandFraction; + const workArea = this._getWorkAreaBox(contentBox); + + let [width, height] = workArea.get_size(); + let [startX, startY] = workArea.get_origin(); + + const spacing = opt.SPACING; - let thumbnailsWidth = 0; - let thumbnailsHeight = 0; + let wsTmbWidth = 0; + let wsTmbHeight = 0; this._thumbnails.visible = !opt.SEC_WS_TMB_HIDDEN; if (this._thumbnails.visible) { - thumbnailsHeight = height * opt.SEC_MAX_THUMBNAIL_SCALE; + wsTmbHeight = Math.round(height * opt.SEC_MAX_THUMBNAIL_SCALE); let totalTmbSpacing; - [totalTmbSpacing, thumbnailsWidth] = this._thumbnails.get_preferred_width(thumbnailsHeight); - thumbnailsWidth = Math.round(thumbnailsWidth + totalTmbSpacing); + [totalTmbSpacing, wsTmbWidth] = this._thumbnails.get_preferred_width(wsTmbHeight); + wsTmbWidth += totalTmbSpacing; - const thumbnailsWidthMax = width - spacing; + const thumbnailsWidthMax = width - 2 * spacing; - if (thumbnailsWidth > thumbnailsWidthMax) { - thumbnailsWidth = thumbnailsWidthMax; - thumbnailsHeight = Math.round(this._thumbnails.get_preferred_height(thumbnailsWidth)[1]); + if (wsTmbWidth > thumbnailsWidthMax) { + wsTmbWidth = thumbnailsWidthMax; + wsTmbHeight = Math.round(this._thumbnails.get_preferred_height(wsTmbWidth)[1]); } - let wsTmbY; - if (opt.SEC_WS_TMB_TOP) - wsTmbY = spacing / 2 + startY; - else - wsTmbY = height - spacing / 2 - thumbnailsHeight + startY; - - const childBox = new Clutter.ActorBox(); - const availSpace = width - thumbnailsWidth; + let wsTmbY = opt.SEC_WS_TMB_TOP + ? startY + spacing + : startY + height - wsTmbHeight - spacing; - let wsTmbX = availSpace / 2; - wsTmbX -= opt.SEC_WS_TMB_POSITION_ADJUSTMENT * wsTmbX; + let offset = (width - wsTmbWidth) / 2; + const wsTmbX = startX + Math.round(offset - opt.SEC_WS_TMB_POSITION_ADJUSTMENT * (offset - spacing)); - childBox.set_origin(Math.round(wsTmbX), Math.round(wsTmbY)); - childBox.set_size(thumbnailsWidth, thumbnailsHeight); + const childBox = new Clutter.ActorBox(); + childBox.set_origin(wsTmbX, wsTmbY); + childBox.set_size(wsTmbWidth, wsTmbHeight); this._thumbnails.allocate(childBox); } @@ -657,7 +655,7 @@ const SecondaryMonitorDisplayHorizontal = { } = this._overviewAdjustment.getStateTransitionParams(); let workspacesBox; - const workspaceParams = [contentBox, thumbnailsHeight, spacing, startY, this._panelHeight]; + const workspaceParams = [contentBox, workArea, wsTmbHeight, spacing]; if (!transitioning) { workspacesBox = this._getWorkspacesBoxForState(currentState, ...workspaceParams); @@ -805,6 +803,17 @@ const WorkspacesDisplayCommon = { }), this._overviewAdjustment); Main.layoutManager.overviewGroup.add_child(view); + + if (opt.CLICK_EMPTY_CLOSE) { + // Allow users to close the overview by clicking on an empty space on the secondary monitor + // The primary monitor overview is handled in the overviewControls + const clickAction = new Clutter.ClickAction(); + clickAction.connect('clicked', () => { + Main.overview.hide(); + }); + view.reactive = true; + view.add_action(clickAction); + } } this._workspacesViews.push(view); diff --git a/extensions/46/vertical-workspaces/meson.build b/extensions/46/vertical-workspaces/meson.build new file mode 100644 index 0000000..1c50d8d --- /dev/null +++ b/extensions/46/vertical-workspaces/meson.build @@ -0,0 +1,25 @@ +project('vertical-workspaces') + +gnome = import('gnome') +i18n = import('i18n') + +uuid = 'vertical-workspaces@G-dH.github.com' +rdnn = 'org.gnome.shell.extensions.vertical-workspaces' + +datadir = get_option('datadir') +extension_dir = datadir / 'gnome-shell' / 'extensions' / uuid + +install_data( + [ + 'extension.js', + 'metadata.json', + 'prefs.js', + 'stylesheet.css', + ], + install_dir : extension_dir, +) + +install_subdir('lib', install_dir : extension_dir) + +subdir('schemas') +subdir('po') diff --git a/extensions/46/vertical-workspaces/metadata.json b/extensions/46/vertical-workspaces/metadata.json index 163e115..1114017 100644 --- a/extensions/46/vertical-workspaces/metadata.json +++ b/extensions/46/vertical-workspaces/metadata.json @@ -4,7 +4,8 @@ "description": "Customize your GNOME Shell UX to suit your workflow, whether you like horizontally or vertically stacked workspaces.", "shell-version": [ "45", - "46" + "46", + "47" ], "session-modes": [ "user", @@ -16,7 +17,6 @@ }, "gettext-domain": "vertical-workspaces", "settings-schema": "org.gnome.shell.extensions.vertical-workspaces", - "version-name": "46.1", - "version": 999 + "version-name": "46.4" } diff --git a/extensions/46/vertical-workspaces/po/LINGUAS b/extensions/46/vertical-workspaces/po/LINGUAS new file mode 100644 index 0000000..6f31458 --- /dev/null +++ b/extensions/46/vertical-workspaces/po/LINGUAS @@ -0,0 +1,2 @@ +cs +nl diff --git a/extensions/46/vertical-workspaces/po/cs.po b/extensions/46/vertical-workspaces/po/cs.po index e588c73..2df5095 100644 --- a/extensions/46/vertical-workspaces/po/cs.po +++ b/extensions/46/vertical-workspaces/po/cs.po @@ -1,176 +1,203 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR GdH # This file is distributed under the same license as the vertical-workspaces package. -# FIRST AUTHOR Amerey.eu <info@amerey.eu>, 2023. # msgid "" msgstr "" "Project-Id-Version: vertical-workspaces\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-08 12:37+0100\n" -"PO-Revision-Date: 2023-03-09 15:09+0100\n" -"Last-Translator: Amerey.eu <info@amerey.eu>\n" +"POT-Creation-Date: 2024-07-19 08:40+0200\n" +"PO-Revision-Date: 2024-07-19 08:50+0200\n" +"Last-Translator: Ludek Vydra <lvtran@u.k2.cz>\n" "Language-Team: \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 3.1.1\n" +"X-Generator: Poedit 3.0.1\n" -#: dash.js:743 -msgid "Search Open Windows (Hotkey: Space)" -msgstr "Hledat v otevřených oknech (klávesová zkratka: mezerník)" +#: prefs.js:29 +msgid "Profiles" +msgstr "Profily" -#: dash.js:816 -msgid "Search Recent Files (Hotkey: Ctrl + Space)" -msgstr "Hledat v posledních souborech (klávesová zkratka: Ctrl + mezerník)" - -#: windowSearchProvider.js:117 windowSearchProvider.js:119 -msgid "Open Windows" -msgstr "Otevřené okna" - -#: windowSearchProvider.js:118 -msgid "List of open windows" -msgstr "Seznam otevřených oken" - -#: appDisplay.js:1317 -msgid "Force Quit" -msgstr "Vynutit vypnutí" - -#: appDisplay.js:1335 -msgid "Move App to Current Workspace ( Shift + Click )" -msgstr "Přesunout aplikaci do aktuální pracovní plochy (Shift + kliknutí)" - -#: prefs.js:47 prefs.js:1465 +#: prefs.js:34 prefs.js:1977 msgid "Layout" msgstr "Rozložení" -#: prefs.js:53 +#: prefs.js:39 msgid "Appearance" msgstr "Vzhled" -#: prefs.js:59 +#: prefs.js:44 msgid "Behavior" msgstr "Vlastnosti" -#: prefs.js:65 +#: prefs.js:49 prefs.js:345 +msgid "App Grid" +msgstr "Mřížka" + +#: prefs.js:54 +msgid "Modules" +msgstr "Moduly" + +#: prefs.js:59 msgid "Misc" msgstr "Různé" -#: prefs.js:71 +#: prefs.js:64 msgid "About" msgstr "O aplikaci" -#: prefs.js:119 prefs.js:517 prefs.js:1030 prefs.js:1456 -msgid "Dash" -msgstr "Dash" +#: prefs.js:107 +msgid "Custom Profiles" +msgstr "Uživatelské profily" + +#: prefs.js:108 +msgid "Sets of settings that can help you with the initial customization" +msgstr "Sady nastavení jež vám mohou pomoci s počátečním přizpůsobením" + +#: prefs.js:113 +msgid "Profile 1" +msgstr "Profil 1" + +#: prefs.js:119 +msgid "Profile 2" +msgstr "Profil 2" #: prefs.js:125 -msgid "Dash Position" -msgstr "Pozice Dash" +msgid "Profile 3" +msgstr "Profil 3" #: prefs.js:131 -msgid "Top" -msgstr "Nahoře" +msgid "Profile 4" +msgstr "Profil 4" -#: prefs.js:132 -msgid "Right" -msgstr "Vpravo" +#: prefs.js:146 prefs.js:629 prefs.js:1185 prefs.js:1968 +msgid "Dash" +msgstr "Dash" + +#: prefs.js:152 +msgid "Dash Position" +msgstr "Pozice Dash" -#: prefs.js:133 prefs.js:355 +#: prefs.js:157 prefs.js:417 msgid "Bottom" msgstr "Dole" -#: prefs.js:134 +#: prefs.js:158 msgid "Left" msgstr "Vlevo" -#: prefs.js:135 prefs.js:393 prefs.js:557 prefs.js:572 prefs.js:587 +#: prefs.js:159 +msgid "Top" +msgstr "Nahoře" + +#: prefs.js:160 +msgid "Right" +msgstr "Vpravo" + +#: prefs.js:161 prefs.js:205 prefs.js:548 msgid "Hide" msgstr "Skrýt" -#: prefs.js:142 +#: prefs.js:169 msgid "Center Horizontal Dash to Workspace" msgstr "Vycentrovat horizontální Dash" -#: prefs.js:143 +#: prefs.js:170 msgid "" "If the Dash Position is set to Top or Bottom, the position will be " -"recalculated relative to the workspace preview instead of the screen. Works " -"only with the default Dash." +"recalculated relative to the workspace preview instead of the screen" msgstr "" -"Pokud je pozice nastavena na Nahoře nebo Dole, pozice se přepočítá vzhledem " -"k náhledu pracovního prostoru místo obrazovky. Funguje pouze se standardním " -"Dash." +"Pokud je pozice Dash nastavena na Nahoře nebo Dole, pozice se přepočítá " +"vzhledem k náhledu pracovního prostoru namísto obrazovky" -#: prefs.js:160 +#: prefs.js:189 msgid "Fine Tune Dash Position" msgstr "Upravit pozici Dash" -#: prefs.js:161 +#: prefs.js:190 msgid "" -"Adjusts position of the dock on chosen axis. Works only with the default " -"Dash." -msgstr "Upraví polohu doku na zvolené ose. Funguje pouze se standardním Dash." +"Adjusts the position of the dash on the axis given by the orientation of the " +"workspaces" +msgstr "Upraví polohu Dash na dané ose posle orientace pracovních ploch" -#: prefs.js:170 +#: prefs.js:200 +msgid "Show Apps Icon Position" +msgstr "Nastavit pozici ikony aplikací" + +#: prefs.js:201 +msgid "Sets the position of the \"Show Applications\" icon in the Dash" +msgstr "Nastavuje pozici ikony \"Zobrazit aplikace\" v Dash" + +#: prefs.js:206 +msgid "Start" +msgstr "Začátek" + +#: prefs.js:207 +msgid "End" +msgstr "Konec" + +#: prefs.js:215 msgid "Workspace Thumbnails / Orientation" msgstr "Náhledy pracovního prostoru / Orientace" -#: prefs.js:176 +#: prefs.js:221 msgid "Thumbnails Position / Workspaces Orientation" msgstr "Pozice náhledů / Orientace pracovních ploch" -#: prefs.js:177 +#: prefs.js:222 msgid "" "Position of the workspace thumbnails on the screen also sets orientation of " "the workspaces to vertical or horizontal. You have two options to disable " -"workspace thumbnails, one sets workspaces to the vertical orientation, the " +"workspace thumbnails, one sets workspaces to vertical orientation, the " "second one to horizontal." msgstr "" "Umístění miniatur pracovních ploch na obrazovce také nastavuje orientaci " -"pracovních ploch na vertikální nebo horizontální. Máte dvě možnosti, jak " -"zakázat miniatury pracovních ploch, jedna nastaví pracovní plochy na " -"vertikální orientaci, druhá na horizontální." +"pracovních ploch na vertikální nebo horizontální. Máte dvě možnosti jak " +"zakázat miniatury pracovních ploch, jedna nastaví orientaci pracovní plochy " +"na vertikální , druhá na horizontální." -#: prefs.js:183 -msgid "Left \t Vertical Orientation" -msgstr "Svislá orientace \t vlevo" +#: prefs.js:227 +msgid "Left \t Vertical Orientation" +msgstr "Vlevo \t Svisle" -#: prefs.js:184 -msgid "Right \t Vertical Orientation" -msgstr "Svislá orientace \t vpravo" +#: prefs.js:228 +msgid "Right \t Vertical Orientation" +msgstr "Vpravo \t Svisle" -#: prefs.js:185 -msgid "Hide \t Set Vertical Orientation" -msgstr "Svislá orientace \t skrýt" +#: prefs.js:229 +msgid "Hide \t Vertical Orientation" +msgstr "Skryj \t Svisle" -#: prefs.js:186 -msgid "Top \t Horizontal Orientation" -msgstr "Vodorovná orientace \t nahoře" +#: prefs.js:230 +msgid "Top \t Horizontal Orientation" +msgstr "Nahoře \t Vodorovně" -#: prefs.js:187 +#: prefs.js:231 msgid "Bottom \t Horizontal Orientation" -msgstr "Vodorovná orientace \t dole" +msgstr "Dole \t Vodorovně" -#: prefs.js:188 -msgid "Hide \t Set Horizontal Orientation" -msgstr "Vodorovná orientace \t skrýt" +#: prefs.js:232 +msgid "Hide \t Horizontal Orientation" +msgstr "Skryj \t Vodorovně" -#: prefs.js:204 prefs.js:409 +#: prefs.js:248 prefs.js:564 msgid "Fine Tune Workspace Thumbnails Position" msgstr "Doladit pozice miniatur pracovního prostoru" -#: prefs.js:205 -msgid "Adjusts workspace thumbnails vertical position." -msgstr "Upraví vertikální polohu miniatur pracovního prostoru." +#: prefs.js:249 prefs.js:565 +msgid "" +"Adjusts the position of the thumbnails on the axis given by the orientation " +"of the workspaces" +msgstr "Upraví polohu miniatur na ose dané orientací pracovních ploch" -#: prefs.js:213 +#: prefs.js:257 msgid "Reserve Full Screen Height/Width for Thumbnails" msgstr "Vyhradit výšku/šířku celé obrazovky pro miniatury" -#: prefs.js:214 +#: prefs.js:258 msgid "" "The whole screen height/width will be reserved for workspace thumbnails at " "the expense of space available for Dash (if the Dash is oriented in a " @@ -179,1027 +206,1102 @@ msgstr "" "Celá výška/šířka obrazovky bude vyhrazena pro miniatury pracovního prostoru " "na úkor místa dostupného pro Dash (pokud je Dash orientován v jiné ose)." -#: prefs.js:231 prefs.js:427 -msgid "Workspace Thumbnails Max Scale" -msgstr "Miniatury pracovního prostoru Maximální měřítko" +#: prefs.js:275 +msgid "Workspace Thumbnails Max Scale - Window Picker" +msgstr "Miniatury pracovního prostoru Maximální měřítko - Výběr okna" -#: prefs.js:232 +#: prefs.js:276 msgid "" -"Adjusts maximum size of the workspace thumbnails (% relative to display " -"width)." +"Adjusts the maximum size of the workspace thumbnails in the overview " +"(percentage relative to display width)" msgstr "" -"Upraví maximální velikost miniatur pracovního prostoru (% vzhledem k šířce " -"zobrazení)." +"Upraví maximální velikost miniatur pracovního prostoru (v procentech " +"vzhledem k šířce zobrazení)" + +#: prefs.js:293 +msgid "Workspace Thumbnails Max Scale - App View" +msgstr "Miniatury pracovního prostoru Maximální měřítko -Aplikační pohled" + +#: prefs.js:294 +msgid "Allows you to set different thumbnails scale for the Applications view" +msgstr "Umožňuje nastavit různé měřítko miniatur pro zobrazení Aplikace" -#: prefs.js:241 prefs.js:697 +#: prefs.js:302 prefs.js:822 msgid "Workspace Preview" msgstr "Náhled pracovního prostoru" -#: prefs.js:256 +#: prefs.js:317 msgid "Workspaces Scale" msgstr "Měřítko pracovních prostorů" -#: prefs.js:257 +#: prefs.js:318 msgid "" -"Scales down workspace previews so you can fit more of the adjacent " -"workspaces on the screen. Default size is calculated to use all available " -"space." +"Allows to shrink workspace previews to adjust spacing or fit more of the " +"adjacent workspaces on the screen. Default size is calculated to use all " +"available space with minimal spacing" msgstr "" -"Zmenšuje náhledy pracovních ploch, takže se na obrazovku vejde více " -"sousedních pracovních ploch. Výchozí velikost se vypočítá tak, aby využila " -"veškerý dostupný prostor." +"Umožňuje zmenšit náhledy pracovních ploch, aby se upravily rozestupy nebo " +"aby se na obrazovku vešlo více sousedních pracovních ploch. Výchozí velikost " +"je vypočtena tak, aby se využil veškerý dostupný prostor s minimálními " +"rozestupy" -#: prefs.js:274 +#: prefs.js:335 msgid "Workspaces Spacing" msgstr "Rozestupy pracovních prostorů" -#: prefs.js:275 +#: prefs.js:336 msgid "" "Adjusts spacing between workspace previews so you can control how much of " "the adjacent workspaces overlap to the current workspace overview. Default " -"value should set the adjacent workspaces out of the screen." +"value should set the adjacent workspaces off-screen." msgstr "" -"Upraví rozestupy mezi náhledy pracovního prostoru, takže můžete ovládat, jak " -"velká část sousedních pracovních prostorů se překrývá s aktuálním přehledem " -"pracovního prostoru. Výchozí hodnota by měla nastavit sousední pracovní " -"plochy mimo obrazovku." +"Upravuje rozestupy mezi náhledy pracovních ploch, tedy můžete ovlivnit, jak " +"moc se sousední pracovní plochy překrývají s aktuálním přehledem pracovních " +"ploch. Výchozí hodnota by měla nastavit sousední pracovní plochy mimo " +"obrazovku." -#: prefs.js:284 prefs.js:712 prefs.js:1072 -msgid "App Grid" -msgstr "Mřížka aplikace" - -#: prefs.js:290 +#: prefs.js:351 msgid "Center App Grid" msgstr "Vycentrovat mřížku aplikace" -#: prefs.js:291 -msgid "" -"App grid in app view page will be centered to the display instead of the " -"available space. This option may have impact on the size of the grid, more " -"for narrower and small resolution displays, especially if workspace " -"thumbnails are bigger." +#: prefs.js:352 +msgid "Centers the app grid relative to the display instead of available space" msgstr "" -"Mřížka aplikace na stránce zobrazení aplikace bude vystředěna k displeji " -"místo dostupného místa. Tato možnost může mít vliv na velikost mřížky, spíše " -"pro užší displeje a displeje s malým rozlišením, zvláště pokud jsou " -"miniatury pracovního prostoru větší." +"Zobrazení vyhledávání bude vystředěno na displej namísto dostupného místa" -#: prefs.js:300 +#: prefs.js:361 msgid "Search View" msgstr "Zobrazení vyhledávání" -#: prefs.js:306 +#: prefs.js:367 msgid "Center Search View" msgstr "Vycentrovat zobrazení vyhledávání" -#: prefs.js:307 +#: prefs.js:368 msgid "" -"Search view will be centered to the display instead of the available space." +"Centers the search view relative to the display instead of available space" msgstr "" -"Zobrazení vyhledávání bude vystředěno na displej namísto dostupného místa." +"Vycentruje zobrazení vyhledávání vzhledem k displeji namísto dostupného " +"prostoru" -#: prefs.js:315 +#: prefs.js:376 msgid "Always Show Search Entry" msgstr "Vždy zobrazit pole vyhledávání" -#: prefs.js:316 +#: prefs.js:377 msgid "" "If disabled, the search entry field will be hidden when not in use, so the " -"workspace preview and app grid may take up more space." +"workspace preview and app grid may take up more space" msgstr "" -"Pokud je tato možnost zakázána, pole pro zadání vyhledávání bude skryto, " -"když se nepoužívá, takže náhled pracovního prostoru a mřížka aplikace mohou " -"zabírat více místa." +"Je-li je zakázáno, pole pro vyhledávání bude skryto, tedy náhled pracovního " +"prostoru a mřížka aplikace mohou zabírat více místa" -#: prefs.js:333 +#: prefs.js:394 msgid "Search Results Width" msgstr "Šířka výsledků hledání" -#: prefs.js:334 +#: prefs.js:395 msgid "" -"Adjusts maximum width of search results view (% relative to default). This " -"allows you to fit more (or less) app icons into the app search result." +"Adjusts the maximum width of search results view (percentage relative to " +"default). This allows to fit more (or less) app icons into the app search " +"result" msgstr "" -"Upraví maximální šířku zobrazení výsledků vyhledávání (% vzhledem k " -"výchozímu nastavení). To vám umožní umístit více (nebo méně) ikon aplikací " -"do výsledku vyhledávání aplikací." +"Upraví maximální šířku zobrazení výsledků vyhledávání (v procentech vzhledem " +"k výchozímu nastavení). To vám umožní umístit více či méně ikon aplikací do " +"výsledku vyhledávání aplikací" -#: prefs.js:342 prefs.js:1483 +#: prefs.js:405 prefs.js:2013 msgid "Panel" msgstr "Panel" -#: prefs.js:348 +#: prefs.js:411 msgid "Main Panel Position" msgstr "Umístění hlavního panelu" -#: prefs.js:349 -msgid "Allows you to place the main panel at the bottom of your monitor." -msgstr "Umožňuje umístit hlavní panel na spodní část monitoru." +#: prefs.js:412 +msgid "Allows to place the main panel at the bottom of the primary display" +msgstr "Umožňuje umístit hlavní panel do spodní části primárního displeje" -#: prefs.js:354 +#: prefs.js:416 msgid "Top (Default)" msgstr "Nahoře (výchozí)" -#: prefs.js:362 +#: prefs.js:425 msgid "Main Panel Visibility" msgstr "Viditelnost hlavního panelu" -#: prefs.js:363 -msgid "Main panel can be visible always, only in the overview or never." -msgstr "Hlavní panel může být viditelný vždy, pouze v přehledu nebo nikdy." +#: prefs.js:426 +msgid "Allows to hide main panel when not needed" +msgstr "Umožňuje skrýt hlavní panel anebo jej zobrazit jen v přehledu" -#: prefs.js:368 +#: prefs.js:430 msgid "Always Visible (Default)" msgstr "Vždy viditelný (výchozí)" -#: prefs.js:369 +#: prefs.js:431 msgid "Overview Only" msgstr "Pouze přehled" -#: prefs.js:370 +#: prefs.js:432 msgid "Always Hidden" msgstr "Vždy skrytý" -#: prefs.js:378 +#: prefs.js:442 +msgid "Workspace Switcher Popup" +msgstr "Přepínač pracovního prostoru - vyskakovací okno" + +#: prefs.js:458 +msgid "Horizontal Position (percentage from the left)" +msgstr "Horizontální poloha (procent zleva)" + +#: prefs.js:459 +msgid "" +"This popup shows up when you switch workspace using a keyboard shortcut or " +"gesture outside of the overview. You can disable it on the \"Behavior\" tab. " +"If you want more control over the popup, try the \"Workspace Switcher " +"Manager\" extension" +msgstr "" +"Toto vyskakovací okno se zobrazí, když přepnete pracovní prostor pomocí " +"klávesové zkratky nebo gesta mimo přehled. Můžete jej zakázat na kartě " +"Vlastnosti. Pro větší kontrolu nad vyskakovacím oknem, vyzkoušejte rozšíření " +"\"Workspace Switcher Manager\"" + +#: prefs.js:479 +msgid "Vertical Position (percentage from the top)" +msgstr "Vertikální pozice (procent shora)" + +#: prefs.js:490 +msgid "Notifications and OSD" +msgstr "Oznámení a OSD" + +#: prefs.js:496 +msgid "Notification Banner Position" +msgstr "Pozice oznamovacího banneru" + +#: prefs.js:497 +msgid "Choose where the notification banners appear on the screen" +msgstr "Vyberte, kde se na obrazovce zobrazí oznamovací bannery" + +#: prefs.js:501 prefs.js:520 prefs.js:1150 +msgid "Top Left" +msgstr "Nahoře vlevo" + +#: prefs.js:502 +msgid "Top Center (Default)" +msgstr "Nahoře Střed (výchozí)" + +#: prefs.js:503 prefs.js:522 prefs.js:1151 +msgid "Top Right" +msgstr "Nahoře Vpravo" + +#: prefs.js:504 prefs.js:524 prefs.js:1152 +msgid "Bottom Left" +msgstr "Dole vlevo" + +#: prefs.js:505 +msgid "Bottom Center" +msgstr "Dole Vlevo" + +#: prefs.js:506 prefs.js:526 prefs.js:1153 +msgid "Bottom Right" +msgstr "Dole vpravo" + +#: prefs.js:514 +msgid "OSD Popup Position" +msgstr "Pozice OSD" + +#: prefs.js:515 +msgid "" +"Choose where the OSD pop-ups (like sound volume level) appear on the screen" +msgstr "Vyberte, kde se na obrazovce zobrazí OSD (například nastavení zvuku)" + +#: prefs.js:519 prefs.js:743 prefs.js:787 prefs.js:1087 prefs.js:1107 +#: prefs.js:1130 prefs.js:1244 prefs.js:1363 prefs.js:1380 prefs.js:1397 +#: prefs.js:1463 +msgid "Disable" +msgstr "Zakázat" + +#: prefs.js:521 +msgid "Top Center" +msgstr "Nahoře vlevo" + +#: prefs.js:523 +msgid "Center" +msgstr "Střed" + +#: prefs.js:525 +msgid "Bottom Center (Default)" +msgstr "Dole Střed (výchozí)" + +#: prefs.js:534 msgid "Secondary Monitors" msgstr "Sekundární monitory" -#: prefs.js:384 +#: prefs.js:540 msgid "Workspace Thumbnails Position" msgstr "Pozice miniatur pracovního prostoru" -#: prefs.js:385 +#: prefs.js:541 msgid "" -"Allows you to place workspace thumbnails of secondary monitors on the " -"opposite side than on the primary monitor." +"Allows to place workspace thumbnails of secondary monitors on the opposite " +"side than on the primary monitor" msgstr "" "Umožňuje umístit miniatury pracovního prostoru sekundárních monitorů na " -"opačnou stranu než na primárním monitoru." +"opačnou stranu než na primárním monitoru" -#: prefs.js:390 +#: prefs.js:545 msgid "Same as Primary" msgstr "Stejné jako primární" -#: prefs.js:391 +#: prefs.js:546 msgid "Left / Top" msgstr "Vlevo / Nahoře" -#: prefs.js:392 +#: prefs.js:547 msgid "Right / Bottom" msgstr "Vpravo / Dole" -#: prefs.js:410 -msgid "Adjusts secondary monitors workspace thumbnails vertical position." -msgstr "" -"Upravuje vertikální polohu miniatur pracovního prostoru sekundárních " -"monitorů." +#: prefs.js:582 +msgid "Workspace Thumbnails Max Scale" +msgstr "Miniatury pracovního prostoru Maximální měřítko" -#: prefs.js:428 +#: prefs.js:583 msgid "" -"Adjusts maximum size of the workspace thumbnails (% relative to display " -"width) for secondary monitors." +"Adjusts maximum size of the workspace thumbnails (percentage relative to the " +"display width / height) for secondary monitors" msgstr "" -"Upravuje maximální velikost miniatur pracovního prostoru (% vzhledem k šířce " -"zobrazení) pro sekundární monitory." +"Upravuje maximální velikost miniatur pracovního prostoru (v procentech " +"vzhledem k šířce / výšce zobrazení) pro sekundární monitory" -#: prefs.js:445 +#: prefs.js:600 msgid "Workspace Preview Scale" msgstr "Měřítko náhledu pracovního prostoru" -#: prefs.js:446 -msgid "Scales down workspace previews on secondary monitors." -msgstr "Zmenšuje náhledy pracovního prostoru na sekundárních monitorech." +#: prefs.js:601 +msgid "Allows to scale down workspace previews on secondary monitors" +msgstr "Zmenšuje náhledy pracovního prostoru na sekundárních monitorech" -#: prefs.js:454 -msgid "Shift Workspace Preview by Panel Height" -msgstr "Posunout náhled pracovního prostoru podle výšky panelu" +#: prefs.js:609 +msgid "Shift Overview by Panel Height" +msgstr "Posuň náhled pracovního prostoru podle výšky panelu" -#: prefs.js:455 +#: prefs.js:610 msgid "" -"This option can help align overview of the secondary monitor with the " -"primary monitor." +"This option can help align the overview of the secondary monitor with the " +"primary one" msgstr "" "Tato možnost může pomoci zarovnat přehled sekundárního monitoru s primárním " -"monitorem." - -#: prefs.js:464 -msgid "Workspace Switcher Popup" -msgstr "Přepínač pracovního prostoru - vyskakovací okno" +"monitorem" -#: prefs.js:480 -msgid "Horizontal Position (% from left)" -msgstr "Horizontální poloha (% zleva)" +#: prefs.js:635 +msgid "Dash Max Icon Size" +msgstr "Maximální velikost ikon" -#: prefs.js:481 +#: prefs.js:636 msgid "" -"This popup shows up when you switch workspace using a keyboard shortcut or " -"gesture outside of the overview. You can disable it on the Behavior tab. If " -"you want more control over the popup, try Workspace Switcher Manager " -"extension." +"Maximum size of Dash icons in pixels. Adaptive option switches between " +"default 64 and 48 for low resolution displays" msgstr "" -"Toto vyskakovací okno se zobrazí, když přepnete pracovní prostor pomocí " -"klávesové zkratky nebo gesta mimo přehled. Můžete jej zakázat na kartě " -"Vlastnosti. Pokud chcete větší kontrolu nad vyskakovacím oknem, vyzkoušejte " -"rozšíření Workspace Switcher Manager." - -#: prefs.js:499 -msgid "Vertical Position (% from top)" -msgstr "Vertikální pozice (% shora)" +"Maximální velikost ikon Dash v pixelech. Možnost Adaptive přepíná mezi " +"výchozími hodnotami 64 a 48 pro displeje s nízkým rozlišením" -#: prefs.js:523 -msgid "Dash Max Icon Size" -msgstr "Maximální velikost ikon" - -#: prefs.js:524 -msgid "Maximum size of Dash icons in pixels. Works only with default Dash." -msgstr "Maximální velikost ikon v pixelech. Funguje pouze s výchozím Dash." +#: prefs.js:640 prefs.js:1545 prefs.js:1740 +msgid "Adaptive (Default)" +msgstr "Adaptivní (výchozí)" -#: prefs.js:529 prefs.js:732 prefs.js:752 prefs.js:853 +#: prefs.js:641 prefs.js:867 prefs.js:1553 prefs.js:1741 msgid "128" msgstr "128" -#: prefs.js:530 prefs.js:733 prefs.js:753 prefs.js:854 +#: prefs.js:642 prefs.js:868 prefs.js:1554 prefs.js:1742 msgid "112" msgstr "112" -#: prefs.js:531 prefs.js:734 prefs.js:754 prefs.js:855 +#: prefs.js:643 prefs.js:1555 prefs.js:1743 msgid "96" msgstr "96" -#: prefs.js:532 prefs.js:735 prefs.js:755 prefs.js:856 +#: prefs.js:644 prefs.js:870 prefs.js:1556 prefs.js:1744 msgid "80" msgstr "80" -#: prefs.js:533 prefs.js:676 prefs.js:736 prefs.js:756 prefs.js:857 +#: prefs.js:645 prefs.js:871 prefs.js:1557 prefs.js:1745 msgid "64" msgstr "64" -#: prefs.js:534 prefs.js:677 prefs.js:737 prefs.js:757 prefs.js:858 +#: prefs.js:646 prefs.js:784 prefs.js:872 prefs.js:1558 prefs.js:1746 msgid "48" msgstr "48" -#: prefs.js:535 prefs.js:678 prefs.js:758 prefs.js:859 +#: prefs.js:647 prefs.js:785 prefs.js:873 msgid "32" msgstr "32" -#: prefs.js:536 -msgid "24" -msgstr "24" +#: prefs.js:655 +msgid "Dash Background Style" +msgstr "Dash styl pozadí" -#: prefs.js:537 -msgid "16" -msgstr "16" +#: prefs.js:656 +msgid "" +"Allows you to change the background color of the dash to match the search " +"results an app folders" +msgstr "" +"Umožňuje změnit barvu pozadí Dash tak, aby odpovídala výsledkům vyhledávání " +"ve složkách aplikace" -#: prefs.js:551 -msgid "Show Apps Icon Position" -msgstr "Zobrazit pozici ikony aplikací" +#: prefs.js:660 prefs.js:1029 prefs.js:1057 prefs.js:1149 prefs.js:1223 +#: prefs.js:1362 prefs.js:1379 prefs.js:1435 prefs.js:1449 +msgid "Default" +msgstr "Výchozí" -#: prefs.js:552 -msgid "Sets the position of the \"Show Applications\" icon in the Dash." -msgstr "Nastavuje pozici ikony \"Zobrazit aplikace\"." +#: prefs.js:661 +msgid "Light" +msgstr "Lehké" -#: prefs.js:558 prefs.js:573 prefs.js:588 -msgid "Start" -msgstr "Začátek" +#: prefs.js:677 +msgid "Dash Background Opacity" +msgstr "Neprůhlednost pozadí" -#: prefs.js:559 prefs.js:574 prefs.js:589 -msgid "End" -msgstr "Konec" +#: prefs.js:678 +msgid "Adjusts the opacity of the Dash background" +msgstr "Upraví průhlednost pozadí Dash" -#: prefs.js:566 -msgid "Open Windows Icon Position" -msgstr "Pozice ikony „Hledat v otevřených oknech“" +#: prefs.js:696 +msgid "Dash Background Radius" +msgstr "Poloměr pozadí" -#: prefs.js:567 +#: prefs.js:697 msgid "" -"This option adds \"Search Open Windows\" icon into dash (if window search " -"provider enabled on the Behavior tab) so you can directly toggle window " -"search provider results. Even if you disable this icon, you can use the " -"secondary mouse button click on the Show Apps Icon, or the Space hotkey to " -"access this feature." +"Adjusts the border radius of the Dash background in pixels. 0 means the " +"default value given by the current theme style" msgstr "" -"Tato možnost přidá ikonu „Hledat v otevřených oknech“ (pokud je na kartě " -"Vlastnosti povolen poskytovatel vyhledávání v okně), takže můžete přímo " -"přepínat výsledky poskytovatele vyhledávání v okně. I když tuto ikonu " -"zakážete, můžete pro přístup k této funkci použít sekundární tlačítko myši " -"na ikonu Zobrazit aplikaci nebo mezerník." +"Upraví poloměr okraje pozadí Dash v pixelech. 0 znamená výchozí hodnotu dle " +"stylu tématu" -#: prefs.js:581 -msgid "Recent Files Icon Position" -msgstr "Pozice ikony „Hledat v posledních souborech“" +#: prefs.js:707 +msgid "Dash Background GNOME 3 Style" +msgstr "Dash pozadí stylu GNOME 3" -#: prefs.js:582 +#: prefs.js:708 msgid "" -"This option adds \"Search Recent Files\" icon into dash (if recent files " -"search provider enabled on the Behavior tab) so you can directly toggle " -"recent files search provider results. Even if you disable this icon, you can " -"use Ctrl + Space hotkey to access this feature." -msgstr "" -"Tato možnost přidá ikonu „Hledat v posledních souborech“ na pomlčku (pokud " -"je poskytovatel vyhledávání posledních souborů povolen na kartě Vlastnosti), " -"takže můžete přímo přepínat výsledky poskytovatele vyhledávání posledních " -"souborů. I když tuto ikonu zakážete, můžete pro přístup k této funkci použít " -"klávesovou zkratku Ctrl + mezerník." +"Background of the vertically oriented dash will imitate the GNOME 3 style" +msgstr "Pozadí vertikálně orientovaného Dash napodobí styl prostředí GNOME 3" -#: prefs.js:597 -msgid "Dash Background Opacity" -msgstr "Průhlednost pozadí" +#: prefs.js:718 +msgid "Running App Indicator" +msgstr "Běžící aplikační indikátor" -#: prefs.js:598 -msgid "Adjusts the opacity of the dash background." -msgstr "Upraví průhlednost pozadí." +#: prefs.js:719 +msgid "" +"Allows you to change style of the running app indicator under the app icon" +msgstr "Umožňuje změnit styl indikátoru spuštěné aplikace pod ikonou aplikace" -#: prefs.js:614 -msgid "Dash Background Radius" -msgstr "Poloměr pozadí" +#: prefs.js:723 +msgid "Dot (Default)" +msgstr "Tečka (výchozí)" -#: prefs.js:615 -msgid "" -"Adjusts the border radius of the dash background in pixels. 0 means default " -"value." -msgstr "Upraví poloměr okraje pozadí v pixelech. 0 znamená výchozí hodnotu." +#: prefs.js:724 +msgid "Line" +msgstr "Linka" -#: prefs.js:623 prefs.js:1050 +#: prefs.js:732 prefs.js:1233 msgid "Workspace Thumbnails" msgstr "Miniatury pracovního prostoru" -#: prefs.js:629 +#: prefs.js:738 msgid "Show Workspace Thumbnail Labels" msgstr "Zobrazit štítky miniatur pracovního prostoru" -#: prefs.js:630 +#: prefs.js:739 msgid "" -"Each workspace thumbnail can show its index and name (if defined in the " -"system settings) or name/title of its most recently used app/window." +"Each workspace thumbnail can show label with its index and name (if defined " +"in the system settings) or name/title of its most recently used app/window" msgstr "" "Každá miniatura pracovního prostoru může zobrazovat svůj index a název " "(pokud je definován v nastavení systému) nebo jméno/název naposledy použité " -"aplikace/okna." +"aplikace/okna" -#: prefs.js:635 prefs.js:680 prefs.js:1001 prefs.js:1062 prefs.js:1260 -#: prefs.js:1278 prefs.js:1296 prefs.js:1331 -msgid "Disable" -msgstr "Zakázat" - -#: prefs.js:636 +#: prefs.js:744 msgid "Index" msgstr "Index" -#: prefs.js:637 +#: prefs.js:745 msgid "Index + WS Name" -msgstr "Index + Název WS" +msgstr "Index + Název plochy" -#: prefs.js:638 +#: prefs.js:746 msgid "Index + App Name" msgstr "Index + Název aplikace" -#: prefs.js:639 +#: prefs.js:747 msgid "Index + Window Title" msgstr "Rejstřík + Název okna" -#: prefs.js:646 +#: prefs.js:754 msgid "Show WS Thumbnail Label on Hover" -msgstr "Zobrazit štítek miniatur WS při umístění kurzoru myši" +msgstr "Zobrazit štítek miniatur ploch při umístění kurzoru myši" -#: prefs.js:647 -msgid "Show label only when the mouse pointer hovers over a thumbnail" +#: prefs.js:755 +msgid "Show the label only when the mouse pointer hovers over the thumbnail" msgstr "Zobrazit popisek pouze tehdy, když ukazatel myši najede na miniaturu" -#: prefs.js:655 +#: prefs.js:763 msgid "Show Wallpaper in Workspace Thumbnails" msgstr "Zobrazit tapetu v miniaturách pracovního prostoru" -#: prefs.js:656 -msgid "All workspace thumbnails will include the current desktop background." +#: prefs.js:764 +msgid "All workspace thumbnails will include the current desktop background" msgstr "" -"Všechny miniatury pracovního prostoru budou obsahovat aktuální pozadí plochy." +"Všechny miniatury pracovního prostoru budou obsahovat aktuální pozadí plochy" -#: prefs.js:664 +#: prefs.js:772 prefs.js:1254 msgid "Window Preview" msgstr "Náhled okna" -#: prefs.js:670 +#: prefs.js:778 msgid "Window Preview App Icon Size" msgstr "Velikost ikony aplikace náhledu okna" -#: prefs.js:671 -msgid "Default size is 64." -msgstr "Výchozí velikost je 64." +#: prefs.js:783 +msgid "64 (Default)" +msgstr "64 (výchozí)" -#: prefs.js:679 +#: prefs.js:786 msgid "22" msgstr "22" -#: prefs.js:687 -msgid "Always Show Window Titles" -msgstr "Vždy zobrazovat názvy oken" +#: prefs.js:795 +msgid "Window Title Position / Visibility" +msgstr "Pozice názvu okna / viditelnost" -#: prefs.js:688 +#: prefs.js:796 msgid "" -"All windows on the workspace preview will show their titles, not only the " -"one with the mouse pointer." +"Sets the position of the window title that is displayed when the mouse " +"hovers over the window or can always be visible" msgstr "" -"Všechna okna v náhledu pracovní plochy budou zobrazovat své názvy, nejen ty " -"s ukazatelem myši." +"Nastavuje pozici názvu okna zobrazeného při najetí myší na okno nebo může " +"být viditelný vždy" -#: prefs.js:703 -msgid "Show Workspace Preview Background" -msgstr "Zobrazit pozadí náhledu pracovní plochy" +#: prefs.js:800 +msgid "Inside Window" +msgstr "Uvnitř okna" -#: prefs.js:704 -msgid "Allows you to hide the scaling background of the workspace preview." -msgstr "Umožňuje skrýt pozadí náhledu pracovní plochy." +#: prefs.js:801 +msgid "Inside Window Always Visible" +msgstr "Uvnitř okna vždy viditelné" -#: prefs.js:718 -msgid "Icon Size" -msgstr "Velikost ikony" +#: prefs.js:802 +msgid "Below Window (Default)" +msgstr "Pod oknem (výchozí)" -#: prefs.js:719 -msgid "" -"Allows to force fixed icon size and bypass the default adaptive algorithm." -msgstr "" -"Umožňuje vynutit pevnou velikost ikony a obejít výchozí adaptivní algoritmus." +#: prefs.js:810 +msgid "Show Close Window Button" +msgstr "Zobraz tlačítko Zavři okno" -#: prefs.js:724 prefs.js:751 -msgid "Adaptive (Default)" -msgstr "Adaptivní (výchozí)" +#: prefs.js:811 +msgid "Allows you to hide close window button" +msgstr "Umožňuje skrýt tlačítko zavření okna" -#: prefs.js:725 -msgid "256" -msgstr "256" - -#: prefs.js:726 -msgid "224" -msgstr "224" - -#: prefs.js:727 -msgid "208" -msgstr "208" - -#: prefs.js:728 -msgid "192" -msgstr "192" +#: prefs.js:828 +msgid "Show Workspace Preview Background" +msgstr "Zobrazit pozadí náhledu pracovní plochy" -#: prefs.js:729 -msgid "176" -msgstr "176" +#: prefs.js:829 +msgid "Allows to hide the background of the workspace preview" +msgstr "Umožňuje skrýt pozadí náhledu pracovní plochy" -#: prefs.js:730 -msgid "160" -msgstr "160" +#: prefs.js:846 +msgid "Workspace Background Corner Radius" +msgstr "Poloměr rohu pozadí pracovní plochy" -#: prefs.js:731 -msgid "144" -msgstr "144" - -#: prefs.js:745 -msgid "Folder Icon Size" -msgstr "Velikost ikony složky" +#: prefs.js:847 +msgid "Adjusts the corner radius of the workspace preview in the overview" +msgstr "Nastaví poloměr rohu náhledu pracovní plochy v přehledu" -#: prefs.js:746 -msgid "" -"Allows to disable the default adaptive algorithm and set a fixed size of " -"icons inside folders." -msgstr "" -"Umožňuje zakázat výchozí adaptivní algoritmus a nastavit pevnou velikost " -"ikon uvnitř složek." +#: prefs.js:855 prefs.js:1318 prefs.js:2022 +msgid "Search" +msgstr "Vyhledávání" -#: prefs.js:766 -msgid "Max App Folder Icon Grid Size" -msgstr "Maximální velikost mřížky ikony složky aplikace" +#: prefs.js:861 +msgid "App Search Icon Size" +msgstr "Velikost ikony vyhledávání aplikací" -#: prefs.js:767 +#: prefs.js:862 msgid "" -"Each folder icon shows (up to) 4 app icons as a preview of the folder " -"content, this option allows you to increase the number to 9 icons if folder " -"contains more than 4 or 8 apps. The latter avoids half empty folder icons." +"Size of results provided by the App Search Provider - smaller size allows to " +"fit more results. Adaptive option switches between default 96 and 64 for low " +"resolution displays" msgstr "" -"Každá ikona složky zobrazuje (až) 4 ikony aplikací jako náhled obsahu " -"složky. Tato možnost umožňuje zvýšit počet na 9 ikon, pokud složka obsahuje " -"více než 4 nebo 8 aplikací." +"Velikost ikon aplikací ve výsledcích hledání. Menší velikost - více " +"zobrazených výsledků. Adaptivní přepíná mezi výchozími hodnotami 96 a 64 pro " +"displeje s nízkým rozlišením" -#: prefs.js:772 -msgid "2x2 (Default)" -msgstr "2x2 (výchozí)" +#: prefs.js:866 +msgid "Adaptive" +msgstr "Adaptivní" -#: prefs.js:773 -msgid "3x3 for 5+ apps" -msgstr "3x3 pro 5+ aplikací" +#: prefs.js:869 +msgid "96 (Default)" +msgstr "96 (výchozí)" -#: prefs.js:774 -msgid "3x3 for 9+ apps" -msgstr "3x3 pro 9+ aplikací" - -#: prefs.js:788 -msgid "Columns per Page (0 for adaptive grid)" -msgstr "Počet sloupců na stránku (0 pro adaptivní mřížku)" - -#: prefs.js:789 -msgid "" -"Number of columns in application grid. If set to 0 (default setting) the " -"number will be set automatically to fit available height." -msgstr "" -"Počet sloupců v mřížce aplikace. Pokud je nastaveno na 0 (výchozí " -"nastavení), číslo se nastaví automaticky tak, aby odpovídalo dostupné výšce." - -#: prefs.js:803 -msgid "Rows per Page (0 for adaptive grid)" -msgstr "Počet řádků na stránku (0 pro adaptivní mřížku)" +#: prefs.js:893 +msgid "Max Search Results Rows" +msgstr "Maximální počet řádků výsledků hledání" -#: prefs.js:804 +#: prefs.js:894 msgid "" -"Number of rows in application grid. If set to 0 (default setting) the number " -"will be set automatically to fit available height." +"Sets the maximum number of rows for result lists of all search providers " +"except the window search provider which always lists all results" msgstr "" -"Počet řádků v mřížce aplikace. Pokud je nastaveno na 0 (výchozí nastavení), " -"číslo se nastaví automaticky tak, aby odpovídalo dostupné výšce." +"Nastaví maximální počet řádků pro seznamy výsledků všech poskytovatelů " +"vyhledávání vyhledávání s výjimkou zprostředkovatele vyhledávání v okně jenž " +"vždy zobrazuje všechny výsledky" -#: prefs.js:818 -msgid "Folder Columns per Page (0 for adaptive grid)" -msgstr "Počet sloupců složek na stránku (0 pro adaptivní mřížku)" +#: prefs.js:904 +msgid "Highlighting" +msgstr "Podtržení" -#: prefs.js:819 +#: prefs.js:905 msgid "" -"Number of columns in folder grid. If you leave the value on 0, the number of " -"columns will be calculated to fit all folder icons." +"The GNOME default highlighting style (bold) causes strings to be " +"\"randomly\" ellipsized, often preventing you from seeing the whole string, " +"even if there is space for it. The selected style will be applied to all " +"search results globally. If you are using other extensions that offer this " +"option, make sure you set the same setting in all of them." msgstr "" -"Počet sloupců v mřížce složek. Pokud ponecháte hodnotu na 0, počet sloupců " -"se vypočítá tak, aby se vešly všechny ikony složek." +"Výchozí styl zvýraznění GNOME (tučné) způsobuje náhodné zkreslení a často " +"brání zobrazení celého řetězce, i když je pro něj místo. Vybraný styl se " +"použije na všechny výsledky vyhledávání globálně. Pokud používáte jiná " +"rozšíření, která tuto možnost nabízejí, ujistěte se, že ve všech nastavíte " +"stejné nastavení." -#: prefs.js:833 -msgid "Folder Rows per Page (0 for adaptive grid)" -msgstr "Počet řádků složek na stránku (0 pro adaptivní mřížku)" - -#: prefs.js:834 -msgid "" -"Number of rows in folder grid. If you leave the value on 0, the number of " -"rows will be calculated to fit all folder icons." -msgstr "" -"Počet řádků v mřížce složek. Pokud ponecháte hodnotu na 0, počet řádků se " -"vypočítá tak, aby se vešly všechny ikony složek." +#: prefs.js:909 +msgid "Bold (Default)" +msgstr "Tučně (výchozí)" -#: prefs.js:841 prefs.js:1174 prefs.js:1492 -msgid "Search" -msgstr "Vyhledávání" +#: prefs.js:910 +msgid "Underline" +msgstr "Podtržení" -#: prefs.js:847 -msgid "App Search Icon Size" -msgstr "Velikost ikony vyhledávání aplikací" +#: prefs.js:911 +msgid "None" +msgstr "Nic" -#: prefs.js:848 -msgid "Size of results provided by the App Search Provider." -msgstr "Velikost ikon aplikací ve výsledcích hledání." +#: prefs.js:919 +msgid "Overview Background" +msgstr "Přehled - pozadí" -#: prefs.js:878 -msgid "Max Search Results Rows" -msgstr "Maximální počet řádků výsledků hledání" +#: prefs.js:925 +msgid "Show Wallpaper" +msgstr "Zobrazit tapetu" -#: prefs.js:879 +#: prefs.js:926 msgid "" -"Sets the maximum number of rows for result lists of all search providers " -"except window search provider which always lists all results." -msgstr "Nastaví maximální počet řádků pro seznamy výsledků všech vyhledávání." +"Replaces the solid grey background in the overview with the current desktop " +"wallpaper" +msgstr "Nahradí jednolité šedé pozadí v přehledu aktuální tapetou plochy" -#: prefs.js:888 -msgid "Overview Background" -msgstr "Přehled - pozadí" +#: prefs.js:942 +msgid "Brightness" +msgstr "Jas" -#: prefs.js:894 -msgid "Show Static Background" -msgstr "Zobrazit statické pozadí" +#: prefs.js:943 +msgid "Brightness of the background wallpaper in the overview" +msgstr "Jas tapety na pozadí v přehledu" -#: prefs.js:895 -msgid "Show static background wallpaper instead of the solid grey color." -msgstr "Zobrazit statickou tapetu na pozadí místo šedé barvy." +#: prefs.js:959 +msgid "Brightness for Search View" +msgstr "Jas pro zobrazení hledání" -#: prefs.js:911 +#: prefs.js:960 +msgid "" +"Allows you to set a lower background brightness for search view mode where " +"text visibility is more important" +msgstr "" +"Umožňuje nastavit nižší jas pozadí pro režim zobrazení vyhledávání pro lepší " +"viditelnost textu" + +#: prefs.js:976 msgid "Blur Window Picker Background" -msgstr "Rozostření pozadí" +msgstr "Rozostření pozadí výběru okna" -#: prefs.js:912 -msgid "Blur background wallpaper (if enabled) in the window picker view." -msgstr "Rozostření tapety na pozadí (pokud je povoleno)." +#: prefs.js:977 +msgid "Sets the amount of background blur in the window picker view" +msgstr "Rozostření tapety na pozadí ve výběru oken" -#: prefs.js:928 +#: prefs.js:993 msgid "Blur App Grid/Search View Background" msgstr "Rozostření pozadí v mřížce aplikací/hledání" -#: prefs.js:929 +#: prefs.js:994 msgid "" -"Blur background wallpaper (if enabled) in the app grid and search results " -"views." +"Sets the amount of background blur in the app grid and search results views" msgstr "" -"Rozostření tapety na pozadí (je-li povoleno) v mřížce aplikace a zobrazení " -"výsledků vyhledávání." +"Nastavení hodnoty rozostření tapety na pozadí v mřížce aplikace a zobrazení " +"výsledků vyhledávání" -#: prefs.js:937 +#: prefs.js:1002 msgid "Smooth Blur Transitions" msgstr "Plynulé přechody rozostření" -#: prefs.js:938 +#: prefs.js:1003 msgid "" -"Makes blur transitions smoother but can impact overall smoothness of " -"overview animations." +"Allows for smoother blur transitions, but can affect the overall smoothness " +"of overview animations on weak hardware" msgstr "" "Umožňuje hladší přechody rozostření, ale může ovlivnit celkovou plynulost " -"animací v přehledu." +"animací v přehledu" -#: prefs.js:953 prefs.js:980 prefs.js:1002 +#: prefs.js:1018 msgid "Overview" msgstr "Přehled" -#: prefs.js:959 +#: prefs.js:1024 msgid "Overview Mode" msgstr "Režim přehledu" -#: prefs.js:960 +#: prefs.js:1025 msgid "" -"The Expose Windows on Hover mode do not expose the workspace preview windows " -"until the mouse pointer enters any window.\n" -"The Static Workspace mode does not scale the workspace preview, it only " -"shows Dash and workspace thumbnails over the desktop. Clicking on a " -"workspace thumbnail scales the ws preview and exposes its windows like in " -"the default overview mode." +"The Expose Windows on Hover mode does not expose the workspace preview " +"windows until the mouse pointer enters any window\n" +"The Static Workspace mode keeps the workspace static when you activate the " +"overview, it only shows Dash, workspace thumbnails and search entry over the " +"workspace and only clicking on an active workspace thumbnail activates the " +"default overview" msgstr "" -"Režim Zobrazit okna při najetí myší neodkryje okna náhledu pracovního " +"Režim Zobrazit okna při módu najetí myší neodkryje okna náhledu pracovního " "prostoru, dokud ukazatel myši nenajede do jakéhokoli okna.\n" -"Režim Statická pracovní plocha nemění měřítko náhledu pracovní plochy, " -"zobrazuje pouze Dash a miniatury pracovní plochy. Kliknutím na miniaturu " -"pracovního prostoru se změní měřítko náhledu ws a zobrazí se jeho okna jako " -"ve výchozím režimu přehledu." - -#: prefs.js:965 prefs.js:1259 prefs.js:1277 prefs.js:1317 -msgid "Default" -msgstr "Výchozí" +"Režim Statická pracovní plocha ji zachová statickou při náhledu, zobrazuje " +"jen Dash, miniatury pracovní plochy a vyhledávání. Jen kliknutím na aktivní " +"miniaturu pracovní plochy se aktivuje výchozí přehled" -#: prefs.js:966 +#: prefs.js:1030 msgid "Expose Windows on Hover" msgstr "Zobrazit okna při najetí myší" -#: prefs.js:967 +#: prefs.js:1031 msgid "Static Workspace" msgstr "Statická pracovní plocha" -#: prefs.js:974 +#: prefs.js:1038 msgid "Startup State" msgstr "Stav spuštění" -#: prefs.js:975 -msgid "Allows to change the state in which GNOME Shell starts a session." -msgstr "Umožňuje změnit stav, ve kterém GNOME Shell zahajuje relaci." +#: prefs.js:1039 +msgid "Allows to change the state in which GNOME Shell starts a session" +msgstr "Umožňuje změnit stav ve kterém GNOME Shell zahajuje relaci" + +#: prefs.js:1043 +msgid "Overview (Default)" +msgstr "Přehled (výchozí)" -#: prefs.js:981 +#: prefs.js:1044 msgid "Desktop" msgstr "Desktop" -#: prefs.js:982 prefs.js:1003 +#: prefs.js:1045 prefs.js:1090 prefs.js:1133 msgid "Applications" msgstr "Aplikace" -#: prefs.js:989 +#: prefs.js:1052 +msgid "Escape Key Behavior" +msgstr "Chování klávesy Escape" + +#: prefs.js:1053 msgid "" -"Hot Corner (Install Custom Hot Corners - Extended extension for more options)" +"Allows you to close the overview with a single press of the Escape key, even " +"from the application grid or from search, if the search entry field does not " +"have focus" msgstr "" -"Hot Corner (nainstalujte Custom Hot Corners - Extended rozšíření pro více " -"možností)" +"Umožňuje zavřít přehled jediným stisknutím klávesy Escape, a to i z mřížky " +"aplikace nebo z vyhledávání, pokud pole pro zadání vyhledávání nemá fokus" -#: prefs.js:995 -msgid "Hot corner Action" -msgstr "Hot Corner Akce" +#: prefs.js:1058 +msgid "Close Overview" +msgstr "Zavři Přehled" + +#: prefs.js:1066 +msgid "Click Empty Space To Close" +msgstr "Klikni prázdné místo pro zavření" -#: prefs.js:996 +#: prefs.js:1067 +msgid "Enables clicking on an empty space in the overview to close it" +msgstr "Povolí kliknutí na prázdné místo v přehledu pro jeho zavření" + +#: prefs.js:1076 +msgid "Overlay Key (Super/Windows)" +msgstr "Překryvná klávesa (Super/Windows)" + +#: prefs.js:1082 +msgid "Single-Press Action" +msgstr "Akce jedním tlačítkem" + +#: prefs.js:1083 msgid "" -"Disable or change behavior of hot corner. Holding down the Ctrl key while " -"hitting the hot corner switches between Overview/Applications actions." +"Disable or change behavior when you press and release the Super key. The " +"\"Search Windows\" options requires the \"WSP (Window Search Provider)\" " +"extension installed and enabled. Link is available on the Modules tab in " +"Settings. If you want another extension (like AATWS) to handle the overlay " +"key, set this option to \"Overview - Window Picker (Default)\" and the " +"\"Double-Press Action\" option to \"Applications (Default)\"" msgstr "" -"Zakázat nebo změnit chování Hot Corner. Podržením klávesy Ctrl při stisknutí " -"Hot Corner se přepíná mezi akcemi Přehled/Aplikace." +"Zakáže nebo změní chování při stisknutí a uvolnění klávesy Super. Možnosti " +"\"Hledat ve Windows\" vyžaduje nainstalované a povolené rozšíření \"WSP " +"(Window Search Provider)\". Odkaz je k dispozici na kartě Moduly v " +"Nastavení. Pokud chcete, aby se o překryvnou klávesu staralo jiné rozšíření " +"(například AATWS), nastavte tuto možnost na \"Přehled - výběr oken " +"(výchozí)\" a možnost \"Akce při dvojitém stisknutí\" na \"Aplikace " +"(výchozí)\"." + +#: prefs.js:1088 prefs.js:1131 +msgid "Follow Global Overview Mode" +msgstr "Podle globálního nastavení" + +#: prefs.js:1089 prefs.js:1132 +msgid "Overview - Window Picker (Default)" +msgstr "Přehled - Okno pro výběr (Výchozí)" + +#: prefs.js:1091 prefs.js:1134 +msgid "Overview - Static WS Preview" +msgstr "Přehled - Statický náhled ploch" + +#: prefs.js:1092 prefs.js:1135 +msgid "Overview - Static Workspace" +msgstr "Přehled - Statická pracovní plocha" + +#: prefs.js:1093 prefs.js:1109 prefs.js:1136 +msgid "Search Windows (requires WSP extension)" +msgstr "Vyhledávání oken (vyžaduje rozšíření WSP)" -#: prefs.js:1010 -msgid "Enable Hot Corner in Full-Screen mode" -msgstr "Aktivovat Hot Corner v režimu celé obrazovky" +#: prefs.js:1102 +msgid "Double-Press Action" +msgstr "Akce dvojitého stisknutí" -#: prefs.js:1011 +#: prefs.js:1103 msgid "" -"If you often work with full-screen applications and want the hot corner to " -"be usable." +"Disable or change behavior when you double-press the Super key. The \"Search " +"Windows\" option requires the \"WSP (Window Search Provider)\" extension " +"installed and enabled. The \"Static WS Overview - Expose Windows\" option " +"allows you to switch to default Activities Overview window picker view if " +"you set static workspace (preview) for the single press/release Super key " +"action" msgstr "" -"Pokud často pracujete s celoobrazovkovými aplikacemi a chcete, aby byl Hot " -"Corner použitelný." - -#: prefs.js:1020 -msgid "Show Ripples Animation" -msgstr "Zobrazit animaci vlnění" +"Zakázat nebo změnit chování při dvojitém stisknutí klávesy Super. Volba " +"„Hledat v oknech“ vyžaduje, aby bylo aktivováno rozšíření " +"\"WindowSearchProvider\". Volba \"Statický přehled ploch - vystavit okna“ " +"umožňuje přepnout na výchozí zobrazení výběru oken Přehledu činností. Pokud " +"nastavíte statický pracovní prostor (náhled) pro akci jediného stisknutí / " +"uvolnění klávesy Super" -#: prefs.js:1021 -msgid "Ripples animation shows up when you trigger hot corner." -msgstr "Animace vlnění se zobrazí, když spustíte Hot Corner." +#: prefs.js:1108 +msgid "Applications (Default)" +msgstr "Aplikace (výchozí)" -#: prefs.js:1036 -msgid "Dash Icon Click" -msgstr "Dash - kliknutí na ikonu" +#: prefs.js:1110 +msgid "Overview - Window Picker" +msgstr "Přehled - Okno pro výběr" -#: prefs.js:1037 -msgid "" -"if the app you clicked on has more than one window and the recently used " -"window is not on the current workspace, the overview can switch to the " -"workspace with the recent window." +#: prefs.js:1119 +msgid "Hot Corner (Install Custom Hot Corners - Extended for more options)" msgstr "" -"pokud aplikace, na kterou jste klikli, má více než jedno okno a naposledy " -"použité okno není na aktuální pracovní ploše, přehled se může přepnout na " -"pracovní plochu s posledním oknem." +"Hot Corner (pro více možností nainstalujte rozšíření \"Custom Hot Corners - " +"Extended\")" -#: prefs.js:1042 -msgid "Activate Last Used Window Immediately" -msgstr "Okamžitě aktivuje naposledy použité okno" +#: prefs.js:1125 +msgid "Hot Corner Action" +msgstr "Hot Corner Akce" -#: prefs.js:1043 -msgid "Switch to Workspace with Recently Used Window" -msgstr "Přepnout na plochu s naposledy použitým oknem" +#: prefs.js:1126 +msgid "" +"Disable or change behavior of the hot corner. Holding down the Ctrl key " +"while hitting the hot corner switches between Overview/Applications actions. " +"The \"Search Windows\" option requires the \"WSP (Window Search Provider)\" " +"extension installed and enabled" +msgstr "" +"Zakázat nebo změnit chování Hot Corner. Podržením klávesy Ctrl při najetí na " +"Hot Corner přepnete mezi akcemi Přehled/Aplikace. Možnost \"Hleta v oknech\" " +"vyžaduje nainstalované a povolené rozšíření \"WSP (Window Search Provider)\"" -#: prefs.js:1056 -msgid "Close Workspace Button" -msgstr "Tlačítko Zavřít pracovní plochu" +#: prefs.js:1144 +msgid "Hot Corner Position" +msgstr "Hot Corner pozice" -#: prefs.js:1057 +#: prefs.js:1145 msgid "" -"The Close Workspace button appears on the workspace thumbnail when you hover " -"over it and allows you to close all windows on the workspace. You can choose " -"a safety lock to prevent accidental use." +"Choose which corner of your monitors will be active. If you choose \"Follow " +"Dash\" option, the corner will be placed near the left or top edge of the " +"Dash. The last option extends the hot corner trigger to cover the entire ege " +"of the monitor where Dash is located" msgstr "" -"Tlačítko Zavřít pracovní plochu se objeví na miniatuře pracovní plochy, když " -"na ni umístíte ukazatel myši, a umožní vám zavřít všechna okna na pracovní " -"ploše. Můžete si vybrat bezpečnostní zámek, který zabrání náhodnému použití." +"Vyberte, který roh monitorů bude aktivní. Pokud zvolíte možnost „Následuj " +"Dash“, bude umístěn v blízkosti okraje panelu Dash. „Následuj Dash - Okraj“ " +"rozšiřuje aktivní roh tak, aby pokrýval celý okraj monitoru, na kterém je " +"umístěn panel Dash" -#: prefs.js:1063 -msgid "Single Click" -msgstr "Jedno kliknutí" - -#: prefs.js:1064 -msgid "Double Click" -msgstr "Dvojité kliknutí" +#: prefs.js:1154 +msgid "Follow Dash" +msgstr "Následuj Dash" -#: prefs.js:1065 -msgid "Ctrl Key + Click" -msgstr "Klávesa Ctrl + kliknutí" +#: prefs.js:1155 +msgid "Follow Dash - Hot Edge" +msgstr "Následuj Dash - Okraj" -#: prefs.js:1078 -msgid "Apps Order" -msgstr "Pořadí aplikací" +#: prefs.js:1163 +msgid "Enable Hot Corner in Full-Screen Mode" +msgstr "Hot Corner aktivovat v režimu celé obrazovky" -#: prefs.js:1079 +#: prefs.js:1164 msgid "" -"Choose sorting method for the app grid. Note that sorting by alphabet and " -"usage ignores folders." +"If you often work with full-screen applications and want the hot corner to " +"be usable" msgstr "" -"Vyberte metodu řazení pro mřížku aplikace. Řazení podle abecedy a použití " -"ignoruje složky." +"Pokud často pracujete s celoobrazovkovými aplikacemi a chcete, aby byl Hot " +"Corner použitelný" -#: prefs.js:1084 -msgid "Custom (Default)" -msgstr "Vlastní (výchozí)" +#: prefs.js:1174 +msgid "Show Ripples Animation" +msgstr "Zobrazit animaci vlnění" -#: prefs.js:1085 -msgid "Alphabet" -msgstr "Abeceda" +#: prefs.js:1175 +msgid "" +"The ripple animation is played when the hot corner is activated. The ripple " +"size has been reduced to be less distracting" +msgstr "" +"Při aktivaci rohu se přehraje animace vlnění. Velikost vlnění byla zmenšena, " +"aby méně odváděla pozornost" -#: prefs.js:1086 -msgid "Usage" -msgstr "Použití" +#: prefs.js:1191 +msgid "Isolate Workspaces" +msgstr "Izolovat pracovní plochy" -#: prefs.js:1093 -msgid "App Grid Content" -msgstr "Obsah mřížky aplikací" +#: prefs.js:1192 +msgid "Dash will only show apps and windows from the current workspace" +msgstr "Dash zobrazí pouze aplikace a okna z aktuální pracovní plochy" + +#: prefs.js:1202 +msgid "App Icon - Click Behavior" +msgstr "Aplikační ikony - chování při kliknutí" -#: prefs.js:1094 +#: prefs.js:1203 msgid "" -"The default Shell removes favorite apps, this option lets you duplicate them " -"in the grid or remove also running applications. Option \"Favorites and " -"Running First\" only works with the Alphabet and Usage sorting." +"Choose your preferred behavior when clicking on an app icon. The \"Prefer " +"Current Workspace\" option opens a new app window if not present in the " +"current workspace. The \"Open New Window\" option also switches behavior of " +"the middle click to \"Activate\" since its default behavior is to open a new " +"window" msgstr "" -"Výchozí prostředí Shell odebere oblíbené aplikace, tato možnost vám umožňuje " -"duplikovat je v mřížce nebo odebrat také spuštěné aplikace. Možnost " -"„Oblíbené a spuštěné jako první“ funguje pouze s řazením podle abecedy a " -"použití." - -#: prefs.js:1099 -msgid "Include All" -msgstr "Zahrnout vše" +"Zvolte preferované chování při kliknutí na ikonu aplikace. Možnost " +"„Preferovat aktuální pracovní plochu“ otevře nové okno aplikace, pokud není " +"přítomna na aktuální pracovní ploše. Možnost „Otevřít nové okno“ také " +"přepíná chování prostředního kliknutí na „Aktivovat“, protože jeho výchozím " +"chováním je otevření nového okna" -#: prefs.js:1100 -msgid "Include All - Favorites and Running First" -msgstr "Zahrnout vše – Oblíbené a Spuštěné jako první" +#: prefs.js:1207 +msgid "Activate App Immediately" +msgstr "Okamžitě aktivuje aplikace" -#: prefs.js:1101 -msgid "Exclude Favorites (Default)" -msgstr "Vyloučit oblíbené (výchozí)" +#: prefs.js:1208 +msgid "First Switch to Workspace" +msgstr "První přepnutí do pracovního prostoru" -#: prefs.js:1102 -msgid "Exclude Running" -msgstr "Vyloučit spuštěné" +#: prefs.js:1209 +msgid "Open New Window (if supported)" +msgstr "Otevři nové okno (je-li podporováno)" -#: prefs.js:1103 -msgid "Exclude Favorites and Running" -msgstr "Vyloučit Oblíbené a spuštěné" +#: prefs.js:1210 +msgid "Prefer Current Workspace" +msgstr "Preferuj aktuální pracovní plochu" -#: prefs.js:1110 -msgid "Active Icons in Folder Preview" -msgstr "Aktivní ikony v náhledu složky" +#: prefs.js:1218 +msgid "App Icon - Scroll Action" +msgstr "Aplikační ikony - Akce posunu" -#: prefs.js:1111 +#: prefs.js:1219 msgid "" -"If enabled, clicking an app icon in a folder preview directly opens the app " -"without having to open the folder first. Middle button opens new window of " -"the app without closing the overview, so you can open multiple apps in a row " -"on the current workspace and secondary button opens the folder." +"Choose the behavior when scrolling over an app icon. The window cycler works " +"with a list of windows sorted by the \"Most Recently Used\" and grouped by " +"workspaces. Scrolling up cycles through previously used windows on the same " +"workspace and then switches to another workspace, if any" msgstr "" -"Pokud je tato možnost povolena, kliknutím na ikonu aplikace v náhledu složky " -"se aplikace otevře přímo, aniž byste museli nejprve otevřít složku. " -"Prostřední tlačítko otevře nové okno aplikace bez zavření přehledu, takže na " -"aktuálním pracovním prostoru můžete otevřít více aplikací v řadě a " -"sekundární tlačítko otevře složku." +"Výběr chování při posouvání přes ikonu aplikace. Algoritmus cyklení oken " +"pracuje se seznamem oken seřazených podle „Nejnověji použitých“ a " +"seskupených podle pracovních ploch. Posouvání nahoru cykluje dříve použitá " +"okna na stejné pracovní ploše a poté se přepne na jinou pracovní plochu, " +"pokud nějaká existuje" -#: prefs.js:1120 -msgid "Center Open Folders" -msgstr "Vycentrovat otevřené složky" +#: prefs.js:1224 +msgid "Cycle App Windows - Highlight Selected" +msgstr "Cykluj aplikační okna - zvýrazni vybrané" -#: prefs.js:1121 -msgid "" -"App folder may open in the center of the screen or above the source folder " -"icon." -msgstr "" -"Složka aplikace se může otevřít ve středu obrazovky nebo nad ikonou zdrojové " -"složky." +#: prefs.js:1225 +msgid "Cycle App Windows - Highlight App" +msgstr "Cykluj aplikační okna - zvýrazni aplikaci" -#: prefs.js:1130 -msgid "Allow Incomplete Pages" -msgstr "Povolit neúplné stránky" +#: prefs.js:1239 +msgid "Close Workspace Button" +msgstr "Tlačítko Zavřít pracovní plochu" -#: prefs.js:1131 +#: prefs.js:1240 msgid "" -"If disabled, icons from the next page (if any) are automatically moved to " -"fill any empty slot left after an icon was (re)moved (to a folder for " -"example)." +"The Close Workspace button appears on the workspace thumbnail when you hover " +"over it and allows you to close all windows on the workspace. You can choose " +"a \"safety lock\" to prevent accidental use" msgstr "" -"Pokud je zakázáno, ikony z další stránky (pokud existují) se automaticky " -"přesunou tak, aby zaplnily jakýkoli prázdný slot, který zbyl po (znovu) " -"přesunutí ikony (například do složky)." +"Tlačítko Zavřít pracovní plochu se objeví na miniatuře pracovní plochy, když " +"na ni umístíte ukazatel myši a umožní vám zavřít všechna okna na pracovní " +"ploše. Můžete si vybrat bezpečnostní zámek, který zabrání náhodnému použití" -#: prefs.js:1140 -msgid "App Labels Behavior" -msgstr "Chování štítků aplikací" +#: prefs.js:1245 +msgid "Single Click" +msgstr "Jedno kliknutí" -#: prefs.js:1141 -msgid "Choose how and when to display app names." -msgstr "Vyberte, jak a kdy se mají zobrazovat názvy aplikací." +#: prefs.js:1246 +msgid "Double Click" +msgstr "Dvojité kliknutí" -#: prefs.js:1146 -msgid "Ellipsized - Expand Selected (Default)" -msgstr "Zkrácené – rozbalit vybrané (výchozí)" +#: prefs.js:1247 +msgid "Ctrl Key + Click" +msgstr "Klávesa Ctrl + kliknutí" -#: prefs.js:1147 -msgid "Always Expanded" -msgstr "Vždy rozbalené" +#: prefs.js:1260 +msgid "Secondary Button Click Action" +msgstr "Akce druhého tlačítka myši" -#: prefs.js:1148 -msgid "Hidden - Show Selected Only" -msgstr "Skryté - zobrazit pouze vybrané" +#: prefs.js:1261 +msgid "Allows you to add a secondary mouse click action to the window preview" +msgstr "Umožňuje přidat do náhledu okna akci na kliknutí druhého tlačítka myši" -#: prefs.js:1154 -msgid "Reset App Grid Layout" -msgstr "Resetovat rozložení mřížky aplikace" +#: prefs.js:1265 prefs.js:1281 prefs.js:1297 +msgid "Activate Window (Default)" +msgstr "Aktivuj okno (výchozí)" -#: prefs.js:1155 -msgid "" -"Removes all stored app grid icons positions, after the reset icons will be " -"ordered alphabetically." -msgstr "" -"Odebere všechny uložené pozice mřížky aplikací, po resetování budou ikony " -"seřazeny podle abecedy." +#: prefs.js:1266 prefs.js:1282 +msgid "Close Window" +msgstr "Zavři okno" -#: prefs.js:1163 -msgid "Remove App Grid Folders" -msgstr "Odebrat složky mřížky aplikace" +#: prefs.js:1267 prefs.js:1283 prefs.js:1298 +msgid "Search For Same App Windows" +msgstr "Hledej pro stejné aplikační okno" -#: prefs.js:1164 -msgid "Removes all folders, folder apps move to root grid." +#: prefs.js:1268 prefs.js:1284 prefs.js:1299 +msgid "Create Window Thumbnail/PiP (requires WTMB extension)" +msgstr "Vytvoření náhledu okna - PIP (vyžaduje WTMB rozšíření)" + +#: prefs.js:1276 +msgid "Middle Button Click Action" +msgstr "Akce kliknutí prostředního tlačítka" + +#: prefs.js:1277 +msgid "Allows you to add a middle mouse click action to the window preview" msgstr "" -"Odebere všechny složky, aplikace složek se přesunou do kořenové mřížky." +"Umožňuje přidat do náhledu okna akci na kliknutí prostředního tlačítka myši" -#: prefs.js:1186 -msgid "Enable Window Search Provider" -msgstr "Povolit poskytovatele vyhledávání oken" +#: prefs.js:1292 +msgid "App Icon Click Action" +msgstr "Akce kliknutí na ikonu aplikace" -#: prefs.js:1187 +#: prefs.js:1293 msgid "" -"Activates the window search provider that adds open windows to the search " -"results. You can search app names and window titles. You can also use \"wq/" -"\" prefix to suppress results from other search providers." +"Select the action to take when the application icon on the window preview is " +"clicked" msgstr "" -"Aktivuje poskytovatele vyhledávání oken, který do výsledků vyhledávání " -"přidává otevřená okna. Můžete vyhledávat názvy aplikací a názvy oken. Můžete " -"také použít předponu „wq/“ k potlačení výsledků od jiných poskytovatelů " -"vyhledávání." +"Vyberte akci, která se má provést po kliknutí na ikonu aplikace v náhledu " +"okna" -#: prefs.js:1195 -msgid "Enable Recent Files Search Provider" -msgstr "Povolit poskytovatele vyhledávání nedávných souborů" +#: prefs.js:1307 +msgid "Always Activate Selected" +msgstr "Vždy aktivovat vybrané" -#: prefs.js:1196 +#: prefs.js:1308 msgid "" -"Activates the recent files search provider that can be triggered by a dash " -"icon, Ctrl + Space hotkey or by typing \"fq//\" prefix in the search entry " -"field. This option needs File History option enabled in the GNOME Privacy " -"settings." +"If enabled, the currently selected window will be activated when leaving the " +"Overview even without clicking. Usage example - press Super to open the " +"Overview, place mouse pointer over a window, press Super again to activate " +"the window" msgstr "" -"Aktivuje poskytovatele vyhledávání posledních souborů, který lze spustit " -"ikonou v Dash, klávesovou zkratkou Ctrl + mezerník nebo zadáním předpony " -"„fq//“ do pole pro zadání vyhledávání. Tato možnost vyžaduje, aby byla v " -"nastavení ochrany osobních údajů GNOME povolena možnost Historie souborů." +"Je-li povoleno, aktuálně vybrané okno se aktivuje při opuštění Přehledu i " +"bez kliknutí. Příklad použití: stisknutím tlačítka Super otevřete Přehled, " +"umístěte ukazatel myši nad okno, opětovným stisknutím tlačítka Super okno " +"aktivujte" -#: prefs.js:1204 +#: prefs.js:1324 msgid "Enable Fuzzy Match" msgstr "Povolit neúplnou shodu" -#: prefs.js:1205 +#: prefs.js:1325 msgid "" "Enabling the fuzzy match allows you to skip letters in the pattern you are " "searching for and find \"Firefox\" even if you type \"ffx\". Works only for " -"the App, Window and Recent files search providers." +"the App, Windows, Extensions and Recent files search providers" msgstr "" -"Povolení neúplné shody vám umožní přeskočit písmena v řetězci, který hledáte " -"(například najde \"Firefox\", i když zadáte \"ffx\"). Funguje pouze pro " -"poskytovatele vyhledávání aplikací, oken a posledních souborů." +"Povolení přibližné shody umožní přeskočit písmena v řetězci, který hledáte " +"(najde \"Firefox\" i jen zadáním \"ffx\"). Funguje pouze pro poskytovatele " +"vyhledávání aplikací, oken a posledních souborů" -#: prefs.js:1223 -msgid "Animations - General" -msgstr "Animace - Obecné" +#: prefs.js:1333 +msgid "Animations" +msgstr "Animace" -#: prefs.js:1238 +#: prefs.js:1348 msgid "Animation Speed" msgstr "Rychlost animace" -#: prefs.js:1239 +#: prefs.js:1349 msgid "" -"Adjusts the global animation speed in % of the default duration - higher " -"value means slower animation." +"Adjusts the global animation speed in percentage of the default duration - " +"higher value means slower animation" msgstr "" -"Upraví globální rychlost animace v % u výchozí doby trvání – vyšší hodnota " -"znamená pomalejší animaci." - -#: prefs.js:1247 -msgid "Animations - Overview" -msgstr "Animace – přehled" +"Upraví globální rychlost animace v procentech výchozí doby trvání – vyšší " +"hodnota znamená pomalejší animaci." -#: prefs.js:1253 +#: prefs.js:1357 msgid "App Grid Animation" msgstr "Animace mřížky aplikací" -#: prefs.js:1254 +#: prefs.js:1358 msgid "" "When entering the App Grid view, the app grid animates from the edge of the " -"screen. You can choose direction, keep it Default (direction will be chosen " -"automatically) or disable the animation if you don't like it." +"screen. You can choose the direction, keep the Default (direction will be " +"selected automatically) or disable the animation if you don't like it" msgstr "" "Mřížka aplikací se animuje od okraje obrazovky. Můžete si vybrat směr, " -"ponechat výchozí (směr bude vybrán automaticky) nebo vypnout animaci, pokud " -"se vám nelíbí." +"ponechat výchozí (směr bude vybrán automaticky) nebo vypnout animaci" -#: prefs.js:1261 prefs.js:1279 +#: prefs.js:1364 prefs.js:1381 msgid "Right to Left" msgstr "Zprava doleva" -#: prefs.js:1262 prefs.js:1280 +#: prefs.js:1365 prefs.js:1382 msgid "Left to Right" msgstr "Zleva doprava" -#: prefs.js:1263 prefs.js:1281 +#: prefs.js:1366 prefs.js:1383 msgid "Bottom to Top" msgstr "Zespodu nahoru" -#: prefs.js:1264 prefs.js:1282 +#: prefs.js:1367 prefs.js:1384 msgid "Top to Bottom" msgstr "Zhora dolů" -#: prefs.js:1271 +#: prefs.js:1374 msgid "Search View Animation" msgstr "Animace zobrazení vyhledávání" -#: prefs.js:1272 +#: prefs.js:1375 msgid "" "When search is activated the search view with search results can animate " -"from the edge of the screen. You can choose direction, keep it Default " +"from the edge of the screen. You can choose the direction, keep the Default " "(currently Bottom to Top) or disable the animation if you don't like it." msgstr "" -"Když je aktivováno vyhledávání, zobrazení vyhledávání s výsledky vyhledávání " +"Je-li aktivováno vyhledávání, zobrazení vyhledávání s výsledky vyhledávání " "se může animovat od okraje obrazovky. Můžete si vybrat směr, ponechat " -"výchozí (aktuálně zdola nahoru) nebo zakázat animaci, pokud se vám nelíbí." +"výchozí (aktuálně zdola nahoru) nebo zakázat animaci." -#: prefs.js:1290 +#: prefs.js:1392 msgid "Workspace Preview Animation" msgstr "Animace náhledu pracovního prostoru" -#: prefs.js:1291 +#: prefs.js:1393 msgid "" "When entering / leaving the App Grid / Search view, the workspace preview " "can animate to/from workspace thumbnail." @@ -1207,19 +1309,39 @@ msgstr "" "Při vstupu / opuštění mřížky aplikací / vyhledávání se náhled pracovního " "prostoru může animovat do/z miniatury pracovního prostoru." -#: prefs.js:1297 +#: prefs.js:1398 msgid "Enable" msgstr "Povolit" -#: prefs.js:1305 +#: prefs.js:1406 msgid "Workspace Switcher" msgstr "Přepínač pracovního prostoru" -#: prefs.js:1311 +#: prefs.js:1412 +msgid "Wraparound" +msgstr "Dokola" + +#: prefs.js:1413 +msgid "Continue from the last workspace to the first and vice versa" +msgstr "Pokračování z posledního pracovního prostoru do prvního a naopak" + +#: prefs.js:1421 +msgid "Ignore Last (empty) Workspace" +msgstr "Ignoruj poslední (prázdný) pracovní prostor" + +#: prefs.js:1422 +msgid "" +"In Dynamic workspaces mode, there is always one empty workspace at the end. " +"Switcher can ignore this last workspace" +msgstr "" +"V režimu dynamických pracovních prostorů je na konci vždy jeden prázdný " +"pracovní prostor. Přepínač může tento poslední pracovní prostor ignorovat" + +#: prefs.js:1430 msgid "Workspace Switcher Animation" msgstr "Animace" -#: prefs.js:1312 +#: prefs.js:1431 msgid "" "Allows you to disable movement of the desktop background during workspace " "switcher animation outside of the overview. The Static Background mode also " @@ -1229,15 +1351,37 @@ msgstr "" "prostoru mimo přehled. Režim Statické pozadí také udržuje ikony Conky a " "plochy na svém místě během přepínání." -#: prefs.js:1318 +#: prefs.js:1436 msgid "Static Background" msgstr "Statické pozadí" -#: prefs.js:1325 +#: prefs.js:1444 +msgid "Workspace Switcher Mode (Isolate Monitors)" +msgstr "Režim přepínače pracovní plochy (izolované monitory)" + +#: prefs.js:1445 +msgid "" +"Note that this is a workaround, not full-fledged feature. GNOME Shell does " +"not support separate workspaces for each monitor, so V-Shell switches " +"workspaces only on the primary monitor and moves windows across workspaces " +"on secondary monitors in order to simulate independent behavior. The current " +"monitor is determined by the position of the mouse pointer" +msgstr "" +"Poznámka: jedná se o řešení, nikoli o plnohodnotnou funkci. GNOME Shell " +"nepodporuje samostatné pracovní prostory pro každý monitor, takže V-Shell " +"přepíná pracovní prostory pouze na primárním monitoru a na sekundárních " +"monitorech přesouvá okna mezi pracovními prostory tak, aby simuloval " +"nezávislé chování. Aktuální monitor je určen polohou ukazatele myši" + +#: prefs.js:1450 +msgid "Current Monitor" +msgstr "Aktuální monitor" + +#: prefs.js:1458 msgid "Workspace Switcher Popup Mode" msgstr "Vyskakovací režim přepínače pracovní plochy" -#: prefs.js:1326 +#: prefs.js:1459 msgid "" "This popup shows up when you switch workspace using a keyboard shortcut or " "gesture outside of the overview. You can to disable the popup at all, or " @@ -1249,305 +1393,1176 @@ msgstr "" "zakázat nebo jej zobrazit na aktuálním monitoru (na tom s ukazatelem myši) " "místo na primárním." -#: prefs.js:1332 +#: prefs.js:1464 msgid "Show on Primary Monitor (Default)" msgstr "Zobrazit na primárním monitoru (výchozí)" -#: prefs.js:1333 +#: prefs.js:1465 msgid "Show on Current Monitor" msgstr "Zobrazit na aktuálním monitoru" -#: prefs.js:1341 +#: prefs.js:1473 msgid "Notifications" msgstr "Oznámení" -#: prefs.js:1347 -msgid "Notification Banner Position" -msgstr "Pozice oznamovacího banneru" - -#: prefs.js:1348 -msgid "Choose where the notification pop-ups appear on the screen." -msgstr "Vyberte, kde se na obrazovce zobrazí vyskakovací okna." - -#: prefs.js:1353 -msgid "Top Left" -msgstr "Nahoře vlevo" - -#: prefs.js:1354 -msgid "Top Middle" -msgstr "Nahoře uprostřed" - -#: prefs.js:1355 -msgid "Top Right (Default)" -msgstr "Nahoře vpravo (výchozí)" - -#: prefs.js:1356 -msgid "Bottom Left" -msgstr "Dole vlevo" - -#: prefs.js:1357 -msgid "Bottom Middle" -msgstr "Dole uprostřed" - -#: prefs.js:1358 -msgid "Bottom Right" -msgstr "Dole vpravo" - -#: prefs.js:1365 +#: prefs.js:1479 msgid "Window Attention Handler" msgstr "Okno - vyžádání pozornosti" -#: prefs.js:1366 +#: prefs.js:1480 msgid "" "When a window requires attention (often a new window), GNOME Shell shows you " "a notification about it. You can disable popups of these messages " "(notification will be pushed into the message tray silently) or focus the " -"source window immediately instead." +"source window immediately instead" msgstr "" "Když okno vyžaduje pozornost (často nové okno), GNOME Shell vám o tom " "zobrazí upozornění. Můžete deaktivovat vyskakovací okna těchto zpráv " -"(oznámení bude do panelu zpráv vloženo tiše) nebo místo toho okamžitě " -"zvýrazní zdrojové okno." +"(oznámení bude do panelu zpráv vloženo tiše) nebo nechat okamžitě zvýraznit " +"zdrojové okno" -#: prefs.js:1371 prefs.js:1386 +#: prefs.js:1484 prefs.js:1499 msgid "Show Notifications (Default)" msgstr "Zobrazit oznámení (výchozí)" -#: prefs.js:1372 +#: prefs.js:1485 msgid "Disable Notification Popups" msgstr "Zakázat vyskakovací okna s upozorněním" -#: prefs.js:1373 +#: prefs.js:1486 msgid "Immediately Focus Window" msgstr "Okamžitě zvýraznit okno" -#: prefs.js:1380 +#: prefs.js:1494 msgid "Favorites" msgstr "Oblíbené" -#: prefs.js:1381 -msgid "Disable pin/unpin app notifications." -msgstr "Zakázat upozornění aplikací připnout/odepnout." +#: prefs.js:1495 +msgid "Disable pin/unpin app notifications" +msgstr "Zakázat upozornění aplikací připnout/odepnout" -#: prefs.js:1387 +#: prefs.js:1500 msgid "Disable Notifications" msgstr "Zakázat oznámení" -#: prefs.js:1402 -msgid "Keyboard" -msgstr "Klávesnice" +#: prefs.js:1518 +msgid "Main App Grid" +msgstr "Moje mřížka aplikací" -#: prefs.js:1408 -msgid "Override Page Up/Down Shortcuts" -msgstr "Přepsat zkratky Page Up/Down" +#: prefs.js:1524 +msgid "Apps Sorting" +msgstr "Řazení aplikací" -#: prefs.js:1409 +#: prefs.js:1525 msgid "" -"This option automatically overrides the (Shift +) Super + Page Up/Down " -"keyboard shortcuts for the current workspace orientation. If you encounter " -"any issues, check the configuration in the dconf editor." +"Choose sorting method for the app grid. Note that sorting by usage ignores " +"folders" msgstr "" -"Tato možnost automaticky přepíše klávesové zkratky (Shift +) Super + Page Up/" -"Down pro aktuální orientaci pracovního prostoru. Pokud narazíte na nějaké " -"problémy, zkontrolujte konfiguraci v editoru dconf." +"Vyberte metodu řazení pro mřížku aplikace. Řazení podle použití ignoruje " +"složky" + +#: prefs.js:1529 prefs.js:1698 +msgid "Custom (Default)" +msgstr "Vlastní (výchozí)" + +#: prefs.js:1530 +msgid "Alphabet - Folders First" +msgstr "Abecedně, složky na začátek" + +#: prefs.js:1531 +msgid "Alphabet - Folders Last" +msgstr "Abecedně, složky na konec" -#: prefs.js:1417 -msgid "Compatibility" -msgstr "Kompatibilita" +#: prefs.js:1532 +msgid "Usage - No Folders" +msgstr "Použití bez složek" -#: prefs.js:1423 -msgid "Fix for Dash to Dock" -msgstr "Oprava pro Dash to Dock" +#: prefs.js:1540 +msgid "Icon Size" +msgstr "Velikost ikony" -#: prefs.js:1424 +#: prefs.js:1541 msgid "" -"With the default Ubuntu Dock and other Dash To Dock forks, you may " -"experience issues with Activities overview after you change Dock position or " -"change monitors configuration. If you are experiencing such issues, try to " -"enable this option, or (better) disable/replace the dock extension." +"Allows to set a fixed app grid icon size and bypass the default adaptive " +"algorithm" msgstr "" -"S výchozím dokem Ubuntu a dalšími variantami Dash To Dock můžete zaznamenat " -"problémy s přehledem aktivit poté, co změníte polohu doku nebo změníte " -"konfiguraci monitorů. Pokud máte takové problémy, zkuste tuto možnost " -"povolit nebo (lépe) zakázat/vyměnit rozšíření doku." +"Umožňuje vynutit pevnou velikost ikony a obejít výchozí adaptivní algoritmus" -#: prefs.js:1432 +#: prefs.js:1546 +msgid "256" +msgstr "256" + +#: prefs.js:1547 +msgid "224" +msgstr "224" + +#: prefs.js:1548 +msgid "208" +msgstr "208" + +#: prefs.js:1549 +msgid "192" +msgstr "192" + +#: prefs.js:1550 +msgid "176" +msgstr "176" + +#: prefs.js:1551 +msgid "160" +msgstr "160" + +#: prefs.js:1552 +msgid "144" +msgstr "144" + +#: prefs.js:1574 +msgid "Columns per Page (0 for adaptive grid)" +msgstr "Počet sloupců na stránku (0 pro adaptivní mřížku)" + +#: prefs.js:1575 msgid "" -"V-Shell Modules that can be disabled in case of conflict or misbehavior." +"Number of columns in the application grid. If set to 0, the number will be " +"set automatically to fit the available width" msgstr "" -"Moduly V-Shell, které lze deaktivovat v případě konfliktu nebo špatného " -"chování." +"Počet sloupců v mřížce aplikace. Je-li nastaveno na 0, číslo se nastaví " +"automaticky tak, aby odpovídalo dostupné šířce" -#: prefs.js:1438 -msgid "AppFavorites" -msgstr "Oblíbené aplikace" +#: prefs.js:1591 +msgid "Rows per Page (0 for adaptive grid)" +msgstr "Počet řádků na stránku (0 pro adaptivní mřížku)" -#: prefs.js:1439 -msgid "Pin/unpin app notification options." -msgstr "Možnosti upozornění pro připnutí/odepnutí aplikací." +#: prefs.js:1592 +msgid "" +"Number of rows in the application grid. If set to 0, the number will be set " +"automatically to fit the available height" +msgstr "" +"Počet řádků v mřížce aplikace. Je-li nastaveno na 0, číslo se nastaví " +"automaticky tak, aby odpovídalo dostupné výšce" -#: prefs.js:1447 -msgid "AppDisplay / IconGrid" -msgstr "Zobrazení aplikací / mřížka ikon" +#: prefs.js:1620 +msgid "App Grid Page Width Scale" +msgstr "Měřítko šířky stránky mřížky aplikací" + +#: prefs.js:1621 +msgid "Adjusts maximum app grid page width relative to the available space" +msgstr "" +"Upraví maximální šířku stránky mřížky aplikací vzhledem k dostupnému prostoru" + +#: prefs.js:1643 +msgid "App Grid Page Height Scale" +msgstr "Měřítko výšky stránky mřížky aplikací" + +#: prefs.js:1644 +msgid "Adjusts maximum app grid page height relative to the available space" +msgstr "" +"Nastaví maximální výšku stránky mřížky aplikací vzhledem k dostupnému " +"prostoru" + +#: prefs.js:1663 +msgid "Grid Spacing" +msgstr "Rozestupy mřížky" + +#: prefs.js:1664 +msgid "" +"V-Shell uses this value to calculate grid dimensions for adaptive options. " +"However, the main grid automatically adjusts the spacing based on the grid " +"and available space" +msgstr "" +"V-Shell tuto hodnotu používá k výpočtu rozměrů mřížky pro adaptivní " +"možnosti. Hlavní mřížka však automaticky upravuje rozteč na základě mřížky a " +"dostupného prostoru" + +#: prefs.js:1674 +msgid "Allow Incomplete Pages" +msgstr "Povolit neúplné stránky" + +#: prefs.js:1675 +msgid "" +"If disabled, icons from the next page (if any) are automatically moved to " +"fill any empty slot left after an icon was (re)moved (to a folder for " +"example)" +msgstr "" +"Je-li zakázáno, ikony z další stránky (jsou-li) se automaticky přesunou tak, " +"aby zaplnily jakýkoli prázdný slot, který zbyl přesunutím/vymazáním ikony/" +"složky" + +#: prefs.js:1687 +msgid "App Folders" +msgstr "Aplikační složky" + +#: prefs.js:1693 +msgid "Folder Apps Sorting" +msgstr "Třídění aplikací složek" + +#: prefs.js:1694 +msgid "Choose sorting method for app folders" +msgstr "Vyber metodu třídění aplikačních složek" + +#: prefs.js:1699 +msgid "Alphabet" +msgstr "Abeceda" + +#: prefs.js:1700 +msgid "Usage" +msgstr "Použití" + +#: prefs.js:1708 +msgid "Active Icons in Folder Preview" +msgstr "Aktivní ikony v náhledu složky" + +#: prefs.js:1709 +msgid "" +"If enabled, icons in the folder preview behaves like normal icons, you can " +"activate or even drag them directly, without having to open the folder " +"first. This option also affects the app grid default icon size" +msgstr "" +"Je-li povoleno, pak se ikony v přehledu složek chovají jako běžné ikony. " +"Můžete je aktivovat nebo dokonce přímo přetáhnout bez otevření složky. Toto " +"nastavení také ovlivňuje výchozí velikost ikon" + +#: prefs.js:1720 +msgid "App Folder Preview Grid Size" +msgstr "Velikost složek aplikací v mřížce náhledu" + +#: prefs.js:1721 +msgid "" +"Sets a grid size (number of icons) in the folder icon preview. 3x3 options " +"automatically switches between 2x2 and 3x3 grid depending on the number of " +"icons in the folder" +msgstr "" +"Nastaví velikost mřížky (počet ikon) v náhledu složky. Možnost 3x3 " +"automaticky přepíná mezi mřížkou 2x2 a 3x3 v závislosti na počtu ikon ve " +"složce" + +#: prefs.js:1725 +msgid "2x2 (Default)" +msgstr "2x2 (výchozí)" + +#: prefs.js:1726 +msgid "3x3 for 5+ apps" +msgstr "3x3 pro 5+ aplikací" + +#: prefs.js:1727 +msgid "3x3 for 9+ apps" +msgstr "3x3 pro 9+ aplikací" + +#: prefs.js:1735 +msgid "Folder Icon Size" +msgstr "Velikost ikony složky" + +#: prefs.js:1736 +msgid "" +"Allows to set a fixed icon size and bypass the default adaptive algorithm in " +"the open folder dialog" +msgstr "" +"Umožňuje nastavit pevnou velikost ikony a obejít výchozí adaptivní " +"algoritmus v dialogu otevření složky" + +#: prefs.js:1754 +msgid "Maximum Number Of Columns (0 for automatic)" +msgstr "Maximální počet sloupců (0 pro automatický režim)" + +#: prefs.js:1755 +msgid "" +"Specifies the maximum number of columns per page in folder grids. If you " +"leave the value at 0, the maximum number of columns will be calculated based " +"on available space. The actual folder grid dimensions will be determined by " +"the number of items within the set limits" +msgstr "" +"Maximální počet sloupců na stránku v mřížkách složek. Pro 0 se maximální " +"počet sloupců se vypočítá na základě dostupného místa. Skutečné rozměry " +"mřížky složek budou určeny počtem položek v rámci nastavených limitů" + +#: prefs.js:1771 +msgid "Maximum Number Of Rows (0 for automatic)" +msgstr "Maximální počet řádků (0 pro automatický režim)" + +#: prefs.js:1772 +msgid "" +"Specifies the maximum number of rows per page in folder grids. If you leave " +"the value at 0, the maximum number of rows will be calculated based on " +"available space. The actual folder grid dimensions will be determined by the " +"number of items within the set limits" +msgstr "" +"Maximální počet řádků v mřížce složek. Pro 0 se maximální počet sloupců se " +"vypočítá na základě dostupného místa. Skutečné rozměry mřížky složek budou " +"určeny počtem položek v rámci nastavených limitů" + +#: prefs.js:1790 +msgid "Folder Grid Spacing" +msgstr "Rozestupy mřížky pro složky" + +#: prefs.js:1791 +msgid "Adjusts the spacing between icons in a folder grid" +msgstr "Nastavuje rozestupy mezi ikonami ve složkách" + +#: prefs.js:1801 +msgid "Center Open Folders" +msgstr "Vycentrovat otevřené složky" + +#: prefs.js:1802 +msgid "" +"App folders may open in the center of the screen or be centered on the " +"folder's source icon" +msgstr "" +"Složky aplikací se mohou otevřít ve středu obrazovky nebo centrovat nad " +"ikonou zdrojové složky (volby vypnuto)" + +#: prefs.js:1814 +msgid "Content" +msgstr "Obsah" + +#: prefs.js:1820 +msgid "App Grid Content" +msgstr "Obsah mřížky aplikací" + +#: prefs.js:1821 +msgid "" +"The default Shell removes favorite apps, this option allows to duplicate " +"them in the grid or remove also running applications. Option \"Favorites and " +"Running First\" only works with the Alphabet and Usage sorting" +msgstr "" +"Výchozí prostředí Shell odebere oblíbené aplikace. Tato možnost vám umožňuje " +"duplikovat je v mřížce nebo odebrat také spuštěné aplikace. Možnost " +"„Oblíbené a spuštěné jako první“ funguje pouze s řazením podle použití a " +"abecedy" + +#: prefs.js:1825 +msgid "Include All" +msgstr "Zahrnout vše" + +#: prefs.js:1826 +msgid "Include All - Favorites and Running First" +msgstr "Zahrnout vše – Oblíbené a Spuštěné jako první" + +#: prefs.js:1827 +msgid "Exclude Favorites (Default)" +msgstr "Vyloučit oblíbené (výchozí)" + +#: prefs.js:1828 +msgid "Exclude Running" +msgstr "Vyloučit spuštěné" + +#: prefs.js:1829 +msgid "Exclude Favorites and Running" +msgstr "Vyloučit Oblíbené a spuštěné" + +#: prefs.js:1837 +msgid "App Labels Behavior" +msgstr "Chování štítků aplikací" + +#: prefs.js:1838 +msgid "Choose how and when to display app names" +msgstr "Vyberte jak a kdy se mají zobrazovat názvy aplikací" + +#: prefs.js:1842 +msgid "Ellipsized - Expand Selected (Default)" +msgstr "Zkrácené – rozbalit vybrané (výchozí)" + +#: prefs.js:1843 +msgid "Always Expanded" +msgstr "Vždy rozbalené" + +#: prefs.js:1844 +msgid "Hidden - Show Selected Only" +msgstr "Skryté - zobrazit pouze vybrané" + +#: prefs.js:1852 +msgid "Show Page Navigation Buttons" +msgstr "Zobrazit navigační tlačítka stránky" + +#: prefs.js:1853 +msgid "" +"You can hide the page navigation buttons if you don't need them or want to " +"get more space for icons. The buttons are hidden automatically when there is " +"only one page in the app grid" +msgstr "" +"Pokud navigační tlačítka na stránce nepotřebujete nebo chcete získat více " +"místa pro ikony, můžete je skrýt. Tlačítka se skryjí automaticky, je-li v " +"mřížce aplikace pouze jedna stránka" + +#: prefs.js:1866 +msgid "Performance" +msgstr "Výkon" + +#: prefs.js:1872 +msgid "Smooth App Grid Animations" +msgstr "Jemná animace mřížky aplikací" + +#: prefs.js:1873 +msgid "" +"This option allows V-Shell to pre-realize app grid and app folders during " +"session startup in order to avoid stuttering animations when using them for " +"the first time. If enabled, the session startup needs a little bit more time " +"to finish and necessary memory will be allocated at this time" +msgstr "" +"Tato volba umožňuje prostředí V-Shell při spuštění relace předpřipravit " +"mřížku aplikací a složky aplikací, aby se zabránilo zadrhávání animací při " +"jejich prvním použití. Pokud je tato možnost povolena, spuštění relace " +"potřebuje o něco více času na dokončení a v této době bude alokována " +"potřebná paměť" + +#: prefs.js:1883 +msgid "Reset" +msgstr "Reset" + +#: prefs.js:1888 +msgid "Reset App Grid Layout" +msgstr "Resetovat rozložení mřížky aplikace" + +#: prefs.js:1889 +msgid "" +"Removes all stored app grid positions, after reset icons will be sorted " +"alphabetically, except folder contents" +msgstr "" +"Odebere všechny uložené pozice mřížky aplikací, po resetu budou ikony " +"seřazeny podle abecedy kromě obsahu složek" + +#: prefs.js:1897 +msgid "Remove App Grid Folders" +msgstr "Odebrat složky mřížky aplikace" -#: prefs.js:1448 -msgid "App grid customization and options." -msgstr "Přizpůsobení a možnosti mřížky aplikace." +#: prefs.js:1898 +msgid "Removes all folders, folder apps will move to the root grid" +msgstr "Odebere všechny složky, aplikace složek se přesunou do kořenové mřížky" -#: prefs.js:1457 -msgid "Dash configuration options and support for vertical orientation." -msgstr "Možnosti konfigurace Dash a podpora vertikální orientace." +#: prefs.js:1914 +msgid "Optional Modules" +msgstr "Doplňkové moduly" -#: prefs.js:1466 +#: prefs.js:1920 msgid "" -"Hot corner options, removes right panel barrier that collides with CHC-E " -"extension." +"Windows Search Provider - Moved from V-Shell to the standalone \"WSP\" " +"extension" msgstr "" -"Možnosti Hot Corner, odstraňuje zábranu pravého panelu, která koliduje s " -"rozšířením CHC-E." +"Zprostředkovatel vyhledávání oken - přesunut z V-Shell do samostatného " +"rozšíření \"WSP\"" -#: prefs.js:1474 +#: prefs.js:1921 +msgid "" +"NOTE: This module has been released as a standalone extension with new " +"features, click to learn more. Related V-Shell options are still available " +"if you install the WSP extension.\n" +"\n" +"WSP adds adds open windows to the search results. You can search app names " +"and window titles. You can also use \"wq//\" or custom prefix (also by " +"pressing the Space hotkey in the overview, or clicking dash icon) to " +"suppress results from other search providers" +msgstr "" +"POZNÁMKA: Tento modul byl vydán jako samostatné rozšíření s novými funkcemi, " +"kliknutím se dozvíte více. Související možnosti prostředí V-Shell jsou stále " +"k dispozici, pokud si nainstalujete rozšíření WSP.\n" +"\n" +"WSP přidává do výsledků vyhledávání otevřená okna. Můžete vyhledávat názvy " +"aplikací a názvy oken. Můžete také použít \"wq//\" nebo vlastní předponu " +"(také stisknutím klávesové zkratky Space v přehledu nebo kliknutím na ikonu " +"pomlčky) pro potlačení výsledků od jiných poskytovatelů vyhledávání" + +#: prefs.js:1928 +msgid "" +"Extensions Search Provider - Moved from V-Shell to the standalone \"ESP\" " +"extension" +msgstr "" +"Zprostředkovatel vyhledávání rozšíření - přesunut z V-Shell do samostatného " +"rozšíření \"ESP\"" + +#: prefs.js:1929 +msgid "" +"NOTE: This module has been released as a standalone extension with new " +"features, click to learn more. Related V-Shell options are still available " +"if you install the ESP extension.\n" +"\n" +"ESP adds extensions to the search results. You can also use \"eq//\" or " +"custom prefix (also by pressing the Ctrl + Shift + Space hotkey in the " +"overview, or clicking dash icon) to suppress results from other search " +"providers" +msgstr "" +"POZNÁMKA: Tento modul byl vydán jako samostatné rozšíření s novými funkcemi, " +"kliknutím se dozvíte více. Související možnosti prostředí V-Shell jsou stále " +"k dispozici, pokud si nainstalujete rozšíření ESP.\n" +"\n" +"ESP přidává rozšíření do výsledků vyhledávání. Můžete také použít \"eq//\" " +"nebo vlastní předponu (také stisknutím klávesové zkratky Ctrl + Shift + " +"Mezerník v přehledu nebo kliknutím na ikonu pomlčky) pro potlačení výsledků " +"od jiných poskytovatelů vyhledávání" + +#: prefs.js:1936 +msgid "" +"Window Thumbnails (PiP) - Moved from V-Shell to the standalone \"WTMB\" " +"extension" +msgstr "" +"Miniatury oken (PiP) - Přesunut z V-Shell do samostatného rozšíření \"WTMB\"" + +#: prefs.js:1937 +msgid "" +"NOTE: This module has been released as a standalone extension with new " +"features, click to learn more. Related V-Shell options are still available " +"if you install the WTMB extension.\n" +"\n" +"WTMB allows the creation of Picture-in-Picture like window thumbnails that " +"you can use for monitoring of windows on another workspace" +msgstr "" +"POZNÁMKA: Tento modul byl vydán jako samostatné rozšíření s novými funkcemi, " +"kliknutím se dozvíte více. Související možnosti prostředí V-Shell jsou stále " +"k dispozici, pokud si nainstalujete rozšíření WTMB.\n" +"\n" +"WTMB umožňuje vytvářet miniatury oken podobné obrázku v obrázku, které " +"můžete použít pro sledování oken na jiném pracovním prostoru" + +#: prefs.js:1944 +msgid "" +"Built-in Modules (allows to disable modules that conflict with another " +"extension)" +msgstr "" +"Vestavěné moduly (umožňuje zakázat moduly, které jsou v konfliktu s jiným " +"rozšířením)" + +#: prefs.js:1950 +msgid "AppDisplay / IconGrid" +msgstr "Zobrazení aplikací / mřížka ikon" + +#: prefs.js:1951 +msgid "App grid customization and options" +msgstr "Přizpůsobení a nastavení mřížky aplikace" + +#: prefs.js:1959 +msgid "AppFavorites" +msgstr "Oblíbené aplikace" + +#: prefs.js:1960 +msgid "Pin/unpin app notification options" +msgstr "Nastavení připnutí/odepnutí oznámení aplikace" + +#: prefs.js:1969 +msgid "Dash customization and options, support for vertical orientation" +msgstr "Nastavení konfigurace Dash a podpora vertikální orientace" + +#: prefs.js:1978 +msgid "Hot corner options" +msgstr "Hot Corner nastavení" + +#: prefs.js:1986 msgid "MessageTray" msgstr "Panel zpráv" -#: prefs.js:1475 -msgid "Notification position options." -msgstr "Možnosti umístění oznámení." +#: prefs.js:1987 +msgid "Notification position options" +msgstr "Nastavení umístění oznámení" + +#: prefs.js:1995 +msgid "OsdWindow" +msgstr "OSD okno" -#: prefs.js:1484 -msgid "Panel options." -msgstr "Možnosti panelu." +#: prefs.js:1996 +msgid "OSD position options" +msgstr "OSD nastavení pozice" -#: prefs.js:1493 -msgid "Search view and app search provider customization and options." +#: prefs.js:2004 +msgid "OverlayKey" +msgstr "Překryvná klávesa" + +#: prefs.js:2005 +msgid "Overlay (Super/Window) key options" +msgstr "Nastavení překryvných kláves (Super/Window)" + +#: prefs.js:2014 +msgid "Panel options" +msgstr "Nastavení panelu" + +#: prefs.js:2023 +msgid "Search view and app search provider customization and options" msgstr "" -"Zobrazení vyhledávání a přizpůsobení a možnosti poskytovatele vyhledávání " -"aplikací." +"Zobrazení vyhledávání a přizpůsobení a nastavení poskytovatele vyhledávání " +"aplikací" + +#: prefs.js:2031 +msgid "SearchController" +msgstr "Ovladač vyhledávání" + +#: prefs.js:2032 +msgid "Escape key behavior options in the overview" +msgstr "Přehled možností chování klávesy Escape" -#: prefs.js:1501 +#: prefs.js:2040 msgid "SwipeTracker" msgstr "Sledování gest" -#: prefs.js:1502 -msgid "Gestures for vertical workspace orientation." -msgstr "Gesta pro vertikální orientaci pracovního prostoru." +#: prefs.js:2041 +msgid "Gestures for vertical workspace orientation" +msgstr "Gesta pro vertikální orientaci pracovního prostoru" -#: prefs.js:1510 +#: prefs.js:2049 msgid "WindowAttentionHandler" msgstr "Okno - vyžádání pozornosti" -#: prefs.js:1511 -msgid "Window attention handler options." -msgstr "Možnosti okna." +#: prefs.js:2050 +msgid "Window attention handler options" +msgstr "Nastavení obsluhy oken" -#: prefs.js:1519 +#: prefs.js:2058 msgid "WindowManager" msgstr "Správce oken" -#: prefs.js:1520 +#: prefs.js:2059 msgid "" -"Fixes an upstream bug in the minimization animation of a full-screen window." -msgstr "Opravuje chybu v animaci minimalizace okna na celou obrazovku." +"Fixes an upstream bug in the minimization animation of a full-screen window" +msgstr "Opravuje chybu v animaci minimalizace okna na celou obrazovku" -#: prefs.js:1528 +#: prefs.js:2067 msgid "WindowPreview" msgstr "Náhled okna" -#: prefs.js:1529 +#: prefs.js:2068 msgid "" "Window preview options, fixes an upstream bug that fills the system log with " -"errors when you close a window from an overview or exit the overview with a " -"gesture when any window is selected." +"errors when you close a window from the overview or exit the overview with a " +"gesture when any window is selected" msgstr "" -"Možnosti náhledu okna - opravuje chybu, která zaplňuje systémový protokol " -"chybami, když zavřete okno z přehledu nebo opustíte přehled gestem, když je " -"vybráno jakékoli okno." +"Možnosti náhledu okna. Opravuje chybu, která zaplňuje systémový protokol " +"chybami, když zavřete okno z přehledu nebo opustíte přehled gestem, je-li " +"vybráno jakékoli okno" -#: prefs.js:1537 +#: prefs.js:2076 msgid "Workspace" msgstr "Pracovní plocha" -#: prefs.js:1538 +#: prefs.js:2077 msgid "" "Fixes workspace preview allocations for vertical workspaces orientation and " -"window scaling in static overview modes." +"window scaling in static overview modes" msgstr "" "Opravuje přidělení náhledu pracovního prostoru pro vertikální orientaci " -"pracovních prostorů a měřítko okna v režimech statického přehledu." +"pracovních prostorů a měřítko okna v režimech statického přehledu" -#: prefs.js:1546 +#: prefs.js:2085 msgid "WorkspaceAnimation" msgstr "Animace pracovní plochy" -#: prefs.js:1547 -msgid "Static workspace animation option." -msgstr "Možnost animace statické pracovní plochy." +#: prefs.js:2086 +msgid "Static workspace animation option" +msgstr "Možnost animace statické pracovní plochy" -#: prefs.js:1555 +#: prefs.js:2094 msgid "WorkspaceSwitcherPopup" msgstr "Vyskakovací přepínač pracovní plochy" -#: prefs.js:1556 -msgid "Workspace switcher popup position options." -msgstr "Možnosti vyskakovací pozice přepínače pracovní plochy." +#: prefs.js:2095 +msgid "Workspace switcher popup orientation and position options" +msgstr "Nastavení pozice a orientace vyskakovacího přepínače pracovní plochy" + +#: prefs.js:2111 +msgid "Keyboard" +msgstr "Klávesnice" + +#: prefs.js:2117 +msgid "Override Page Up/Down Shortcuts" +msgstr "Přepsat zkratky Page Up/Down" -#: prefs.js:1573 +#: prefs.js:2118 +msgid "" +"This option automatically overrides the (Shift +) Super + Page Up/Down " +"keyboard shortcuts for the current workspace orientation. If you encounter " +"any issues, check the configuration in the dconf editor" +msgstr "" +"Tato možnost automaticky přepíše klávesové zkratky (Shift +) Super + Page Up/" +"Down pro aktuální orientaci pracovního prostoru. Pokud narazíte na nějaké " +"problémy, zkontrolujte konfiguraci v editoru dconf" + +#: prefs.js:2126 +msgid "Workarounds / Hacks" +msgstr "Workarounds / Hacky" + +#: prefs.js:2132 +msgid "Delay at Startup" +msgstr "Zpožděné spuštění" + +#: prefs.js:2133 +msgid "" +"If you encounter issues during GNOME Shell startup after logging in, which " +"could be caused by V-Shell's incompatibility with another extension, try " +"enabling this option. When enabled, V-Shell is activated after the startup " +"is complete. It will activate automatically when Dash to Dock, Ubuntu Dock " +"or Dash to Panel extensions are detected." +msgstr "" +"Pokud se během spouštění prostředí GNOME Shell po přihlášení vyskytnou " +"problémy, které mohou být způsobeny nekompatibilitou prostředí V-Shell s " +"jiným rozšířením, zkuste tuto možnost povolit. Je-li tato možnost povolena, " +"bude prostředí V-Shell aktivováno po dokončení spuštění. Aktivuje se " +"automaticky při zjištění rozšíření Dash to Dock, Ubuntu Dock nebo Dash to " +"Panel." + +#: prefs.js:2141 +msgid "Fix New Window Not In Focus" +msgstr "Oprava nového okna, které není zaostřeno" + +#: prefs.js:2142 +msgid "" +"If you often find that the app window you open from the Activities overview " +"does not get focus, try enabling this option." +msgstr "" +"Pokud často zjišťujete, že okno aplikace, které otevřete z přehledu aktivit, " +"není aktivní, zkuste tuto možnost povolit." + +#: prefs.js:2150 +msgid "Fix New Window Not On Current Monitor (experimental)" +msgstr "Opravuje chybu, kdy nové okno není na aktuálním monitoru" + +#: prefs.js:2151 +msgid "" +"If you use multiple monitors, you may encounter the issue of new windows " +"opening on a different monitor than expected. This option moves those " +"windows to the current monitor, determined by the position of the mouse " +"pointer. However, this is a workaround, and some windows may override it, " +"moving the window back to the previous monitor during initialization" +msgstr "" +"Pokud používáte více monitorů, mohou se nová okna otevírat na jiném " +"monitoru, než jste očekávali. Tato volba přesune nová okna na aktuální " +"monitor určený polohou ukazatele myši. Jedná se však o jen obcházení " +"problému a může se stát, že některá okna toto chování mohou zrušit a během " +"inicializace přesunou okno zpět na předchozí monitor" + +#: prefs.js:2174 msgid "Version" msgstr "Verze" -#: prefs.js:1579 +#: prefs.js:2180 msgid "Reset all options" -msgstr "Obnovit všechny možnosti" +msgstr "Obnovit všechny nastavení" -#: prefs.js:1580 -msgid "Set all options to default values." -msgstr "Nastavte všechny možnosti na výchozí hodnoty." +#: prefs.js:2181 +msgid "Reset all options to their default values" +msgstr "Nastavte všechny nastavení na výchozí hodnoty" -#: prefs.js:1586 +#: prefs.js:2187 msgid "Links" msgstr "Odkazy" -#: prefs.js:1590 +#: prefs.js:2191 msgid "Homepage" msgstr "Domovská stránka" -#: prefs.js:1591 +#: prefs.js:2192 msgid "Source code and more info about this extension" msgstr "Zdrojový kód a další informace o tomto rozšíření" -#: prefs.js:1596 +#: prefs.js:2197 msgid "Changelog" msgstr "Seznam změn" -#: prefs.js:1597 +#: prefs.js:2198 msgid "See what's changed." msgstr "Podívejte se, co se změnilo." -#: prefs.js:1602 +#: prefs.js:2203 msgid "GNOME Extensions" msgstr "Rozšíření GNOME" -#: prefs.js:1603 -msgid "Rate and comment the extension on GNOME Extensions site." -msgstr "Ohodnoťte a okomentujte rozšíření na webu GNOME Extensions." +#: prefs.js:2204 +msgid "Rate and comment V-Shell on the GNOME Extensions site" +msgstr "Ohodnoťte a okomentujte V-Shell na webu GNOME Extensions" -#: prefs.js:1608 +#: prefs.js:2209 msgid "Report a bug or suggest new feature" msgstr "Nahlaste chybu nebo navrhněte novou funkci" -#: prefs.js:1614 +#: prefs.js:2210 +msgid "Help me to help you!" +msgstr "Pomozte mi, abych vám pomohl!" + +#: prefs.js:2215 msgid "Buy Me a Coffee" msgstr "Kupte mi kávu" -#: prefs.js:1615 -msgid "If you like this extension, you can help me with my coffee expenses." -msgstr "" -"Pokud se vám toto rozšíření líbí, můžete mi pomoci s mými výdaji na kávu." +#: prefs.js:2216 +msgid "Enjoying V-Shell? Consider supporting it by buying me a coffee!" +msgstr "Užíváte si V-Shell? Podpořte ho tím, že mi koupíte kávu!" + +#: lib/util.js:408 +msgid "Updating V-Shell" +msgstr "Aktualizace V-Shell" -#: recentFilesSearchProvider.js:109 -msgid "Search recent files" -msgstr "Prohledat nedávné soubory" +#: lib/windowSearchProvider.js:118 +msgid "Open Windows" +msgstr "Otevřené okna" + +#: lib/windowSearchProvider.js:119 +msgid "Search open windows" +msgstr "Prohledej otevřená okna" + +#: lib/dash.js:983 +msgid "Force Quit" +msgstr "Vynutit vypnutí" + +#: lib/dash.js:1000 +msgid "Move App to Current Workspace ( Shift + Click )" +msgstr "Přesunout aplikaci do aktuální pracovní plochy (Shift + kliknutí)" + +#: lib/dash.js:1003 +msgid "Create Window Thumbnail/PiP" +msgstr "Vytvoření okna - Náhled/PIP" -#: recentFilesSearchProvider.js:110 +#: lib/search.js:336 +msgid "Searching…" +msgstr "Hledání…" + +#: lib/search.js:338 +msgid "No results." +msgstr "Bez výsledku." + +#: lib/optionsFactory.js:295 +msgid "Reset profile to defaults" +msgstr "Reset profilů na výchozí hodnoty" + +#: lib/optionsFactory.js:303 +msgid "GNOME 3 Layout (Vertical WS)" +msgstr "GNOME 3 (vertikální) rozložení ploch" + +#: lib/optionsFactory.js:304 +msgid "GNOME 4x Layout, Bottom Hot Edge (Horizontal WS)" +msgstr "GNOME 4x (horizontální) rozložení ploch - Spodní roh" + +#: lib/optionsFactory.js:305 +msgid "Top Left Hot Corner Centric (Vertical WS)" +msgstr "Levý horní roh (vertikální plochy)" + +#: lib/optionsFactory.js:306 +msgid "Dock-Like Overview, Bottom Hot Edge (Horizontal WS)" +msgstr "Přehled podobný doku, aktivní spodní okraj, horizontální plochy" + +#: lib/optionsFactory.js:328 +msgid "Load profile" +msgstr "Načti profil" + +#: lib/optionsFactory.js:337 +msgid "Save current settings into this profile" +msgstr "Ulož současné nastavení do tohoto profilu" + +#: lib/recentFilesSearchProvider.js:119 msgid "Recent Files" msgstr "Nedávné soubory" + +#: lib/extensionsSearchProvider.js:127 +msgid "Extensions" +msgstr "Rozšíření" + +#: lib/extensionsSearchProvider.js:128 +msgid "Search extensions" +msgstr "Prohledej rozšíření" + +#~ msgid "Maximum size of Dash icons in pixels" +#~ msgstr "Maximální velikost Dash ikon v pixelech" + +#~ msgid "Search Windows" +#~ msgstr "Vyhledávací okno" + +#~ msgid "GNOME 3" +#~ msgstr "GNOME 3" + +#~ msgid "Hot Corner Centric - Top Left Hot Corner" +#~ msgstr "Aktivní roh vlevo nahoře" + +#~ msgid "Open Windows Icon Position" +#~ msgstr "Pozice ikony „Hledat v otevřených oknech“" + +#~ msgid "" +#~ "Allows to add \"Search Open Windows\" icon into Dash (if window search " +#~ "provider enabled on the Modules tab) so you can directly toggle window " +#~ "search provider results. You can also use the secondary mouse button " +#~ "click on the Show Apps Icon, or the Space hotkey" +#~ msgstr "" +#~ "Umožňuje přidat ikonu „Hledat v otevřených oknech“ do Dashe (pokud je na " +#~ "kartě Moduly povolen poskytovatel vyhledávání v okně), takže můžete přímo " +#~ "přepínat výsledky poskytovatele vyhledávání. Můžete také použít " +#~ "sekundární tlačítko myši na ikonu Zobrazit aplikaci nebo mezerník" + +#~ msgid "Recent Files Icon Position" +#~ msgstr "Pozice ikony „Hledat v posledních souborech“" + +#~ msgid "" +#~ "Allows to add \"Search Recent Files\" icon into Dash (if recent files " +#~ "search provider enabled on the Modules tab) so you can directly toggle " +#~ "recent files search provider results. You can also use Ctrl + Space hotkey" +#~ msgstr "" +#~ "Umožní přidat ikonu „Hledat v posledních souborech“ do Dash (pokud je " +#~ "poskytovatel vyhledávání posledních souborů povolen na kartě Moduly), " +#~ "takže můžete přímo přepínat výsledky poskytovatele vyhledávání posledních " +#~ "souborů. Můžete také použít klávesovou zkratku Ctrl + mezerník" + +#~ msgid "Extensions Icon Position" +#~ msgstr "Poloha ikony rozšíření" + +#~ msgid "" +#~ "Allows to add \"Search Extensions\" icon into Dash (if extensions search " +#~ "provider enabled on the Module tab) so you can directly toggle extensions " +#~ "search provider results. You can also use the Ctrl + Shift + Space hotkey" +#~ msgstr "" +#~ "Umožňuje přidat ikonu „Rozšíření hledání“ do Dash (je-li poskytovatel " +#~ "rozšířeného vyhledávání povolen na kartě Moduly), takže můžete přímo " +#~ "přepínat výsledky vyhledávání poskytovatele rozšíření. Můžete také použít " +#~ "klávesovou zkratku Ctrl + Shift + mezerník" + +#~ msgid "Folder Columns per Page (0 for adaptive grid)" +#~ msgstr "Počet sloupců složek na stránku (0 pro adaptivní mřížku)" + +#~ msgid "Folder Rows per Page (0 for adaptive grid)" +#~ msgstr "Počet řádků složek na stránku (0 pro adaptivní mřížku)" + +#~ msgid "Window Thumbnails (PIP)" +#~ msgstr "Miniatury pracovního prostoru (PIP)" + +#, javascript-format +#~ msgid "Default Window Thumbnail (PIP) Scale (% of screen height)" +#~ msgstr "Výchozí měřítko miniatury okna (PIP) (% výšky obrazovky)" + +#~ msgid "" +#~ "Default scale of window thumbnail (like Picture In Picture) that you can " +#~ "create using the app icon menu or window preview action" +#~ msgstr "" +#~ "Výchozí měřítko miniatury okna, kterou lze vytvořit pomocí nabídky ikony " +#~ "aplikace nebo akce náhledu okna" + +#~ msgid "" +#~ "Disable or change behavior when you press and release the Super key. The " +#~ "\"Search Windows\" options requires the WindowSearchProvider module to be " +#~ "activated" +#~ msgstr "" +#~ "Zakázat nebo změnit chování při stisknutí a uvolnění klávesy Super. " +#~ "Možnosti „Hledat v oknech“ vyžadují aktivaci modulu WindowSearchProvider" + +#~ msgid "Search Windows Icon - Scroll Action" +#~ msgstr "Ikona hledání - akce posouvání" + +#~ msgid "" +#~ "Choose the behavior when scrolling over the Search Windows icon. The " +#~ "window cycler works with a list of windows sorted by \"Most Recently " +#~ "Used\" of the current workspace or all workspaces. Scrolling up cycles " +#~ "through previously used windows on the same workspace, or all windows " +#~ "regardless workspace. This option is mainly useful for the static " +#~ "workspace overview mode." +#~ msgstr "" +#~ "Zvolte chování při posouvání nad ikonou Hledat v okně. Algoritmus cyklení " +#~ "oken pracuje se seznamem oken seřazených podle „Nejnověji použitých“ " +#~ "aktuální pracovní plochy nebo všech pracovních ploch. Posouvání nahoru " +#~ "cykluje dříve použitá okna na stejné pracovní ploše nebo všechna okna bez " +#~ "ohledu na pracovní plochu. Tato volba je užitečná především pro režim " +#~ "statického přehledu pracovních ploch." + +#~ msgid "Cycle All Windows" +#~ msgstr "Cykluj všechna okna" + +#~ msgid "Cycle Windows On Current WS" +#~ msgstr "Cykluj okna v aktuálním WS" + +#~ msgid "App Grid Order" +#~ msgstr "Pořadí aplikací" + +#~ msgid "Window Search Provider - Sorting" +#~ msgstr "Povolit poskytovatele vyhledávání - řazení" + +#~ msgid "Choose the window sorting method" +#~ msgstr "Zvol metodu třídění okna" + +#~ msgid "Most Recently Used (MRU)" +#~ msgstr "Nejpoužívanější (MRU)" + +#~ msgid "MRU - Current Workspace First" +#~ msgstr "Nejpoužívanější - současný pracovní prostor První" + +#~ msgid "MRU - By Workspaces" +#~ msgstr "Nejpoužívanější - podle pracovních ploch" + +#~ msgid "Stable Sequence - By Workspaces" +#~ msgstr "Stabilní pořadí podle pracovních ploch" + +#~ msgid "Animations - General" +#~ msgstr "Animace - Obecné" + +#~ msgid "Animations - Overview" +#~ msgstr "Animace – přehled" + +#~ msgid "WindowSearchProvider" +#~ msgstr "WindowSearchProvider" + +#~ msgid "RecentFilesSearchProvider" +#~ msgstr "Poskytovatel vyhledávání nedávných souborů" + +#~ msgid "" +#~ "Activates the recent files search provider that can be triggered by a " +#~ "dash icon, Ctrl + Space hotkey or by typing \"fq//\" prefix in the search " +#~ "entry field. This option needs File History option enabled in the GNOME " +#~ "Privacy settings" +#~ msgstr "" +#~ "Aktivuje poskytovatele vyhledávání posledních souborů spustitelného " +#~ "ikonou pomlčka, klávesovou zkratkou Ctrl + mezerník nebo zadáním předpony " +#~ "\"fq//“ do pole pro zadání vyhledávání. Tato možnost vyžaduje, aby byla v " +#~ "nastavení ochrany osobních údajů GNOME povolena možnost Historie souborů" + +#~ msgid "ExtensionsSearchProvider" +#~ msgstr "Rozšířený poskytovatel hledání" + +#~ msgid "WindowThumbnail" +#~ msgstr "Miniatury pracovního prostoru" + +#~ msgid "" +#~ "Create Window Thumbnail (PIP) option in the app icon menu and window " +#~ "preview actions" +#~ msgstr "" +#~ "Možnost vytvořit miniaturu okna (PIP) v nabídce ikony aplikace a akce " +#~ "náhledu okna" + +#~ msgid "If you like V-Shell, you can help me with my coffee expenses" +#~ msgstr "Pokud se vám líbí V-Shell, můžete mi pomoci s mými výdaji na kávu" + +#~ msgid "" +#~ "Overview background crashed!\n" +#~ "If you are using Blur My Shell, disable overview blur in its settings and " +#~ "re-enable V-Shell Overview Background to avoid visual glitches." +#~ msgstr "" +#~ "Přehled pozadí havaroval!\n" +#~ "Používáte-li aplikaci Blur My Shell, zakažte v jejím nastavení rozmazání " +#~ "přehledu a znovu zapněte funkci V-Shell Overview Background, abyste se " +#~ "vyhnuli vizuálním závadám." + +#~ msgid "Search Open Windows (Hotkey: Space)" +#~ msgstr "Hledat v otevřených oknech (klávesová zkratka: mezerník)" + +#~ msgid "Search Recent Files (Hotkey: Shift + Space)" +#~ msgstr "Prohledej poslední soubory (Shift + mezerník)" + +#~ msgid "Search Extensions (Hotkey: Ctrl + Space)" +#~ msgstr "Prohledej rozšíření (Ctrl + mezerník)" + +#~ msgid "Search recent files" +#~ msgstr "Prohledat nedávné soubory" + +#~ msgid "Adjusts workspace thumbnails vertical position." +#~ msgstr "Upraví vertikální polohu miniatur pracovního prostoru." + +#~ msgid "" +#~ "App grid in app view page will be centered to the display instead of the " +#~ "available space. This option may have impact on the size of the grid, " +#~ "more for narrower and small resolution displays, especially if workspace " +#~ "thumbnails are bigger." +#~ msgstr "" +#~ "Mřížka aplikace na stránce zobrazení aplikace bude vystředěna k displeji " +#~ "místo dostupného místa. Tato možnost může mít vliv na velikost mřížky, " +#~ "spíše pro užší displeje a displeje s malým rozlišením, zvláště pokud jsou " +#~ "miniatury pracovního prostoru větší." + +#~ msgid "Main panel can be visible always, only in the overview or never." +#~ msgstr "Hlavní panel může být viditelný vždy, pouze v přehledu nebo nikdy." + +#~ msgid "Adjusts secondary monitors workspace thumbnails vertical position." +#~ msgstr "" +#~ "Upravuje vertikální polohu miniatur pracovního prostoru sekundárních " +#~ "monitorů." + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "Default size is 64." +#~ msgstr "Výchozí velikost je 64." + +#~ msgid "Always Show Window Titles" +#~ msgstr "Vždy zobrazovat názvy oken" + +#~ msgid "" +#~ "All windows on the workspace preview will show their titles, not only the " +#~ "one with the mouse pointer." +#~ msgstr "" +#~ "Všechna okna v náhledu pracovní plochy budou zobrazovat své názvy, nejen " +#~ "ty s ukazatelem myši." + +#~ msgid "" +#~ "Allows to disable the default adaptive algorithm and set a fixed size of " +#~ "icons inside folders." +#~ msgstr "" +#~ "Umožňuje zakázat výchozí adaptivní algoritmus a nastavit pevnou velikost " +#~ "ikon uvnitř složek." + +#~ msgid "" +#~ "Each folder icon shows (up to) 4 app icons as a preview of the folder " +#~ "content, this option allows you to increase the number to 9 icons if " +#~ "folder contains more than 4 or 8 apps. The latter avoids half empty " +#~ "folder icons." +#~ msgstr "" +#~ "Každá ikona složky zobrazuje (až) 4 ikony aplikací jako náhled obsahu " +#~ "složky. Tato možnost umožňuje zvýšit počet na 9 ikon, pokud složka " +#~ "obsahuje více než 4 nebo 8 aplikací." + +#~ msgid "Show Static Background" +#~ msgstr "Zobrazit statické pozadí" + +#~ msgid "Show static background wallpaper instead of the solid grey color." +#~ msgstr "Zobrazit statickou tapetu na pozadí místo šedé barvy." + +#~ msgid "Ripples animation shows up when you trigger hot corner." +#~ msgstr "Animace vlnění se zobrazí, když spustíte Hot Corner." + +#~ msgid "Dash Icon Click" +#~ msgstr "Dash - kliknutí na ikonu" + +#~ msgid "" +#~ "if the app you clicked on has more than one window and the recently used " +#~ "window is not on the current workspace, the overview can switch to the " +#~ "workspace with the recent window." +#~ msgstr "" +#~ "pokud aplikace, na kterou jste klikli, má více než jedno okno a naposledy " +#~ "použité okno není na aktuální pracovní ploše, přehled se může přepnout na " +#~ "pracovní plochu s posledním oknem." + +#~ msgid "Switch to Workspace with Recently Used Window" +#~ msgstr "Přepnout na plochu s naposledy použitým oknem" + +#~ msgid "" +#~ "If enabled, clicking an app icon in a folder preview directly opens the " +#~ "app without having to open the folder first. Middle button opens new " +#~ "window of the app without closing the overview, so you can open multiple " +#~ "apps in a row on the current workspace and secondary button opens the " +#~ "folder." +#~ msgstr "" +#~ "Pokud je tato možnost povolena, kliknutím na ikonu aplikace v náhledu " +#~ "složky se aplikace otevře přímo, aniž byste museli nejprve otevřít " +#~ "složku. Prostřední tlačítko otevře nové okno aplikace bez zavření " +#~ "přehledu, takže na aktuálním pracovním prostoru můžete otevřít více " +#~ "aplikací v řadě a sekundární tlačítko otevře složku." + +#~ msgid "Top Middle" +#~ msgstr "Nahoře uprostřed" + +#~ msgid "Bottom Middle" +#~ msgstr "Dole uprostřed" + +#~ msgid "Compatibility" +#~ msgstr "Kompatibilita" + +#~ msgid "Fix for Dash to Dock" +#~ msgstr "Oprava pro Dash to Dock" + +#~ msgid "" +#~ "With the default Ubuntu Dock and other Dash To Dock forks, you may " +#~ "experience issues with Activities overview after you change Dock position " +#~ "or change monitors configuration. If you are experiencing such issues, " +#~ "try to enable this option, or (better) disable/replace the dock extension." +#~ msgstr "" +#~ "S výchozím dokem Ubuntu a dalšími variantami Dash To Dock můžete " +#~ "zaznamenat problémy s přehledem aktivit poté, co změníte polohu doku nebo " +#~ "změníte konfiguraci monitorů. Pokud máte takové problémy, zkuste tuto " +#~ "možnost povolit nebo (lépe) zakázat/vyměnit rozšíření doku." + +#~ msgid "" +#~ "V-Shell Modules that can be disabled in case of conflict or misbehavior." +#~ msgstr "" +#~ "Moduly V-Shell, které lze deaktivovat v případě konfliktu nebo špatného " +#~ "chování." + +#~ msgid "" +#~ "Hot corner options, removes right panel barrier that collides with CHC-E " +#~ "extension." +#~ msgstr "" +#~ "Možnosti Hot Corner, odstraňuje zábranu pravého panelu, která koliduje s " +#~ "rozšířením CHC-E." diff --git a/extensions/46/vertical-workspaces/po/meson.build b/extensions/46/vertical-workspaces/po/meson.build new file mode 100644 index 0000000..e4483a5 --- /dev/null +++ b/extensions/46/vertical-workspaces/po/meson.build @@ -0,0 +1 @@ +i18n.gettext('vertical-workspaces', preset : 'glib') diff --git a/extensions/46/vertical-workspaces/po/vertical-workspaces.pot b/extensions/46/vertical-workspaces/po/vertical-workspaces.pot index 84413d9..1e1b2cf 100644 --- a/extensions/46/vertical-workspaces/po/vertical-workspaces.pot +++ b/extensions/46/vertical-workspaces/po/vertical-workspaces.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: vertical-workspaces\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-06 11:42+0100\n" +"POT-Creation-Date: 2024-07-19 08:40+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,170 +17,135 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: extension.js:796 -msgid "Updating V-Shell..." -msgstr "" - -#: prefs.js:30 +#: prefs.js:29 msgid "Profiles" msgstr "" -#: prefs.js:36 prefs.js:2013 +#: prefs.js:34 prefs.js:1977 msgid "Layout" msgstr "" -#: prefs.js:42 +#: prefs.js:39 msgid "Appearance" msgstr "" -#: prefs.js:48 +#: prefs.js:44 msgid "Behavior" msgstr "" +#: prefs.js:49 prefs.js:345 +msgid "App Grid" +msgstr "" + #: prefs.js:54 msgid "Modules" msgstr "" -#: prefs.js:60 +#: prefs.js:59 msgid "Misc" msgstr "" -#: prefs.js:66 +#: prefs.js:64 msgid "About" msgstr "" -#: prefs.js:109 +#: prefs.js:107 msgid "Custom Profiles" msgstr "" -#: prefs.js:110 +#: prefs.js:108 msgid "Sets of settings that can help you with the initial customization" msgstr "" -#: prefs.js:115 +#: prefs.js:113 msgid "Profile 1" msgstr "" -#: prefs.js:121 +#: prefs.js:119 msgid "Profile 2" msgstr "" -#: prefs.js:127 +#: prefs.js:125 msgid "Profile 3" msgstr "" -#: prefs.js:133 +#: prefs.js:131 msgid "Profile 4" msgstr "" -#: prefs.js:148 prefs.js:707 prefs.js:1435 prefs.js:2004 +#: prefs.js:146 prefs.js:629 prefs.js:1185 prefs.js:1968 msgid "Dash" msgstr "" -#: prefs.js:154 +#: prefs.js:152 msgid "Dash Position" msgstr "" -#: prefs.js:160 -msgid "Top" +#: prefs.js:157 prefs.js:417 +msgid "Bottom" msgstr "" -#: prefs.js:161 -msgid "Right" +#: prefs.js:158 +msgid "Left" msgstr "" -#: prefs.js:162 prefs.js:491 -msgid "Bottom" +#: prefs.js:159 +msgid "Top" msgstr "" -#: prefs.js:163 -msgid "Left" +#: prefs.js:160 +msgid "Right" msgstr "" -#: prefs.js:164 prefs.js:209 prefs.js:225 prefs.js:241 prefs.js:257 -#: prefs.js:626 +#: prefs.js:161 prefs.js:205 prefs.js:548 msgid "Hide" msgstr "" -#: prefs.js:172 +#: prefs.js:169 msgid "Center Horizontal Dash to Workspace" msgstr "" -#: prefs.js:173 +#: prefs.js:170 msgid "" "If the Dash Position is set to Top or Bottom, the position will be " "recalculated relative to the workspace preview instead of the screen" msgstr "" -#: prefs.js:192 +#: prefs.js:189 msgid "Fine Tune Dash Position" msgstr "" -#: prefs.js:193 +#: prefs.js:190 msgid "" "Adjusts the position of the dash on the axis given by the orientation of the " "workspaces" msgstr "" -#: prefs.js:203 +#: prefs.js:200 msgid "Show Apps Icon Position" msgstr "" -#: prefs.js:204 +#: prefs.js:201 msgid "Sets the position of the \"Show Applications\" icon in the Dash" msgstr "" -#: prefs.js:210 prefs.js:226 prefs.js:242 prefs.js:258 +#: prefs.js:206 msgid "Start" msgstr "" -#: prefs.js:211 prefs.js:227 prefs.js:243 prefs.js:259 +#: prefs.js:207 msgid "End" msgstr "" -#: prefs.js:219 -msgid "Open Windows Icon Position" -msgstr "" - -#: prefs.js:220 -msgid "" -"Allows to add \"Search Open Windows\" icon into Dash (if window search " -"provider enabled on the Modules tab) so you can directly toggle window " -"search provider results. You can also use the secondary mouse button click " -"on the Show Apps Icon, or the Space hotkey" -msgstr "" - -#: prefs.js:235 -msgid "Recent Files Icon Position" -msgstr "" - -#: prefs.js:236 -msgid "" -"Allows to add \"Search Recent Files\" icon into Dash (if recent files search " -"provider enabled on the Modules tab) so you can directly toggle recent files " -"search provider results. You can also use Ctrl + Space hotkey" -msgstr "" - -#: prefs.js:251 -msgid "Extensions Icon Position" -msgstr "" - -#: prefs.js:252 -msgid "" -"Allows to add \"Search Extensions\" icon into Dash (if extensions search " -"provider enabled on the Module tab) so you can directly toggle extensions " -"search provider results. You can also use the Ctrl + Shift + Space hotkey" -msgstr "" - -#: prefs.js:268 +#: prefs.js:215 msgid "Workspace Thumbnails / Orientation" msgstr "" -#: prefs.js:274 +#: prefs.js:221 msgid "Thumbnails Position / Workspaces Orientation" msgstr "" -#: prefs.js:275 +#: prefs.js:222 msgid "" "Position of the workspace thumbnails on the screen also sets orientation of " "the workspaces to vertical or horizontal. You have two options to disable " @@ -188,194 +153,182 @@ msgid "" "second one to horizontal." msgstr "" -#: prefs.js:281 +#: prefs.js:227 msgid "Left \t Vertical Orientation" msgstr "" -#: prefs.js:282 +#: prefs.js:228 msgid "Right \t Vertical Orientation" msgstr "" -#: prefs.js:283 +#: prefs.js:229 msgid "Hide \t Vertical Orientation" msgstr "" -#: prefs.js:284 +#: prefs.js:230 msgid "Top \t Horizontal Orientation" msgstr "" -#: prefs.js:285 +#: prefs.js:231 msgid "Bottom \t Horizontal Orientation" msgstr "" -#: prefs.js:286 +#: prefs.js:232 msgid "Hide \t Horizontal Orientation" msgstr "" -#: prefs.js:302 prefs.js:642 +#: prefs.js:248 prefs.js:564 msgid "Fine Tune Workspace Thumbnails Position" msgstr "" -#: prefs.js:303 prefs.js:643 +#: prefs.js:249 prefs.js:565 msgid "" "Adjusts the position of the thumbnails on the axis given by the orientation " "of the workspaces" msgstr "" -#: prefs.js:311 +#: prefs.js:257 msgid "Reserve Full Screen Height/Width for Thumbnails" msgstr "" -#: prefs.js:312 +#: prefs.js:258 msgid "" "The whole screen height/width will be reserved for workspace thumbnails at " "the expense of space available for Dash (if the Dash is oriented in a " "different axis)." msgstr "" -#: prefs.js:329 +#: prefs.js:275 msgid "Workspace Thumbnails Max Scale - Window Picker" msgstr "" -#: prefs.js:330 +#: prefs.js:276 msgid "" -"Adjusts maximum size of the workspace thumbnails in the overview (% relative " -"to display width)" +"Adjusts the maximum size of the workspace thumbnails in the overview " +"(percentage relative to display width)" msgstr "" -#: prefs.js:347 +#: prefs.js:293 msgid "Workspace Thumbnails Max Scale - App View" msgstr "" -#: prefs.js:348 +#: prefs.js:294 msgid "Allows you to set different thumbnails scale for the Applications view" msgstr "" -#: prefs.js:356 prefs.js:905 +#: prefs.js:302 prefs.js:822 msgid "Workspace Preview" msgstr "" -#: prefs.js:371 +#: prefs.js:317 msgid "Workspaces Scale" msgstr "" -#: prefs.js:372 +#: prefs.js:318 msgid "" "Allows to shrink workspace previews to adjust spacing or fit more of the " "adjacent workspaces on the screen. Default size is calculated to use all " "available space with minimal spacing" msgstr "" -#: prefs.js:389 +#: prefs.js:335 msgid "Workspaces Spacing" msgstr "" -#: prefs.js:390 +#: prefs.js:336 msgid "" "Adjusts spacing between workspace previews so you can control how much of " "the adjacent workspaces overlap to the current workspace overview. Default " "value should set the adjacent workspaces off-screen." msgstr "" -#: prefs.js:399 prefs.js:938 prefs.js:1590 -msgid "App Grid" -msgstr "" - -#: prefs.js:405 +#: prefs.js:351 msgid "Center App Grid" msgstr "" -#: prefs.js:406 +#: prefs.js:352 msgid "Centers the app grid relative to the display instead of available space" msgstr "" -#: prefs.js:423 -msgid "App Grid Page Width Scale" -msgstr "" - -#: prefs.js:424 -msgid "Adjusts max app grid page width relative to the available space." -msgstr "" - -#: prefs.js:434 +#: prefs.js:361 msgid "Search View" msgstr "" -#: prefs.js:440 +#: prefs.js:367 msgid "Center Search View" msgstr "" -#: prefs.js:441 +#: prefs.js:368 msgid "" "Centers the search view relative to the display instead of available space" msgstr "" -#: prefs.js:449 +#: prefs.js:376 msgid "Always Show Search Entry" msgstr "" -#: prefs.js:450 +#: prefs.js:377 msgid "" "If disabled, the search entry field will be hidden when not in use, so the " "workspace preview and app grid may take up more space" msgstr "" -#: prefs.js:467 +#: prefs.js:394 msgid "Search Results Width" msgstr "" -#: prefs.js:468 +#: prefs.js:395 msgid "" -"Adjusts maximum width of search results view (% relative to default). This " -"allows to fit more (or less) app icons into the app search result" +"Adjusts the maximum width of search results view (percentage relative to " +"default). This allows to fit more (or less) app icons into the app search " +"result" msgstr "" -#: prefs.js:478 prefs.js:2049 +#: prefs.js:405 prefs.js:2013 msgid "Panel" msgstr "" -#: prefs.js:484 +#: prefs.js:411 msgid "Main Panel Position" msgstr "" -#: prefs.js:485 +#: prefs.js:412 msgid "Allows to place the main panel at the bottom of the primary display" msgstr "" -#: prefs.js:490 +#: prefs.js:416 msgid "Top (Default)" msgstr "" -#: prefs.js:499 +#: prefs.js:425 msgid "Main Panel Visibility" msgstr "" -#: prefs.js:500 +#: prefs.js:426 msgid "Allows to hide main panel when not needed" msgstr "" -#: prefs.js:505 +#: prefs.js:430 msgid "Always Visible (Default)" msgstr "" -#: prefs.js:506 +#: prefs.js:431 msgid "Overview Only" msgstr "" -#: prefs.js:507 +#: prefs.js:432 msgid "Always Hidden" msgstr "" -#: prefs.js:517 +#: prefs.js:442 msgid "Workspace Switcher Popup" msgstr "" -#: prefs.js:533 -#, javascript-format -msgid "Horizontal Position (% from left)" +#: prefs.js:458 +msgid "Horizontal Position (percentage from the left)" msgstr "" -#: prefs.js:534 +#: prefs.js:459 msgid "" "This popup shows up when you switch workspace using a keyboard shortcut or " "gesture outside of the overview. You can disable it on the \"Behavior\" tab. " @@ -383,570 +336,466 @@ msgid "" "Manager\" extension" msgstr "" -#: prefs.js:554 -#, javascript-format -msgid "Vertical Position (% from top)" +#: prefs.js:479 +msgid "Vertical Position (percentage from the top)" msgstr "" -#: prefs.js:565 +#: prefs.js:490 msgid "Notifications and OSD" msgstr "" -#: prefs.js:571 +#: prefs.js:496 msgid "Notification Banner Position" msgstr "" -#: prefs.js:572 +#: prefs.js:497 msgid "Choose where the notification banners appear on the screen" msgstr "" -#: prefs.js:577 prefs.js:597 prefs.js:1400 +#: prefs.js:501 prefs.js:520 prefs.js:1150 msgid "Top Left" msgstr "" -#: prefs.js:578 +#: prefs.js:502 msgid "Top Center (Default)" msgstr "" -#: prefs.js:579 prefs.js:599 prefs.js:1401 +#: prefs.js:503 prefs.js:522 prefs.js:1151 msgid "Top Right" msgstr "" -#: prefs.js:580 prefs.js:601 prefs.js:1402 +#: prefs.js:504 prefs.js:524 prefs.js:1152 msgid "Bottom Left" msgstr "" -#: prefs.js:581 +#: prefs.js:505 msgid "Bottom Center" msgstr "" -#: prefs.js:582 prefs.js:603 prefs.js:1403 +#: prefs.js:506 prefs.js:526 prefs.js:1153 msgid "Bottom Right" msgstr "" -#: prefs.js:590 +#: prefs.js:514 msgid "OSD Popup Position" msgstr "" -#: prefs.js:591 +#: prefs.js:515 msgid "" "Choose where the OSD pop-ups (like sound volume level) appear on the screen" msgstr "" -#: prefs.js:596 prefs.js:824 prefs.js:869 prefs.js:1334 prefs.js:1355 -#: prefs.js:1379 prefs.js:1513 prefs.js:1794 prefs.js:1812 prefs.js:1830 -#: prefs.js:1899 +#: prefs.js:519 prefs.js:743 prefs.js:787 prefs.js:1087 prefs.js:1107 +#: prefs.js:1130 prefs.js:1244 prefs.js:1363 prefs.js:1380 prefs.js:1397 +#: prefs.js:1463 msgid "Disable" msgstr "" -#: prefs.js:598 +#: prefs.js:521 msgid "Top Center" msgstr "" -#: prefs.js:600 +#: prefs.js:523 msgid "Center" msgstr "" -#: prefs.js:602 +#: prefs.js:525 msgid "Bottom Center (Default)" msgstr "" -#: prefs.js:611 +#: prefs.js:534 msgid "Secondary Monitors" msgstr "" -#: prefs.js:617 +#: prefs.js:540 msgid "Workspace Thumbnails Position" msgstr "" -#: prefs.js:618 +#: prefs.js:541 msgid "" "Allows to place workspace thumbnails of secondary monitors on the opposite " "side than on the primary monitor" msgstr "" -#: prefs.js:623 +#: prefs.js:545 msgid "Same as Primary" msgstr "" -#: prefs.js:624 +#: prefs.js:546 msgid "Left / Top" msgstr "" -#: prefs.js:625 +#: prefs.js:547 msgid "Right / Bottom" msgstr "" -#: prefs.js:660 +#: prefs.js:582 msgid "Workspace Thumbnails Max Scale" msgstr "" -#: prefs.js:661 +#: prefs.js:583 msgid "" -"Adjusts maximum size of the workspace thumbnails (% relative to display " -"width / height) for secondary monitors" +"Adjusts maximum size of the workspace thumbnails (percentage relative to the " +"display width / height) for secondary monitors" msgstr "" -#: prefs.js:678 +#: prefs.js:600 msgid "Workspace Preview Scale" msgstr "" -#: prefs.js:679 +#: prefs.js:601 msgid "Allows to scale down workspace previews on secondary monitors" msgstr "" -#: prefs.js:687 -msgid "Shift Workspace Preview by Panel Height" +#: prefs.js:609 +msgid "Shift Overview by Panel Height" msgstr "" -#: prefs.js:688 +#: prefs.js:610 msgid "" -"This option can help align overview of the secondary monitor with the " -"primary monitor" +"This option can help align the overview of the secondary monitor with the " +"primary one" msgstr "" -#: prefs.js:713 +#: prefs.js:635 msgid "Dash Max Icon Size" msgstr "" -#: prefs.js:714 -msgid "Maximum size of Dash icons in pixels" +#: prefs.js:636 +msgid "" +"Maximum size of Dash icons in pixels. Adaptive option switches between " +"default 64 and 48 for low resolution displays" msgstr "" -#: prefs.js:719 prefs.js:958 prefs.js:979 prefs.js:1109 +#: prefs.js:640 prefs.js:1545 prefs.js:1740 +msgid "Adaptive (Default)" +msgstr "" + +#: prefs.js:641 prefs.js:867 prefs.js:1553 prefs.js:1741 msgid "128" msgstr "" -#: prefs.js:720 prefs.js:959 prefs.js:980 prefs.js:1110 +#: prefs.js:642 prefs.js:868 prefs.js:1554 prefs.js:1742 msgid "112" msgstr "" -#: prefs.js:721 prefs.js:960 prefs.js:981 +#: prefs.js:643 prefs.js:1555 prefs.js:1743 msgid "96" msgstr "" -#: prefs.js:722 prefs.js:961 prefs.js:982 prefs.js:1112 +#: prefs.js:644 prefs.js:870 prefs.js:1556 prefs.js:1744 msgid "80" msgstr "" -#: prefs.js:723 prefs.js:962 prefs.js:983 prefs.js:1113 +#: prefs.js:645 prefs.js:871 prefs.js:1557 prefs.js:1745 msgid "64" msgstr "" -#: prefs.js:724 prefs.js:866 prefs.js:963 prefs.js:984 prefs.js:1114 +#: prefs.js:646 prefs.js:784 prefs.js:872 prefs.js:1558 prefs.js:1746 msgid "48" msgstr "" -#: prefs.js:725 prefs.js:867 prefs.js:985 prefs.js:1115 +#: prefs.js:647 prefs.js:785 prefs.js:873 msgid "32" msgstr "" -#: prefs.js:733 +#: prefs.js:655 msgid "Dash Background Style" msgstr "" -#: prefs.js:734 +#: prefs.js:656 msgid "" "Allows you to change the background color of the dash to match the search " "results an app folders" msgstr "" -#: prefs.js:739 prefs.js:1283 prefs.js:1313 prefs.js:1399 prefs.js:1475 -#: prefs.js:1491 prefs.js:1793 prefs.js:1811 prefs.js:1869 prefs.js:1884 +#: prefs.js:660 prefs.js:1029 prefs.js:1057 prefs.js:1149 prefs.js:1223 +#: prefs.js:1362 prefs.js:1379 prefs.js:1435 prefs.js:1449 msgid "Default" msgstr "" -#: prefs.js:740 +#: prefs.js:661 msgid "Light" msgstr "" -#: prefs.js:756 +#: prefs.js:677 msgid "Dash Background Opacity" msgstr "" -#: prefs.js:757 +#: prefs.js:678 msgid "Adjusts the opacity of the Dash background" msgstr "" -#: prefs.js:775 +#: prefs.js:696 msgid "Dash Background Radius" msgstr "" -#: prefs.js:776 +#: prefs.js:697 msgid "" "Adjusts the border radius of the Dash background in pixels. 0 means the " "default value given by the current theme style" msgstr "" -#: prefs.js:786 +#: prefs.js:707 msgid "Dash Background GNOME 3 Style" msgstr "" -#: prefs.js:787 +#: prefs.js:708 msgid "" "Background of the vertically oriented dash will imitate the GNOME 3 style" msgstr "" -#: prefs.js:797 +#: prefs.js:718 msgid "Running App Indicator" msgstr "" -#: prefs.js:798 +#: prefs.js:719 msgid "" "Allows you to change style of the running app indicator under the app icon" msgstr "" -#: prefs.js:803 +#: prefs.js:723 msgid "Dot (Default)" msgstr "" -#: prefs.js:804 +#: prefs.js:724 msgid "Line" msgstr "" -#: prefs.js:812 prefs.js:1501 +#: prefs.js:732 prefs.js:1233 msgid "Workspace Thumbnails" msgstr "" -#: prefs.js:818 +#: prefs.js:738 msgid "Show Workspace Thumbnail Labels" msgstr "" -#: prefs.js:819 +#: prefs.js:739 msgid "" "Each workspace thumbnail can show label with its index and name (if defined " "in the system settings) or name/title of its most recently used app/window" msgstr "" -#: prefs.js:825 +#: prefs.js:744 msgid "Index" msgstr "" -#: prefs.js:826 +#: prefs.js:745 msgid "Index + WS Name" msgstr "" -#: prefs.js:827 +#: prefs.js:746 msgid "Index + App Name" msgstr "" -#: prefs.js:828 +#: prefs.js:747 msgid "Index + Window Title" msgstr "" -#: prefs.js:835 +#: prefs.js:754 msgid "Show WS Thumbnail Label on Hover" msgstr "" -#: prefs.js:836 +#: prefs.js:755 msgid "Show the label only when the mouse pointer hovers over the thumbnail" msgstr "" -#: prefs.js:844 +#: prefs.js:763 msgid "Show Wallpaper in Workspace Thumbnails" msgstr "" -#: prefs.js:845 +#: prefs.js:764 msgid "All workspace thumbnails will include the current desktop background" msgstr "" -#: prefs.js:853 prefs.js:1523 +#: prefs.js:772 prefs.js:1254 msgid "Window Preview" msgstr "" -#: prefs.js:859 +#: prefs.js:778 msgid "Window Preview App Icon Size" msgstr "" -#: prefs.js:865 +#: prefs.js:783 msgid "64 (Default)" msgstr "" -#: prefs.js:868 +#: prefs.js:786 msgid "22" msgstr "" -#: prefs.js:877 +#: prefs.js:795 msgid "Window Title Position / Visibility" msgstr "" -#: prefs.js:878 +#: prefs.js:796 msgid "" "Sets the position of the window title that is displayed when the mouse " "hovers over the window or can always be visible" msgstr "" -#: prefs.js:883 +#: prefs.js:800 msgid "Inside Window" msgstr "" -#: prefs.js:884 +#: prefs.js:801 msgid "Inside Window Always Visible" msgstr "" -#: prefs.js:885 +#: prefs.js:802 msgid "Below Window (Default)" msgstr "" -#: prefs.js:893 +#: prefs.js:810 msgid "Show Close Window Button" msgstr "" -#: prefs.js:894 +#: prefs.js:811 msgid "Allows you to hide close window button" msgstr "" -#: prefs.js:911 +#: prefs.js:828 msgid "Show Workspace Preview Background" msgstr "" -#: prefs.js:912 +#: prefs.js:829 msgid "Allows to hide the background of the workspace preview" msgstr "" -#: prefs.js:929 +#: prefs.js:846 msgid "Workspace Background Corner Radius" msgstr "" -#: prefs.js:930 +#: prefs.js:847 msgid "Adjusts the corner radius of the workspace preview in the overview" msgstr "" -#: prefs.js:944 -msgid "Icon Size" -msgstr "" - -#: prefs.js:945 -msgid "" -"Allows to set a fixed app grid icon size and bypass the default adaptive " -"algorithm" -msgstr "" - -#: prefs.js:950 prefs.js:978 -msgid "Adaptive (Default)" -msgstr "" - -#: prefs.js:951 -msgid "256" -msgstr "" - -#: prefs.js:952 -msgid "224" -msgstr "" - -#: prefs.js:953 -msgid "208" -msgstr "" - -#: prefs.js:954 -msgid "192" -msgstr "" - -#: prefs.js:955 -msgid "176" -msgstr "" - -#: prefs.js:956 -msgid "160" -msgstr "" - -#: prefs.js:957 -msgid "144" -msgstr "" - -#: prefs.js:972 -msgid "Folder Icon Size" -msgstr "" - -#: prefs.js:973 -msgid "" -"Allows to set a fixed icon size and bypass the default adaptive algorithm in " -"the open folder dialog" -msgstr "" - -#: prefs.js:994 -msgid "Max App Folder Icon Grid Size" -msgstr "" - -#: prefs.js:995 -msgid "" -"Sets a grid size (number of icons) in the folder preview. 3x3 options " -"automatically switches between 2x2 and 3x3 grid depending on the number of " -"icons in the folder" -msgstr "" - -#: prefs.js:999 -msgid "2x2 (Default)" -msgstr "" - -#: prefs.js:1000 -msgid "3x3 for 5+ apps" -msgstr "" - -#: prefs.js:1001 -msgid "3x3 for 9+ apps" -msgstr "" - -#: prefs.js:1016 -msgid "Columns per Page (0 for adaptive grid)" -msgstr "" - -#: prefs.js:1017 -msgid "" -"Number of columns in the application grid. If set to 0 (the default), the " -"number will be set automatically to fit the available width" -msgstr "" - -#: prefs.js:1033 -msgid "Rows per Page (0 for adaptive grid)" -msgstr "" - -#: prefs.js:1034 -msgid "" -"Number of rows in the application grid. If set to 0 (the default), the " -"number will be set automatically to fit the available height" +#: prefs.js:855 prefs.js:1318 prefs.js:2022 +msgid "Search" msgstr "" -#: prefs.js:1050 -msgid "Folder Columns per Page (0 for adaptive grid)" +#: prefs.js:861 +msgid "App Search Icon Size" msgstr "" -#: prefs.js:1051 +#: prefs.js:862 msgid "" -"Number of columns in folder grid. If you leave the value at 0, the number of " -"columns will be calculated to fit all the folder icons on one page" +"Size of results provided by the App Search Provider - smaller size allows to " +"fit more results. Adaptive option switches between default 96 and 64 for low " +"resolution displays" msgstr "" -#: prefs.js:1067 -msgid "Folder Rows per Page (0 for adaptive grid)" +#: prefs.js:866 +msgid "Adaptive" msgstr "" -#: prefs.js:1068 -msgid "" -"Number of rows in folder grid. If you leave the value at 0, the number of " -"rows will be calculated to fit all the folder icons on one page" +#: prefs.js:869 +msgid "96 (Default)" msgstr "" -#: prefs.js:1086 -msgid "Grid Spacing" +#: prefs.js:893 +msgid "Max Search Results Rows" msgstr "" -#: prefs.js:1087 +#: prefs.js:894 msgid "" -"Adjusts the spacing between icons in a grid, the real impact is on folders" -msgstr "" - -#: prefs.js:1097 prefs.js:1715 prefs.js:2058 -msgid "Search" +"Sets the maximum number of rows for result lists of all search providers " +"except the window search provider which always lists all results" msgstr "" -#: prefs.js:1103 -msgid "App Search Icon Size" +#: prefs.js:904 +msgid "Highlighting" msgstr "" -#: prefs.js:1104 +#: prefs.js:905 msgid "" -"Size of results provided by the App Search Provider - smaller size allows to " -"fit more results" +"The GNOME default highlighting style (bold) causes strings to be " +"\"randomly\" ellipsized, often preventing you from seeing the whole string, " +"even if there is space for it. The selected style will be applied to all " +"search results globally. If you are using other extensions that offer this " +"option, make sure you set the same setting in all of them." msgstr "" -#: prefs.js:1111 -msgid "96 (Default)" +#: prefs.js:909 +msgid "Bold (Default)" msgstr "" -#: prefs.js:1135 -msgid "Max Search Results Rows" +#: prefs.js:910 +msgid "Underline" msgstr "" -#: prefs.js:1136 -msgid "" -"Sets the maximum number of rows for result lists of all search providers " -"except the window search provider which always lists all results" +#: prefs.js:911 +msgid "None" msgstr "" -#: prefs.js:1147 +#: prefs.js:919 msgid "Overview Background" msgstr "" -#: prefs.js:1153 +#: prefs.js:925 msgid "Show Wallpaper" msgstr "" -#: prefs.js:1154 +#: prefs.js:926 msgid "" "Replaces the solid grey background in the overview with the current desktop " "wallpaper" msgstr "" -#: prefs.js:1170 +#: prefs.js:942 msgid "Brightness" msgstr "" -#: prefs.js:1171 +#: prefs.js:943 msgid "Brightness of the background wallpaper in the overview" msgstr "" -#: prefs.js:1187 +#: prefs.js:959 msgid "Brightness for Search View" msgstr "" -#: prefs.js:1188 +#: prefs.js:960 msgid "" "Allows you to set a lower background brightness for search view mode where " "text visibility is more important" msgstr "" -#: prefs.js:1204 +#: prefs.js:976 msgid "Blur Window Picker Background" msgstr "" -#: prefs.js:1205 +#: prefs.js:977 msgid "Sets the amount of background blur in the window picker view" msgstr "" -#: prefs.js:1221 +#: prefs.js:993 msgid "Blur App Grid/Search View Background" msgstr "" -#: prefs.js:1222 +#: prefs.js:994 msgid "" "Sets the amount of background blur in the app grid and search results views" msgstr "" -#: prefs.js:1230 +#: prefs.js:1002 msgid "Smooth Blur Transitions" msgstr "" -#: prefs.js:1231 +#: prefs.js:1003 msgid "" "Allows for smoother blur transitions, but can affect the overall smoothness " "of overview animations on weak hardware" msgstr "" -#: prefs.js:1240 -msgid "Window Thumbnails (PIP)" -msgstr "" - -#: prefs.js:1255 -#, javascript-format -msgid "Default Window Thumbnail (PIP) Scale (% of screen height)" -msgstr "" - -#: prefs.js:1256 -msgid "" -"Default scale of window thumbnail (like Picture In Picture) that you can " -"create using the app icon menu or window preview action" -msgstr "" - -#: prefs.js:1271 +#: prefs.js:1018 msgid "Overview" msgstr "" -#: prefs.js:1277 +#: prefs.js:1024 msgid "Overview Mode" msgstr "" -#: prefs.js:1278 +#: prefs.js:1025 msgid "" "The Expose Windows on Hover mode does not expose the workspace preview " "windows until the mouse pointer enters any window\n" @@ -956,120 +805,138 @@ msgid "" "default overview" msgstr "" -#: prefs.js:1284 +#: prefs.js:1030 msgid "Expose Windows on Hover" msgstr "" -#: prefs.js:1285 +#: prefs.js:1031 msgid "Static Workspace" msgstr "" -#: prefs.js:1292 +#: prefs.js:1038 msgid "Startup State" msgstr "" -#: prefs.js:1293 +#: prefs.js:1039 msgid "Allows to change the state in which GNOME Shell starts a session" msgstr "" -#: prefs.js:1298 prefs.js:1336 +#: prefs.js:1043 msgid "Overview (Default)" msgstr "" -#: prefs.js:1299 +#: prefs.js:1044 msgid "Desktop" msgstr "" -#: prefs.js:1300 prefs.js:1337 prefs.js:1382 +#: prefs.js:1045 prefs.js:1090 prefs.js:1133 msgid "Applications" msgstr "" -#: prefs.js:1307 +#: prefs.js:1052 msgid "Escape Key Behavior" msgstr "" -#: prefs.js:1308 +#: prefs.js:1053 msgid "" "Allows you to close the overview with a single press of the Escape key, even " "from the application grid or from search, if the search entry field does not " "have focus" msgstr "" -#: prefs.js:1314 +#: prefs.js:1058 msgid "Close Overview" msgstr "" -#: prefs.js:1322 +#: prefs.js:1066 +msgid "Click Empty Space To Close" +msgstr "" + +#: prefs.js:1067 +msgid "Enables clicking on an empty space in the overview to close it" +msgstr "" + +#: prefs.js:1076 msgid "Overlay Key (Super/Windows)" msgstr "" -#: prefs.js:1328 +#: prefs.js:1082 msgid "Single-Press Action" msgstr "" -#: prefs.js:1329 +#: prefs.js:1083 msgid "" "Disable or change behavior when you press and release the Super key. The " -"\"Search Windows\" options requires the WindowSearchProvider module to be " -"activated" +"\"Search Windows\" options requires the \"WSP (Window Search Provider)\" " +"extension installed and enabled. Link is available on the Modules tab in " +"Settings. If you want another extension (like AATWS) to handle the overlay " +"key, set this option to \"Overview - Window Picker (Default)\" and the " +"\"Double-Press Action\" option to \"Applications (Default)\"" msgstr "" -#: prefs.js:1335 prefs.js:1380 +#: prefs.js:1088 prefs.js:1131 msgid "Follow Global Overview Mode" msgstr "" -#: prefs.js:1338 prefs.js:1383 +#: prefs.js:1089 prefs.js:1132 +msgid "Overview - Window Picker (Default)" +msgstr "" + +#: prefs.js:1091 prefs.js:1134 msgid "Overview - Static WS Preview" msgstr "" -#: prefs.js:1339 prefs.js:1384 +#: prefs.js:1092 prefs.js:1135 msgid "Overview - Static Workspace" msgstr "" -#: prefs.js:1340 prefs.js:1357 prefs.js:1385 -msgid "Search Windows" +#: prefs.js:1093 prefs.js:1109 prefs.js:1136 +msgid "Search Windows (requires WSP extension)" msgstr "" -#: prefs.js:1349 +#: prefs.js:1102 msgid "Double-Press Action" msgstr "" -#: prefs.js:1350 +#: prefs.js:1103 msgid "" "Disable or change behavior when you double-press the Super key. The \"Search " -"Windows\" option requires the WindowSearchProvider module to be activated. " -"The \"Static WS Overview - Expose Windows\" option allows you to switch to " -"default Activities Overview window picker view if you set static workspace " -"(preview) for the single press/release Super key action" +"Windows\" option requires the \"WSP (Window Search Provider)\" extension " +"installed and enabled. The \"Static WS Overview - Expose Windows\" option " +"allows you to switch to default Activities Overview window picker view if " +"you set static workspace (preview) for the single press/release Super key " +"action" msgstr "" -#: prefs.js:1356 +#: prefs.js:1108 msgid "Applications (Default)" msgstr "" -#: prefs.js:1358 prefs.js:1381 +#: prefs.js:1110 msgid "Overview - Window Picker" msgstr "" -#: prefs.js:1367 +#: prefs.js:1119 msgid "Hot Corner (Install Custom Hot Corners - Extended for more options)" msgstr "" -#: prefs.js:1373 +#: prefs.js:1125 msgid "Hot Corner Action" msgstr "" -#: prefs.js:1374 +#: prefs.js:1126 msgid "" "Disable or change behavior of the hot corner. Holding down the Ctrl key " -"while hitting the hot corner switches between Overview/Applications actions" +"while hitting the hot corner switches between Overview/Applications actions. " +"The \"Search Windows\" option requires the \"WSP (Window Search Provider)\" " +"extension installed and enabled" msgstr "" -#: prefs.js:1393 +#: prefs.js:1144 msgid "Hot Corner Position" msgstr "" -#: prefs.js:1394 +#: prefs.js:1145 msgid "" "Choose which corner of your monitors will be active. If you choose \"Follow " "Dash\" option, the corner will be placed near the left or top edge of the " @@ -1077,47 +944,47 @@ msgid "" "of the monitor where Dash is located" msgstr "" -#: prefs.js:1404 +#: prefs.js:1154 msgid "Follow Dash" msgstr "" -#: prefs.js:1405 +#: prefs.js:1155 msgid "Follow Dash - Hot Edge" msgstr "" -#: prefs.js:1413 +#: prefs.js:1163 msgid "Enable Hot Corner in Full-Screen Mode" msgstr "" -#: prefs.js:1414 +#: prefs.js:1164 msgid "" "If you often work with full-screen applications and want the hot corner to " "be usable" msgstr "" -#: prefs.js:1424 +#: prefs.js:1174 msgid "Show Ripples Animation" msgstr "" -#: prefs.js:1425 +#: prefs.js:1175 msgid "" "The ripple animation is played when the hot corner is activated. The ripple " "size has been reduced to be less distracting" msgstr "" -#: prefs.js:1441 +#: prefs.js:1191 msgid "Isolate Workspaces" msgstr "" -#: prefs.js:1442 +#: prefs.js:1192 msgid "Dash will only show apps and windows from the current workspace" msgstr "" -#: prefs.js:1452 +#: prefs.js:1202 msgid "App Icon - Click Behavior" msgstr "" -#: prefs.js:1453 +#: prefs.js:1203 msgid "" "Choose your preferred behavior when clicking on an app icon. The \"Prefer " "Current Workspace\" option opens a new app window if not present in the " @@ -1126,27 +993,27 @@ msgid "" "window" msgstr "" -#: prefs.js:1458 +#: prefs.js:1207 msgid "Activate App Immediately" msgstr "" -#: prefs.js:1459 +#: prefs.js:1208 msgid "First Switch to Workspace" msgstr "" -#: prefs.js:1460 +#: prefs.js:1209 msgid "Open New Window (if supported)" msgstr "" -#: prefs.js:1461 +#: prefs.js:1210 msgid "Prefer Current Workspace" msgstr "" -#: prefs.js:1469 +#: prefs.js:1218 msgid "App Icon - Scroll Action" msgstr "" -#: prefs.js:1470 +#: prefs.js:1219 msgid "" "Choose the behavior when scrolling over an app icon. The window cycler works " "with a list of windows sorted by the \"Most Recently Used\" and grouped by " @@ -1154,105 +1021,84 @@ msgid "" "workspace and then switches to another workspace, if any" msgstr "" -#: prefs.js:1476 +#: prefs.js:1224 msgid "Cycle App Windows - Highlight Selected" msgstr "" -#: prefs.js:1477 +#: prefs.js:1225 msgid "Cycle App Windows - Highlight App" msgstr "" -#: prefs.js:1485 -msgid "Search Windows Icon - Scroll Action" -msgstr "" - -#: prefs.js:1486 -msgid "" -"Choose the behavior when scrolling over the Search Windows icon. The window " -"cycler works with a list of windows sorted by \"Most Recently Used\" of the " -"current workspace or all workspaces. Scrolling up cycles through previously " -"used windows on the same workspace, or all windows regardless workspace. " -"This option is mainly useful for the static workspace overview mode." -msgstr "" - -#: prefs.js:1492 -msgid "Cycle All Windows" -msgstr "" - -#: prefs.js:1493 -msgid "Cycle Windows On Current WS" -msgstr "" - -#: prefs.js:1507 +#: prefs.js:1239 msgid "Close Workspace Button" msgstr "" -#: prefs.js:1508 +#: prefs.js:1240 msgid "" "The Close Workspace button appears on the workspace thumbnail when you hover " "over it and allows you to close all windows on the workspace. You can choose " "a \"safety lock\" to prevent accidental use" msgstr "" -#: prefs.js:1514 +#: prefs.js:1245 msgid "Single Click" msgstr "" -#: prefs.js:1515 +#: prefs.js:1246 msgid "Double Click" msgstr "" -#: prefs.js:1516 +#: prefs.js:1247 msgid "Ctrl Key + Click" msgstr "" -#: prefs.js:1529 +#: prefs.js:1260 msgid "Secondary Button Click Action" msgstr "" -#: prefs.js:1530 +#: prefs.js:1261 msgid "Allows you to add a secondary mouse click action to the window preview" msgstr "" -#: prefs.js:1535 prefs.js:1552 prefs.js:1569 +#: prefs.js:1265 prefs.js:1281 prefs.js:1297 msgid "Activate Window (Default)" msgstr "" -#: prefs.js:1536 prefs.js:1553 +#: prefs.js:1266 prefs.js:1282 msgid "Close Window" msgstr "" -#: prefs.js:1537 prefs.js:1554 prefs.js:1570 +#: prefs.js:1267 prefs.js:1283 prefs.js:1298 msgid "Search For Same App Windows" msgstr "" -#: prefs.js:1538 prefs.js:1555 prefs.js:1571 lib/dash.js:1315 -msgid "Create Window Thumbnail - PIP" +#: prefs.js:1268 prefs.js:1284 prefs.js:1299 +msgid "Create Window Thumbnail/PiP (requires WTMB extension)" msgstr "" -#: prefs.js:1546 +#: prefs.js:1276 msgid "Middle Button Click Action" msgstr "" -#: prefs.js:1547 +#: prefs.js:1277 msgid "Allows you to add a middle mouse click action to the window preview" msgstr "" -#: prefs.js:1563 +#: prefs.js:1292 msgid "App Icon Click Action" msgstr "" -#: prefs.js:1564 +#: prefs.js:1293 msgid "" "Select the action to take when the application icon on the window preview is " "clicked" msgstr "" -#: prefs.js:1579 +#: prefs.js:1307 msgid "Always Activate Selected" msgstr "" -#: prefs.js:1580 +#: prefs.js:1308 msgid "" "If enabled, the currently selected window will be activated when leaving the " "Overview even without clicking. Usage example - press Super to open the " @@ -1260,596 +1106,768 @@ msgid "" "the window" msgstr "" -#: prefs.js:1596 -msgid "App Grid Order" +#: prefs.js:1324 +msgid "Enable Fuzzy Match" msgstr "" -#: prefs.js:1597 +#: prefs.js:1325 msgid "" -"Choose sorting method for the app grid. Note that sorting by usage ignores " -"folders" +"Enabling the fuzzy match allows you to skip letters in the pattern you are " +"searching for and find \"Firefox\" even if you type \"ffx\". Works only for " +"the App, Windows, Extensions and Recent files search providers" msgstr "" -#: prefs.js:1602 prefs.js:1619 -msgid "Custom (Default)" +#: prefs.js:1333 +msgid "Animations" msgstr "" -#: prefs.js:1603 -msgid "Alphabet - Folders First" +#: prefs.js:1348 +msgid "Animation Speed" msgstr "" -#: prefs.js:1604 -msgid "Alphabet - Folders Last" +#: prefs.js:1349 +msgid "" +"Adjusts the global animation speed in percentage of the default duration - " +"higher value means slower animation" msgstr "" -#: prefs.js:1605 -msgid "Usage - No Folders" +#: prefs.js:1357 +msgid "App Grid Animation" msgstr "" -#: prefs.js:1613 -msgid "App Folder Order" +#: prefs.js:1358 +msgid "" +"When entering the App Grid view, the app grid animates from the edge of the " +"screen. You can choose the direction, keep the Default (direction will be " +"selected automatically) or disable the animation if you don't like it" msgstr "" -#: prefs.js:1614 -msgid "Choose sorting method for app folders" +#: prefs.js:1364 prefs.js:1381 +msgid "Right to Left" msgstr "" -#: prefs.js:1620 -msgid "Alphabet" +#: prefs.js:1365 prefs.js:1382 +msgid "Left to Right" msgstr "" -#: prefs.js:1621 -msgid "Usage" +#: prefs.js:1366 prefs.js:1383 +msgid "Bottom to Top" msgstr "" -#: prefs.js:1629 -msgid "App Grid Content" +#: prefs.js:1367 prefs.js:1384 +msgid "Top to Bottom" +msgstr "" + +#: prefs.js:1374 +msgid "Search View Animation" msgstr "" -#: prefs.js:1630 +#: prefs.js:1375 msgid "" -"The default Shell removes favorite apps, this option allows to duplicate " -"them in the grid or remove also running applications. Option \"Favorites and " -"Running First\" only works with the Alphabet and Usage sorting" +"When search is activated the search view with search results can animate " +"from the edge of the screen. You can choose the direction, keep the Default " +"(currently Bottom to Top) or disable the animation if you don't like it." msgstr "" -#: prefs.js:1635 -msgid "Include All" +#: prefs.js:1392 +msgid "Workspace Preview Animation" msgstr "" -#: prefs.js:1636 -msgid "Include All - Favorites and Running First" +#: prefs.js:1393 +msgid "" +"When entering / leaving the App Grid / Search view, the workspace preview " +"can animate to/from workspace thumbnail." msgstr "" -#: prefs.js:1637 -msgid "Exclude Favorites (Default)" +#: prefs.js:1398 +msgid "Enable" msgstr "" -#: prefs.js:1638 -msgid "Exclude Running" +#: prefs.js:1406 +msgid "Workspace Switcher" msgstr "" -#: prefs.js:1639 -msgid "Exclude Favorites and Running" +#: prefs.js:1412 +msgid "Wraparound" msgstr "" -#: prefs.js:1647 -msgid "Active Icons in Folder Preview" +#: prefs.js:1413 +msgid "Continue from the last workspace to the first and vice versa" msgstr "" -#: prefs.js:1648 +#: prefs.js:1421 +msgid "Ignore Last (empty) Workspace" +msgstr "" + +#: prefs.js:1422 msgid "" -"If enabled, icons in the folder review behaves like normal icons, you can " -"activate or even drag them directly, without having to open the folder first" +"In Dynamic workspaces mode, there is always one empty workspace at the end. " +"Switcher can ignore this last workspace" msgstr "" -#: prefs.js:1658 -msgid "Center Open Folders" +#: prefs.js:1430 +msgid "Workspace Switcher Animation" msgstr "" -#: prefs.js:1659 +#: prefs.js:1431 msgid "" -"App folder may open in the center of the screen or above the source folder " -"icon" +"Allows you to disable movement of the desktop background during workspace " +"switcher animation outside of the overview. The Static Background mode also " +"keeps Conky and desktop icons on their place during switching." msgstr "" -#: prefs.js:1669 -msgid "Allow Incomplete Pages" +#: prefs.js:1436 +msgid "Static Background" +msgstr "" + +#: prefs.js:1444 +msgid "Workspace Switcher Mode (Isolate Monitors)" msgstr "" -#: prefs.js:1670 +#: prefs.js:1445 msgid "" -"If disabled, icons from the next page (if any) are automatically moved to " -"fill any empty slot left after an icon was (re)moved (to a folder for " -"example)" +"Note that this is a workaround, not full-fledged feature. GNOME Shell does " +"not support separate workspaces for each monitor, so V-Shell switches " +"workspaces only on the primary monitor and moves windows across workspaces " +"on secondary monitors in order to simulate independent behavior. The current " +"monitor is determined by the position of the mouse pointer" msgstr "" -#: prefs.js:1680 -msgid "App Labels Behavior" +#: prefs.js:1450 +msgid "Current Monitor" msgstr "" -#: prefs.js:1681 -msgid "Choose how and when to display app names" +#: prefs.js:1458 +msgid "Workspace Switcher Popup Mode" msgstr "" -#: prefs.js:1686 -msgid "Ellipsized - Expand Selected (Default)" +#: prefs.js:1459 +msgid "" +"This popup shows up when you switch workspace using a keyboard shortcut or " +"gesture outside of the overview. You can to disable the popup at all, or " +"show it on the current monitor (the one with mouse pointer) instead of the " +"primary." msgstr "" -#: prefs.js:1687 -msgid "Always Expanded" +#: prefs.js:1464 +msgid "Show on Primary Monitor (Default)" msgstr "" -#: prefs.js:1688 -msgid "Hidden - Show Selected Only" +#: prefs.js:1465 +msgid "Show on Current Monitor" msgstr "" -#: prefs.js:1695 -msgid "Reset App Grid Layout" +#: prefs.js:1473 +msgid "Notifications" msgstr "" -#: prefs.js:1696 +#: prefs.js:1479 +msgid "Window Attention Handler" +msgstr "" + +#: prefs.js:1480 msgid "" -"Removes all stored app grid positions, after reset icons will be sorted " -"alphabetically, except folder contents" +"When a window requires attention (often a new window), GNOME Shell shows you " +"a notification about it. You can disable popups of these messages " +"(notification will be pushed into the message tray silently) or focus the " +"source window immediately instead" msgstr "" -#: prefs.js:1704 -msgid "Remove App Grid Folders" +#: prefs.js:1484 prefs.js:1499 +msgid "Show Notifications (Default)" msgstr "" -#: prefs.js:1705 -msgid "Removes all folders, folder apps will move to the root grid" +#: prefs.js:1485 +msgid "Disable Notification Popups" msgstr "" -#: prefs.js:1721 -msgid "Window Search Provider - Sorting" +#: prefs.js:1486 +msgid "Immediately Focus Window" msgstr "" -#: prefs.js:1722 -msgid "Choose the window sorting method" +#: prefs.js:1494 +msgid "Favorites" msgstr "" -#: prefs.js:1727 -msgid "Most Recently Used (MRU)" +#: prefs.js:1495 +msgid "Disable pin/unpin app notifications" msgstr "" -#: prefs.js:1728 -msgid "MRU - Current Workspace First" +#: prefs.js:1500 +msgid "Disable Notifications" msgstr "" -#: prefs.js:1729 -msgid "MRU - By Workspaces" +#: prefs.js:1518 +msgid "Main App Grid" msgstr "" -#: prefs.js:1730 -msgid "Stable Sequence - By Workspaces" +#: prefs.js:1524 +msgid "Apps Sorting" msgstr "" -#: prefs.js:1738 -msgid "Enable Fuzzy Match" +#: prefs.js:1525 +msgid "" +"Choose sorting method for the app grid. Note that sorting by usage ignores " +"folders" +msgstr "" + +#: prefs.js:1529 prefs.js:1698 +msgid "Custom (Default)" msgstr "" -#: prefs.js:1739 +#: prefs.js:1530 +msgid "Alphabet - Folders First" +msgstr "" + +#: prefs.js:1531 +msgid "Alphabet - Folders Last" +msgstr "" + +#: prefs.js:1532 +msgid "Usage - No Folders" +msgstr "" + +#: prefs.js:1540 +msgid "Icon Size" +msgstr "" + +#: prefs.js:1541 msgid "" -"Enabling the fuzzy match allows you to skip letters in the pattern you are " -"searching for and find \"Firefox\" even if you type \"ffx\". Works only for " -"the App, Window and Recent files search providers" +"Allows to set a fixed app grid icon size and bypass the default adaptive " +"algorithm" msgstr "" -#: prefs.js:1757 -msgid "Animations - General" +#: prefs.js:1546 +msgid "256" msgstr "" -#: prefs.js:1772 -msgid "Animation Speed" +#: prefs.js:1547 +msgid "224" +msgstr "" + +#: prefs.js:1548 +msgid "208" +msgstr "" + +#: prefs.js:1549 +msgid "192" +msgstr "" + +#: prefs.js:1550 +msgid "176" +msgstr "" + +#: prefs.js:1551 +msgid "160" +msgstr "" + +#: prefs.js:1552 +msgid "144" msgstr "" -#: prefs.js:1773 -#, javascript-format +#: prefs.js:1574 +msgid "Columns per Page (0 for adaptive grid)" +msgstr "" + +#: prefs.js:1575 msgid "" -"Adjusts the global animation speed in % of the default duration - higher " -"value means slower animation" +"Number of columns in the application grid. If set to 0, the number will be " +"set automatically to fit the available width" msgstr "" -#: prefs.js:1781 -msgid "Animations - Overview" +#: prefs.js:1591 +msgid "Rows per Page (0 for adaptive grid)" msgstr "" -#: prefs.js:1787 -msgid "App Grid Animation" +#: prefs.js:1592 +msgid "" +"Number of rows in the application grid. If set to 0, the number will be set " +"automatically to fit the available height" +msgstr "" + +#: prefs.js:1620 +msgid "App Grid Page Width Scale" +msgstr "" + +#: prefs.js:1621 +msgid "Adjusts maximum app grid page width relative to the available space" +msgstr "" + +#: prefs.js:1643 +msgid "App Grid Page Height Scale" +msgstr "" + +#: prefs.js:1644 +msgid "Adjusts maximum app grid page height relative to the available space" +msgstr "" + +#: prefs.js:1663 +msgid "Grid Spacing" msgstr "" -#: prefs.js:1788 +#: prefs.js:1664 msgid "" -"When entering the App Grid view, the app grid animates from the edge of the " -"screen. You can choose the direction, keep the Default (direction will be " -"selected automatically) or disable the animation if you don't like it" +"V-Shell uses this value to calculate grid dimensions for adaptive options. " +"However, the main grid automatically adjusts the spacing based on the grid " +"and available space" msgstr "" -#: prefs.js:1795 prefs.js:1813 -msgid "Right to Left" +#: prefs.js:1674 +msgid "Allow Incomplete Pages" msgstr "" -#: prefs.js:1796 prefs.js:1814 -msgid "Left to Right" +#: prefs.js:1675 +msgid "" +"If disabled, icons from the next page (if any) are automatically moved to " +"fill any empty slot left after an icon was (re)moved (to a folder for " +"example)" msgstr "" -#: prefs.js:1797 prefs.js:1815 -msgid "Bottom to Top" +#: prefs.js:1687 +msgid "App Folders" msgstr "" -#: prefs.js:1798 prefs.js:1816 -msgid "Top to Bottom" +#: prefs.js:1693 +msgid "Folder Apps Sorting" msgstr "" -#: prefs.js:1805 -msgid "Search View Animation" +#: prefs.js:1694 +msgid "Choose sorting method for app folders" +msgstr "" + +#: prefs.js:1699 +msgid "Alphabet" msgstr "" -#: prefs.js:1806 +#: prefs.js:1700 +msgid "Usage" +msgstr "" + +#: prefs.js:1708 +msgid "Active Icons in Folder Preview" +msgstr "" + +#: prefs.js:1709 msgid "" -"When search is activated the search view with search results can animate " -"from the edge of the screen. You can choose the direction, keep the Default " -"(currently Bottom to Top) or disable the animation if you don't like it." +"If enabled, icons in the folder preview behaves like normal icons, you can " +"activate or even drag them directly, without having to open the folder " +"first. This option also affects the app grid default icon size" msgstr "" -#: prefs.js:1824 -msgid "Workspace Preview Animation" +#: prefs.js:1720 +msgid "App Folder Preview Grid Size" msgstr "" -#: prefs.js:1825 +#: prefs.js:1721 msgid "" -"When entering / leaving the App Grid / Search view, the workspace preview " -"can animate to/from workspace thumbnail." +"Sets a grid size (number of icons) in the folder icon preview. 3x3 options " +"automatically switches between 2x2 and 3x3 grid depending on the number of " +"icons in the folder" msgstr "" -#: prefs.js:1831 -msgid "Enable" +#: prefs.js:1725 +msgid "2x2 (Default)" msgstr "" -#: prefs.js:1839 -msgid "Workspace Switcher" +#: prefs.js:1726 +msgid "3x3 for 5+ apps" msgstr "" -#: prefs.js:1845 -msgid "Wraparound" +#: prefs.js:1727 +msgid "3x3 for 9+ apps" msgstr "" -#: prefs.js:1846 -msgid "Continue from the last workspace to the first and vice versa" +#: prefs.js:1735 +msgid "Folder Icon Size" msgstr "" -#: prefs.js:1854 -msgid "Ignore Last (empty) Workspace" +#: prefs.js:1736 +msgid "" +"Allows to set a fixed icon size and bypass the default adaptive algorithm in " +"the open folder dialog" msgstr "" -#: prefs.js:1855 +#: prefs.js:1754 +msgid "Maximum Number Of Columns (0 for automatic)" +msgstr "" + +#: prefs.js:1755 msgid "" -"In Dynamic workspaces mode, there is always one empty workspace at the end. " -"Switcher can ignore this last workspace" +"Specifies the maximum number of columns per page in folder grids. If you " +"leave the value at 0, the maximum number of columns will be calculated based " +"on available space. The actual folder grid dimensions will be determined by " +"the number of items within the set limits" msgstr "" -#: prefs.js:1863 -msgid "Workspace Switcher Animation" +#: prefs.js:1771 +msgid "Maximum Number Of Rows (0 for automatic)" msgstr "" -#: prefs.js:1864 +#: prefs.js:1772 msgid "" -"Allows you to disable movement of the desktop background during workspace " -"switcher animation outside of the overview. The Static Background mode also " -"keeps Conky and desktop icons on their place during switching." +"Specifies the maximum number of rows per page in folder grids. If you leave " +"the value at 0, the maximum number of rows will be calculated based on " +"available space. The actual folder grid dimensions will be determined by the " +"number of items within the set limits" msgstr "" -#: prefs.js:1870 -msgid "Static Background" +#: prefs.js:1790 +msgid "Folder Grid Spacing" msgstr "" -#: prefs.js:1878 -msgid "Workspace Switcher Mode (Isolate Monitors)" +#: prefs.js:1791 +msgid "Adjusts the spacing between icons in a folder grid" +msgstr "" + +#: prefs.js:1801 +msgid "Center Open Folders" msgstr "" -#: prefs.js:1879 +#: prefs.js:1802 msgid "" -"Note that this is a workaround, not full-fledged feature. GNOME Shell does " -"not support separate workspaces for each monitor, so V-Shell switches " -"workspaces only on the primary monitor and moves windows across workspaces " -"on secondary monitors in order to simulate independent behavior. The current " -"monitor is determined by the position of the mouse pointer" +"App folders may open in the center of the screen or be centered on the " +"folder's source icon" msgstr "" -#: prefs.js:1885 -msgid "Current Monitor" +#: prefs.js:1814 +msgid "Content" msgstr "" -#: prefs.js:1893 -msgid "Workspace Switcher Popup Mode" +#: prefs.js:1820 +msgid "App Grid Content" msgstr "" -#: prefs.js:1894 +#: prefs.js:1821 msgid "" -"This popup shows up when you switch workspace using a keyboard shortcut or " -"gesture outside of the overview. You can to disable the popup at all, or " -"show it on the current monitor (the one with mouse pointer) instead of the " -"primary." +"The default Shell removes favorite apps, this option allows to duplicate " +"them in the grid or remove also running applications. Option \"Favorites and " +"Running First\" only works with the Alphabet and Usage sorting" msgstr "" -#: prefs.js:1900 -msgid "Show on Primary Monitor (Default)" +#: prefs.js:1825 +msgid "Include All" msgstr "" -#: prefs.js:1901 -msgid "Show on Current Monitor" +#: prefs.js:1826 +msgid "Include All - Favorites and Running First" msgstr "" -#: prefs.js:1909 -msgid "Notifications" +#: prefs.js:1827 +msgid "Exclude Favorites (Default)" msgstr "" -#: prefs.js:1915 -msgid "Window Attention Handler" +#: prefs.js:1828 +msgid "Exclude Running" +msgstr "" + +#: prefs.js:1829 +msgid "Exclude Favorites and Running" +msgstr "" + +#: prefs.js:1837 +msgid "App Labels Behavior" +msgstr "" + +#: prefs.js:1838 +msgid "Choose how and when to display app names" msgstr "" -#: prefs.js:1916 +#: prefs.js:1842 +msgid "Ellipsized - Expand Selected (Default)" +msgstr "" + +#: prefs.js:1843 +msgid "Always Expanded" +msgstr "" + +#: prefs.js:1844 +msgid "Hidden - Show Selected Only" +msgstr "" + +#: prefs.js:1852 +msgid "Show Page Navigation Buttons" +msgstr "" + +#: prefs.js:1853 msgid "" -"When a window requires attention (often a new window), GNOME Shell shows you " -"a notification about it. You can disable popups of these messages " -"(notification will be pushed into the message tray silently) or focus the " -"source window immediately instead" +"You can hide the page navigation buttons if you don't need them or want to " +"get more space for icons. The buttons are hidden automatically when there is " +"only one page in the app grid" msgstr "" -#: prefs.js:1921 prefs.js:1937 -msgid "Show Notifications (Default)" +#: prefs.js:1866 +msgid "Performance" msgstr "" -#: prefs.js:1922 -msgid "Disable Notification Popups" +#: prefs.js:1872 +msgid "Smooth App Grid Animations" msgstr "" -#: prefs.js:1923 -msgid "Immediately Focus Window" +#: prefs.js:1873 +msgid "" +"This option allows V-Shell to pre-realize app grid and app folders during " +"session startup in order to avoid stuttering animations when using them for " +"the first time. If enabled, the session startup needs a little bit more time " +"to finish and necessary memory will be allocated at this time" msgstr "" -#: prefs.js:1931 -msgid "Favorites" +#: prefs.js:1883 +msgid "Reset" msgstr "" -#: prefs.js:1932 -msgid "Disable pin/unpin app notifications" +#: prefs.js:1888 +msgid "Reset App Grid Layout" msgstr "" -#: prefs.js:1938 -msgid "Disable Notifications" +#: prefs.js:1889 +msgid "" +"Removes all stored app grid positions, after reset icons will be sorted " +"alphabetically, except folder contents" +msgstr "" + +#: prefs.js:1897 +msgid "Remove App Grid Folders" +msgstr "" + +#: prefs.js:1898 +msgid "Removes all folders, folder apps will move to the root grid" msgstr "" -#: prefs.js:1953 +#: prefs.js:1914 +msgid "Optional Modules" +msgstr "" + +#: prefs.js:1920 msgid "" -"V-Shell Modules (allows you to disable modules that conflict with another " -"extension)" +"Windows Search Provider - Moved from V-Shell to the standalone \"WSP\" " +"extension" msgstr "" -#: prefs.js:1959 -msgid "WindowSearchProvider" +#: prefs.js:1921 +msgid "" +"NOTE: This module has been released as a standalone extension with new " +"features, click to learn more. Related V-Shell options are still available " +"if you install the WSP extension.\n" +"\n" +"WSP adds adds open windows to the search results. You can search app names " +"and window titles. You can also use \"wq//\" or custom prefix (also by " +"pressing the Space hotkey in the overview, or clicking dash icon) to " +"suppress results from other search providers" msgstr "" -#: prefs.js:1960 +#: prefs.js:1928 msgid "" -"Activates the window search provider that adds open windows to the search " -"results. You can search app names and window titles. You can also use \"wq//" -"\" prefix (also by pressing the Space hotkey in the overview, or clicking " -"dash icon) to suppress results from other search providers" +"Extensions Search Provider - Moved from V-Shell to the standalone \"ESP\" " +"extension" msgstr "" -#: prefs.js:1968 -msgid "RecentFilesSearchProvider" +#: prefs.js:1929 +msgid "" +"NOTE: This module has been released as a standalone extension with new " +"features, click to learn more. Related V-Shell options are still available " +"if you install the ESP extension.\n" +"\n" +"ESP adds extensions to the search results. You can also use \"eq//\" or " +"custom prefix (also by pressing the Ctrl + Shift + Space hotkey in the " +"overview, or clicking dash icon) to suppress results from other search " +"providers" msgstr "" -#: prefs.js:1969 +#: prefs.js:1936 msgid "" -"Activates the recent files search provider that can be triggered by a dash " -"icon, Ctrl + Space hotkey or by typing \"fq//\" prefix in the search entry " -"field. This option needs File History option enabled in the GNOME Privacy " -"settings" +"Window Thumbnails (PiP) - Moved from V-Shell to the standalone \"WTMB\" " +"extension" msgstr "" -#: prefs.js:1977 -msgid "ExtensionsSearchProvider" +#: prefs.js:1937 +msgid "" +"NOTE: This module has been released as a standalone extension with new " +"features, click to learn more. Related V-Shell options are still available " +"if you install the WTMB extension.\n" +"\n" +"WTMB allows the creation of Picture-in-Picture like window thumbnails that " +"you can use for monitoring of windows on another workspace" msgstr "" -#: prefs.js:1978 +#: prefs.js:1944 msgid "" -"Activates the extensions search provider that adds extensions to the search " -"results. You can also use \"eq//\" prefix (also by pressing the Ctrl + Shift " -"+ Space hotkey in the overview, or clicking dash icon) to suppress results " -"from other search providers" +"Built-in Modules (allows to disable modules that conflict with another " +"extension)" msgstr "" -#: prefs.js:1986 +#: prefs.js:1950 msgid "AppDisplay / IconGrid" msgstr "" -#: prefs.js:1987 +#: prefs.js:1951 msgid "App grid customization and options" msgstr "" -#: prefs.js:1995 +#: prefs.js:1959 msgid "AppFavorites" msgstr "" -#: prefs.js:1996 +#: prefs.js:1960 msgid "Pin/unpin app notification options" msgstr "" -#: prefs.js:2005 +#: prefs.js:1969 msgid "Dash customization and options, support for vertical orientation" msgstr "" -#: prefs.js:2014 +#: prefs.js:1978 msgid "Hot corner options" msgstr "" -#: prefs.js:2022 +#: prefs.js:1986 msgid "MessageTray" msgstr "" -#: prefs.js:2023 +#: prefs.js:1987 msgid "Notification position options" msgstr "" -#: prefs.js:2031 +#: prefs.js:1995 msgid "OsdWindow" msgstr "" -#: prefs.js:2032 +#: prefs.js:1996 msgid "OSD position options" msgstr "" -#: prefs.js:2040 +#: prefs.js:2004 msgid "OverlayKey" msgstr "" -#: prefs.js:2041 +#: prefs.js:2005 msgid "Overlay (Super/Window) key options" msgstr "" -#: prefs.js:2050 +#: prefs.js:2014 msgid "Panel options" msgstr "" -#: prefs.js:2059 +#: prefs.js:2023 msgid "Search view and app search provider customization and options" msgstr "" -#: prefs.js:2067 +#: prefs.js:2031 msgid "SearchController" msgstr "" -#: prefs.js:2068 +#: prefs.js:2032 msgid "Escape key behavior options in the overview" msgstr "" -#: prefs.js:2076 +#: prefs.js:2040 msgid "SwipeTracker" msgstr "" -#: prefs.js:2077 +#: prefs.js:2041 msgid "Gestures for vertical workspace orientation" msgstr "" -#: prefs.js:2085 +#: prefs.js:2049 msgid "WindowAttentionHandler" msgstr "" -#: prefs.js:2086 +#: prefs.js:2050 msgid "Window attention handler options" msgstr "" -#: prefs.js:2094 +#: prefs.js:2058 msgid "WindowManager" msgstr "" -#: prefs.js:2095 +#: prefs.js:2059 msgid "" "Fixes an upstream bug in the minimization animation of a full-screen window" msgstr "" -#: prefs.js:2103 +#: prefs.js:2067 msgid "WindowPreview" msgstr "" -#: prefs.js:2104 +#: prefs.js:2068 msgid "" "Window preview options, fixes an upstream bug that fills the system log with " "errors when you close a window from the overview or exit the overview with a " "gesture when any window is selected" msgstr "" -#: prefs.js:2112 -msgid "WindowThumbnail" -msgstr "" - -#: prefs.js:2113 -msgid "" -"Create Window Thumbnail (PIP) option in the app icon menu and window preview " -"actions" -msgstr "" - -#: prefs.js:2121 +#: prefs.js:2076 msgid "Workspace" msgstr "" -#: prefs.js:2122 +#: prefs.js:2077 msgid "" "Fixes workspace preview allocations for vertical workspaces orientation and " "window scaling in static overview modes" msgstr "" -#: prefs.js:2130 +#: prefs.js:2085 msgid "WorkspaceAnimation" msgstr "" -#: prefs.js:2131 +#: prefs.js:2086 msgid "Static workspace animation option" msgstr "" -#: prefs.js:2139 +#: prefs.js:2094 msgid "WorkspaceSwitcherPopup" msgstr "" -#: prefs.js:2140 +#: prefs.js:2095 msgid "Workspace switcher popup orientation and position options" msgstr "" -#: prefs.js:2156 +#: prefs.js:2111 msgid "Keyboard" msgstr "" -#: prefs.js:2162 +#: prefs.js:2117 msgid "Override Page Up/Down Shortcuts" msgstr "" -#: prefs.js:2163 +#: prefs.js:2118 msgid "" "This option automatically overrides the (Shift +) Super + Page Up/Down " "keyboard shortcuts for the current workspace orientation. If you encounter " "any issues, check the configuration in the dconf editor" msgstr "" -#: prefs.js:2186 -msgid "Performance" +#: prefs.js:2126 +msgid "Workarounds / Hacks" msgstr "" -#: prefs.js:2192 -msgid "Smooth App Grid Animations" +#: prefs.js:2132 +msgid "Delay at Startup" msgstr "" -#: prefs.js:2193 +#: prefs.js:2133 msgid "" -"This option allows V-Shell to pre-realize app grid and app folders during " -"session startup in order to avoid stuttering animations when using them for " -"the first time. If enabled, the session startup needs a little bit more time " -"to finish and necessary memory will be allocated at this time" -msgstr "" - -#: prefs.js:2201 -msgid "Workarounds" +"If you encounter issues during GNOME Shell startup after logging in, which " +"could be caused by V-Shell's incompatibility with another extension, try " +"enabling this option. When enabled, V-Shell is activated after the startup " +"is complete. It will activate automatically when Dash to Dock, Ubuntu Dock " +"or Dash to Panel extensions are detected." msgstr "" -#: prefs.js:2207 +#: prefs.js:2141 msgid "Fix New Window Not In Focus" msgstr "" -#: prefs.js:2208 +#: prefs.js:2142 msgid "" "If you often find that the app window you open from the Activities overview " "does not get focus, try enabling this option." msgstr "" -#: prefs.js:2216 -msgid "Fix New Window Not On Current Monitor" +#: prefs.js:2150 +msgid "Fix New Window Not On Current Monitor (experimental)" msgstr "" -#: prefs.js:2217 +#: prefs.js:2151 msgid "" "If you use multiple monitors, you may encounter the issue of new windows " "opening on a different monitor than expected. This option moves those " @@ -1858,102 +1876,91 @@ msgid "" "moving the window back to the previous monitor during initialization" msgstr "" -#: prefs.js:2238 +#: prefs.js:2174 msgid "Version" msgstr "" -#: prefs.js:2244 +#: prefs.js:2180 msgid "Reset all options" msgstr "" -#: prefs.js:2245 -msgid "Set all options to default values." +#: prefs.js:2181 +msgid "Reset all options to their default values" msgstr "" -#: prefs.js:2251 +#: prefs.js:2187 msgid "Links" msgstr "" -#: prefs.js:2255 +#: prefs.js:2191 msgid "Homepage" msgstr "" -#: prefs.js:2256 +#: prefs.js:2192 msgid "Source code and more info about this extension" msgstr "" -#: prefs.js:2261 +#: prefs.js:2197 msgid "Changelog" msgstr "" -#: prefs.js:2262 +#: prefs.js:2198 msgid "See what's changed." msgstr "" -#: prefs.js:2267 +#: prefs.js:2203 msgid "GNOME Extensions" msgstr "" -#: prefs.js:2268 +#: prefs.js:2204 msgid "Rate and comment V-Shell on the GNOME Extensions site" msgstr "" -#: prefs.js:2273 +#: prefs.js:2209 msgid "Report a bug or suggest new feature" msgstr "" -#: prefs.js:2274 +#: prefs.js:2210 msgid "Help me to help you!" msgstr "" -#: prefs.js:2279 +#: prefs.js:2215 msgid "Buy Me a Coffee" msgstr "" -#: prefs.js:2280 -msgid "If you like V-Shell, you can help me with my coffee expenses" +#: prefs.js:2216 +msgid "Enjoying V-Shell? Consider supporting it by buying me a coffee!" msgstr "" -#: lib/windowSearchProvider.js:124 lib/windowSearchProvider.js:126 -msgid "Open Windows" +#: lib/util.js:408 +msgid "Updating V-Shell" msgstr "" -#: lib/windowSearchProvider.js:125 -msgid "Search open windows" +#: lib/windowSearchProvider.js:118 +msgid "Open Windows" msgstr "" -#: lib/overviewControls.js:813 -msgid "" -"Overview background crashed!\n" -"If you are using Blur My Shell, disable overview blur in its settings and re-" -"enable V-Shell Overview Background to avoid visual glitches." +#: lib/windowSearchProvider.js:119 +msgid "Search open windows" msgstr "" -#: lib/dash.js:1296 +#: lib/dash.js:983 msgid "Force Quit" msgstr "" -#: lib/dash.js:1313 +#: lib/dash.js:1000 msgid "Move App to Current Workspace ( Shift + Click )" msgstr "" -#: lib/dash.js:1368 -msgid "Search Open Windows (Hotkey: Space)" -msgstr "" - -#: lib/dash.js:1409 -msgid "Search Recent Files (Hotkey: Shift + Space)" -msgstr "" - -#: lib/dash.js:1444 -msgid "Search Extensions (Hotkey: Ctrl + Space)" +#: lib/dash.js:1003 +msgid "Create Window Thumbnail/PiP" msgstr "" -#: lib/search.js:275 +#: lib/search.js:336 msgid "Searching…" msgstr "" -#: lib/search.js:277 +#: lib/search.js:338 msgid "No results." msgstr "" @@ -1962,19 +1969,19 @@ msgid "Reset profile to defaults" msgstr "" #: lib/optionsFactory.js:303 -msgid "GNOME 3" +msgid "GNOME 3 Layout (Vertical WS)" msgstr "" #: lib/optionsFactory.js:304 -msgid "GNOME 40+ - Bottom Hot Edge" +msgid "GNOME 4x Layout, Bottom Hot Edge (Horizontal WS)" msgstr "" #: lib/optionsFactory.js:305 -msgid "Hot Corner Centric - Top Left Hot Corner" +msgid "Top Left Hot Corner Centric (Vertical WS)" msgstr "" #: lib/optionsFactory.js:306 -msgid "Dock Overview - Bottom Hot Edge" +msgid "Dock-Like Overview, Bottom Hot Edge (Horizontal WS)" msgstr "" #: lib/optionsFactory.js:328 @@ -1985,18 +1992,14 @@ msgstr "" msgid "Save current settings into this profile" msgstr "" -#: lib/recentFilesSearchProvider.js:106 lib/recentFilesSearchProvider.js:108 +#: lib/recentFilesSearchProvider.js:119 msgid "Recent Files" msgstr "" -#: lib/recentFilesSearchProvider.js:107 -msgid "Search recent files" -msgstr "" - #: lib/extensionsSearchProvider.js:127 -msgid "Search extensions" +msgid "Extensions" msgstr "" #: lib/extensionsSearchProvider.js:128 -msgid "Extensions" +msgid "Search extensions" msgstr "" diff --git a/extensions/46/vertical-workspaces/prefs.js b/extensions/46/vertical-workspaces/prefs.js index 24e404d..1713643 100644 --- a/extensions/46/vertical-workspaces/prefs.js +++ b/extensions/46/vertical-workspaces/prefs.js @@ -46,6 +46,11 @@ export default class VShell extends ExtensionPreferences { optionList: this._getBehaviorOptionList(itemFactory), }, { + title: _('App Grid'), + iconName: 'view-app-grid-symbolic', + optionList: this._getAppGridOptionList(itemFactory), + }, + { title: _('Modules'), iconName: 'application-x-addon-symbolic', optionList: this._getModulesOptionList(itemFactory), @@ -97,12 +102,16 @@ export default class VShell extends ExtensionPreferences { // options item format: // (text, caption, widget, settings-variable, [options for combo], sensitivity-depends-on-bool-variable) - optionList.push( - itemFactory.getRowWidget( - _('Custom Profiles'), - _('Sets of settings that can help you with the initial customization') - ) - ); + optionList.push(itemFactory.getRowWidget( + _('Custom Profiles'), + null + )); + + optionList.push(itemFactory.getRowWidget( + _('Save your configurations'), + _("The predefined sets of settings, which can help you with the initial configuration and exploring V-Shell's possibilities, can be renamed and overridden by your own configurations"), + itemFactory.newLabel() + )); optionList.push(itemFactory.getRowWidget( _('Profile 1'), @@ -268,7 +277,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('Workspace Thumbnails Max Scale - Window Picker'), - _('Adjusts maximum size of the workspace thumbnails in the overview (% relative to display width)'), + _('Adjusts the maximum size of the workspace thumbnails in the overview (percentage relative to display width)'), wsThumbnailScale, 'wsThumbnailScale' ) @@ -324,11 +333,11 @@ export default class VShell extends ExtensionPreferences { }); const wsSpacingScale = itemFactory.newScale(wsSpacingAdjustment); - wsSpacingScale.add_mark(350, Gtk.PositionType.TOP, null); + wsSpacingScale.add_mark(this.opt.WS_MAX_SPACING_OFF_SCREEN, Gtk.PositionType.TOP, null); optionList.push( itemFactory.getRowWidget( _('Workspaces Spacing'), - _('Adjusts spacing between workspace previews so you can control how much of the adjacent workspaces overlap to the current workspace overview. Default value should set the adjacent workspaces off-screen.'), + _('Adjusts spacing in pixels between workspace previews, allowing you to control how much the adjacent workspaces overlap in the current workspace overview. Setting the value above 349 pixels disables the visibility of workspaces other than the current one during transitions to/from the app grid view, which can also save some graphical resources if many windows are open on other workspaces'), wsSpacingScale, 'wsMaxSpacing' ) @@ -350,25 +359,6 @@ export default class VShell extends ExtensionPreferences { ) ); - const agPageAdjustment = new Gtk.Adjustment({ - upper: 100, - lower: 50, - step_increment: 1, - page_increment: 10, - }); - - const agPageWidthScale = itemFactory.newScale(agPageAdjustment); - agPageWidthScale.add_mark(90, Gtk.PositionType.TOP, null); - optionList.push( - itemFactory.getRowWidget( - _('App Grid Page Width Scale'), - _('Adjusts max app grid page width relative to the available space.'), - agPageWidthScale, - 'appGridPageWidthScale', - null, - 'appDisplayModule' - ) - ); optionList.push( itemFactory.getRowWidget( @@ -406,7 +396,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('Search Results Width'), - _('Adjusts maximum width of search results view (% relative to default). This allows to fit more (or less) app icons into the app search result'), + _('Adjusts the maximum width of search results view (percentage relative to default). This allows to fit more (or less) app icons into the app search result'), searchViewScale, 'searchViewScale', null, @@ -469,7 +459,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( - _('Horizontal Position (% from left)'), + _('Horizontal Position (percentage from the left)'), _('This popup shows up when you switch workspace using a keyboard shortcut or gesture outside of the overview. You can disable it on the "Behavior" tab. If you want more control over the popup, try the "Workspace Switcher Manager" extension'), hScale, 'wsSwPopupHPosition', @@ -490,7 +480,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( - _('Vertical Position (% from top)'), + _('Vertical Position (percentage from the top)'), null, vScale, 'wsSwPopupVPosition', @@ -594,7 +584,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('Workspace Thumbnails Max Scale'), - _('Adjusts maximum size of the workspace thumbnails (% relative to display width / height) for secondary monitors'), + _('Adjusts maximum size of the workspace thumbnails (percentage relative to the display width / height) for secondary monitors'), secWsThumbnailScale, 'secWsThumbnailScale' ) @@ -608,7 +598,7 @@ export default class VShell extends ExtensionPreferences { }); const wsSecScaleScale = itemFactory.newScale(wsSecScaleAdjustment); - wsScaleScale.add_mark(100, Gtk.PositionType.TOP, null); + wsScaleScale.add_mark(95, Gtk.PositionType.TOP, null); optionList.push( itemFactory.getRowWidget( _('Workspace Preview Scale'), @@ -647,17 +637,18 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('Dash Max Icon Size'), - _('Maximum size of Dash icons in pixels'), + _('Maximum size of Dash icons in pixels. Adaptive option switches between default 64 and 48 for low resolution displays'), itemFactory.newDropDown(), 'dashMaxIconSize', [ - [_('128'), 128], - [_('112'), 112], - [_('96'), 96], - [_('80'), 80], - [_('64'), 64], - [_('48'), 48], - [_('32'), 32], + [_('Adaptive (Default)'), 0], + [_('128'), 128], + [_('112'), 112], + [_('96'), 96], + [_('80'), 80], + [_('64'), 64], + [_('48'), 48], + [_('32'), 32], ], 'dashModule' ) @@ -865,163 +856,6 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( - _('App Grid') - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('Icon Size'), - _('Allows to set a fixed app grid icon size and bypass the default adaptive algorithm'), - itemFactory.newDropDown(), - 'appGridIconSize', - [ - [_('Adaptive (Default)'), -1], - [_('256'), 256], - [_('224'), 224], - [_('208'), 208], - [_('192'), 192], - [_('176'), 176], - [_('160'), 160], - [_('144'), 144], - [_('128'), 128], - [_('112'), 112], - [_('96'), 96], - [_('80'), 80], - [_('64'), 64], - [_('48'), 48], - // [_('32'), 32], - ], - 'appDisplayModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('Folder Icon Size'), - _('Allows to set a fixed icon size and bypass the default adaptive algorithm in the open folder dialog'), - itemFactory.newDropDown(), - 'appGridFolderIconSize', - [ - [_('Adaptive (Default)'), -1], - [_('128'), 128], - [_('112'), 112], - [_('96'), 96], - [_('80'), 80], - [_('64'), 64], - [_('48'), 48], - [_('32'), 32], - ], - 'appDisplayModule' - ) - ); - - const folderIconGridCombo = itemFactory.newDropDown(); - optionList.push( - itemFactory.getRowWidget( - _('Max App Folder Icon Grid Size'), - _('Sets a grid size (number of icons) in the folder preview. 3x3 options automatically switches between 2x2 and 3x3 grid depending on the number of icons in the folder'), - folderIconGridCombo, - 'appGridFolderIconGrid', - [ - [_('2x2 (Default)'), 2], - [_('3x3 for 5+ apps'), 3], - [_('3x3 for 9+ apps'), 4], - ], - 'appDisplayModule' - ) - ); - - const columnsAdjustment = new Gtk.Adjustment({ - upper: 15, - lower: 0, - step_increment: 1, - page_increment: 1, - }); - - const columnsSpinBtn = itemFactory.newSpinButton(columnsAdjustment); - optionList.push(itemFactory.getRowWidget( - _('Columns per Page (0 for adaptive grid)'), - _('Number of columns in the application grid. If set to 0 (the default), the number will be set automatically to fit the available width'), - columnsSpinBtn, - 'appGridColumns', - null, - 'appDisplayModule' - )); - - const rowsAdjustment = new Gtk.Adjustment({ - upper: 15, - lower: 0, - step_increment: 1, - page_increment: 1, - }); - - const rowsSpinBtn = itemFactory.newSpinButton(rowsAdjustment); - optionList.push(itemFactory.getRowWidget( - _('Rows per Page (0 for adaptive grid)'), - _('Number of rows in the application grid. If set to 0 (the default), the number will be set automatically to fit the available height'), - rowsSpinBtn, - 'appGridRows', - null, - 'appDisplayModule' - )); - - const folderColumnsAdjustment = new Gtk.Adjustment({ - upper: 15, - lower: 0, - step_increment: 1, - page_increment: 1, - }); - - const folderColumnsSpinBtn = itemFactory.newSpinButton(folderColumnsAdjustment); - optionList.push(itemFactory.getRowWidget( - _('Folder Columns per Page (0 for adaptive grid)'), - _('Number of columns in folder grid. If you leave the value at 0, the number of columns will be calculated to fit all the folder icons on one page'), - folderColumnsSpinBtn, - 'appGridFolderColumns', - null, - 'appDisplayModule' - )); - - const folderRowsAdjustment = new Gtk.Adjustment({ - upper: 15, - lower: 0, - step_increment: 1, - page_increment: 1, - }); - - const folderRowsSpinBtn = itemFactory.newSpinButton(folderRowsAdjustment); - optionList.push(itemFactory.getRowWidget( - _('Folder Rows per Page (0 for adaptive grid)'), - _('Number of rows in folder grid. If you leave the value at 0, the number of rows will be calculated to fit all the folder icons on one page'), - folderRowsSpinBtn, - 'appGridFolderRows', - null, - 'appDisplayModule' - )); - - const appGridSpacingAdjustment = new Gtk.Adjustment({ - upper: 30, - lower: 5, - step_increment: 1, - page_increment: 5, - }); - - const appGridSpacingScale = itemFactory.newScale(appGridSpacingAdjustment); - appGridSpacingScale.add_mark(12, Gtk.PositionType.TOP, null); - optionList.push( - itemFactory.getRowWidget( - _('Grid Spacing'), - _('Adjusts the spacing between icons in a grid, the real impact is on folders'), - appGridSpacingScale, - 'appGridSpacing', - null, - 'appDisplayModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( _('Search') ) ); @@ -1029,10 +863,11 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('App Search Icon Size'), - _('Size of results provided by the App Search Provider - smaller size allows to fit more results'), + _('Size of results provided by the App Search Provider - smaller size allows to fit more results. Adaptive option switches between default 96 and 64 for low resolution displays'), itemFactory.newDropDown(), 'searchIconSize', [ + [_('Adaptive'), 0], [_('128'), 128], [_('112'), 112], [_('96 (Default)'), 96], @@ -1232,6 +1067,16 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( + _('Click Empty Space To Close'), + _('Enables clicking on an empty space in the overview to close it'), + itemFactory.newSwitch(), + 'clickEmptyClose', + null + ) + ); + + optionList.push( + itemFactory.getRowWidget( _('Overlay Key (Super/Windows)') ) ); @@ -1239,7 +1084,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('Single-Press Action'), - _('Disable or change behavior when you press and release the Super key. The "Search Windows" options requires the "WSP (Window Search Provider)" extension installed and enabled. Link is available on the Modules tab in Settings'), + _('Disable or change behavior when you press and release the Super key. The "Search Windows" options requires the "WSP (Window Search Provider)" extension installed and enabled. Link is available on the Modules tab in Settings. If you want another extension (like AATWS) to handle the overlay key, set this option to "Overview - Window Picker (Default)" and the "Double-Press Action" option to "Applications (Default)"'), itemFactory.newDropDown(), 'overlayKeyPrimary', [ @@ -1249,7 +1094,7 @@ export default class VShell extends ExtensionPreferences { [_('Applications'), 3], [_('Overview - Static WS Preview'), 4], [_('Overview - Static Workspace'), 5], - [_('Search Windows'), 6], + [_('Search Windows (requires WSP extension)'), 6], // [_('Search Recent Files'), 7], ], 'overlayKeyModule' @@ -1265,7 +1110,7 @@ export default class VShell extends ExtensionPreferences { [ [_('Disable'), 0], [_('Applications (Default)'), 1], - [_('Search Windows'), 2], + [_('Search Windows (requires WSP extension)'), 2], [_('Overview - Window Picker'), 3], // [_('Search Recent Files'), 4], ], @@ -1282,17 +1127,17 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('Hot Corner Action'), - _('Disable or change behavior of the hot corner. Holding down the Ctrl key while hitting the hot corner switches between Overview/Applications actions'), + _('Disable or change behavior of the hot corner. Holding down the Ctrl key while hitting the hot corner switches between Overview/Applications actions. The "Search Windows" option requires the "WSP (Window Search Provider)" extension installed and enabled'), itemFactory.newDropDown(), 'hotCornerAction', [ [_('Disable'), 0], [_('Follow Global Overview Mode'), 1], - [_('Overview - Window Picker'), 2], + [_('Overview - Window Picker (Default)'), 2], [_('Applications'), 3], [_('Overview - Static WS Preview'), 4], [_('Overview - Static Workspace'), 5], - [_('Search Windows'), 6], + [_('Search Windows (requires WSP extension)'), 6], ], 'layoutModule' ) @@ -1389,21 +1234,6 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( - _('Search Windows Icon - Scroll Action'), - _('Choose the behavior when scrolling over the Search Windows icon. The window cycler works with a list of windows sorted by "Most Recently Used" of the current workspace or all workspaces. Scrolling up cycles through previously used windows on the same workspace, or all windows regardless workspace. This option is mainly useful for the static workspace overview mode.'), - itemFactory.newDropDown(), - 'searchWindowsIconScroll', - [ - [_('Default'), 0], - [_('Cycle All Windows'), 1], - [_('Cycle Windows On Current WS'), 2], - ], - 'dashModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( _('Workspace Thumbnails') ) ); @@ -1489,128 +1319,21 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( - _('App Grid') - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('App Grid Order'), - _('Choose sorting method for the app grid. Note that sorting by usage ignores folders'), - itemFactory.newDropDown(), - 'appGridOrder', - [ - [_('Custom (Default)'), 0], - [_('Alphabet - Folders First'), 1], - [_('Alphabet - Folders Last'), 2], - [_('Usage - No Folders'), 3], - ], - 'appDisplayModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('App Folder Order'), - _('Choose sorting method for app folders'), - itemFactory.newDropDown(), - 'appFolderOrder', - [ - [_('Custom (Default)'), 0], - [_('Alphabet'), 1], - [_('Usage'), 2], - ], - 'appDisplayModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('App Grid Content'), - _('The default Shell removes favorite apps, this option allows to duplicate them in the grid or remove also running applications. Option "Favorites and Running First" only works with the Alphabet and Usage sorting'), - itemFactory.newDropDown(), - 'appGridContent', - [ - [_('Include All'), 0], - [_('Include All - Favorites and Running First'), 1], - [_('Exclude Favorites (Default)'), 2], - [_('Exclude Running'), 3], - [_('Exclude Favorites and Running'), 4], - ], - 'appDisplayModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('Active Icons in Folder Preview'), - _('If enabled, icons in the folder review behaves like normal icons, you can activate or even drag them directly, without having to open the folder first'), - itemFactory.newSwitch(), - 'appGridActivePreview', - null, - 'appDisplayModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('Center Open Folders'), - _('App folder may open in the center of the screen or above the source folder icon'), - itemFactory.newSwitch(), - 'appGridFolderCenter', - null, - 'appDisplayModule' - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('Allow Incomplete Pages'), - _('If disabled, icons from the next page (if any) are automatically moved to fill any empty slot left after an icon was (re)moved (to a folder for example)'), - itemFactory.newSwitch(), - 'appGridIncompletePages', - null, - 'appDisplayModule' + _('Search') ) ); optionList.push( itemFactory.getRowWidget( - _('App Labels Behavior'), - _('Choose how and when to display app names'), + _('App Grid Search Mode'), + _('Select how the search should behave when initiated from the app grid view. The "Filtered App Grid View" option shows all resulting app icons sorted by usage in the app grid view instead of switching to the default search view'), itemFactory.newDropDown(), - 'appGridNamesMode', + 'searchAppGridMode', [ - [_('Ellipsized - Expand Selected (Default)'), 0], - [_('Always Expanded'), 1], - [_('Hidden - Show Selected Only'), 2], + [_('Search View (Default)'), 0], + [_('Filtered App Grid View'), 1], ], - 'appDisplayModule' - ) - ); - - optionList.push(itemFactory.getRowWidget( - _('Reset App Grid Layout'), - _('Removes all stored app grid positions, after reset icons will be sorted alphabetically, except folder contents'), - itemFactory.newResetButton(() => { - const settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); - settings.set_value('app-picker-layout', new GLib.Variant('aa{sv}', [])); - }) - )); - - optionList.push(itemFactory.getRowWidget( - _('Remove App Grid Folders'), - _('Removes all folders, folder apps will move to the root grid'), - itemFactory.newResetButton(() => { - const settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' }); - settings.set_strv('folder-children', []); - }) - )); - - - optionList.push( - itemFactory.getRowWidget( - _('Search') + 'searchModule' ) ); @@ -1625,7 +1348,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( - _('Animations - General') + _('Animations') ) ); @@ -1641,7 +1364,7 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( _('Animation Speed'), - _('Adjusts the global animation speed in % of the default duration - higher value means slower animation'), + _('Adjusts the global animation speed in percentage of the default duration - higher value means slower animation'), animationSpeedScale, 'animationSpeedFactor' ) @@ -1649,12 +1372,6 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( - _('Animations - Overview') - ) - ); - - optionList.push( - itemFactory.getRowWidget( _('App Grid Animation'), _('When entering the App Grid view, the app grid animates from the edge of the screen. You can choose the direction, keep the Default (direction will be selected automatically) or disable the animation if you don\'t like it'), itemFactory.newDropDown(), @@ -1807,13 +1524,413 @@ export default class VShell extends ExtensionPreferences { return optionList; } + // ----------------------------------------------------------------------------------------------------------------- + + _getAppGridOptionList(itemFactory) { + const optionList = []; + // options item format: + // (text, caption, widget, settings-variable, [options for combo], sensitivity-depends-on-bool-variable) + + optionList.push( + itemFactory.getRowWidget( + _('Main App Grid') + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Apps Sorting'), + _('Choose sorting method for the app grid. Note that sorting by usage ignores folders'), + itemFactory.newDropDown(), + 'appGridOrder', + [ + [_('Custom (Default)'), 0], + [_('Alphabet'), 4], + [_('Alphabet - Folders First'), 1], + [_('Alphabet - Folders Last'), 2], + [_('Usage - No Folders'), 3], + ], + 'appDisplayModule' + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Icon Size'), + _('Allows to set a fixed app grid icon size and bypass the default adaptive algorithm'), + itemFactory.newDropDown(), + 'appGridIconSize', + [ + [_('Adaptive (Default)'), -1], + [_('256'), 256], + [_('224'), 224], + [_('208'), 208], + [_('192'), 192], + [_('176'), 176], + [_('160'), 160], + [_('144'), 144], + [_('128'), 128], + [_('112'), 112], + [_('96'), 96], + [_('80'), 80], + [_('64'), 64], + [_('48'), 48], + // [_('32'), 32], + ], + 'appDisplayModule' + ) + ); + + const columnsAdjustment = new Gtk.Adjustment({ + upper: 15, + lower: 0, + step_increment: 1, + page_increment: 1, + }); + + const columnsSpinBtn = itemFactory.newSpinButton(columnsAdjustment); + optionList.push(itemFactory.getRowWidget( + _('Columns per Page (0 for adaptive grid)'), + _('Number of columns in the application grid. If set to 0, the number will be set automatically to fit the available width'), + columnsSpinBtn, + 'appGridColumns', + null, + 'appDisplayModule' + )); + + const rowsAdjustment = new Gtk.Adjustment({ + upper: 15, + lower: 0, + step_increment: 1, + page_increment: 1, + }); + + const rowsSpinBtn = itemFactory.newSpinButton(rowsAdjustment); + optionList.push(itemFactory.getRowWidget( + _('Rows per Page (0 for adaptive grid)'), + _('Number of rows in the application grid. If set to 0, the number will be set automatically to fit the available height'), + rowsSpinBtn, + 'appGridRows', + null, + 'appDisplayModule' + )); + + const folderColumnsAdjustment = new Gtk.Adjustment({ + upper: 15, + lower: 0, + step_increment: 1, + page_increment: 1, + }); + + const agPageAdjustment = new Gtk.Adjustment({ + upper: 100, + lower: 50, + step_increment: 1, + page_increment: 10, + }); + + const agPageWidthScale = itemFactory.newScale(agPageAdjustment); + agPageWidthScale.add_mark(60, Gtk.PositionType.TOP, null); + agPageWidthScale.add_mark(70, Gtk.PositionType.TOP, null); + agPageWidthScale.add_mark(80, Gtk.PositionType.TOP, null); + agPageWidthScale.add_mark(90, Gtk.PositionType.TOP, null); + optionList.push( + itemFactory.getRowWidget( + _('App Grid Page Width Scale'), + _('Adjusts maximum app grid page width relative to the available space'), + agPageWidthScale, + 'appGridPageWidthScale', + null, + 'appDisplayModule' + ) + ); + + const aghPageAdjustment = new Gtk.Adjustment({ + upper: 100, + lower: 50, + step_increment: 1, + page_increment: 10, + }); + + const agPageHeightScale = itemFactory.newScale(aghPageAdjustment); + agPageHeightScale.add_mark(60, Gtk.PositionType.TOP, null); + agPageHeightScale.add_mark(70, Gtk.PositionType.TOP, null); + agPageHeightScale.add_mark(80, Gtk.PositionType.TOP, null); + agPageHeightScale.add_mark(90, Gtk.PositionType.TOP, null); + optionList.push( + itemFactory.getRowWidget( + _('App Grid Page Height Scale'), + _('Adjusts maximum app grid page height relative to the available space'), + agPageHeightScale, + 'appGridPageHeightScale', + null, + 'appDisplayModule' + ) + ); + + const appGridSpacingAdjustment = new Gtk.Adjustment({ + upper: 30, + lower: 5, + step_increment: 1, + page_increment: 5, + }); + + const appGridSpacingScale = itemFactory.newScale(appGridSpacingAdjustment); + appGridSpacingScale.add_mark(12, Gtk.PositionType.TOP, null); + optionList.push( + itemFactory.getRowWidget( + _('Grid Spacing'), + _('V-Shell uses this value to calculate grid dimensions for adaptive options. However, the main grid automatically adjusts the spacing based on the grid and available space'), + appGridSpacingScale, + 'appGridSpacing', + null, + 'appDisplayModule' + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Allow Incomplete Pages'), + _('If disabled, icons from the next page (if any) are automatically moved to fill any empty slot left after an icon was (re)moved (to a folder for example)'), + itemFactory.newSwitch(), + 'appGridIncompletePages', + null, + 'appDisplayModule' + ) + ); + + // -------------------------------------------------------------------------------------- + + optionList.push( + itemFactory.getRowWidget( + _('App Folders') + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Folder Apps Sorting'), + _('Choose sorting method for app folders'), + itemFactory.newDropDown(), + 'appFolderOrder', + [ + [_('Custom (Default)'), 0], + [_('Alphabet'), 1], + [_('Usage'), 2], + ], + 'appDisplayModule' + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Active Icons in Folder Preview'), + _('If enabled, icons in the folder preview behaves like normal icons, you can activate or even drag them directly, without having to open the folder first. This option also affects the app grid default icon size'), + itemFactory.newSwitch(), + 'appGridActivePreview', + null, + 'appDisplayModule' + ) + ); + + const folderIconGridCombo = itemFactory.newDropDown(); + optionList.push( + itemFactory.getRowWidget( + _('App Folder Preview Grid Size'), + _('Sets a grid size (number of icons) in the folder icon preview. 3x3 options automatically switches between 2x2 and 3x3 grid depending on the number of icons in the folder'), + folderIconGridCombo, + 'appGridFolderIconGrid', + [ + [_('2x2 (Default)'), 2], + [_('3x3 for 5+ apps'), 3], + [_('3x3 for 9+ apps'), 4], + ], + 'appDisplayModule' + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Folder Icon Size'), + _('Allows to set a fixed icon size and bypass the default adaptive algorithm in the open folder dialog'), + itemFactory.newDropDown(), + 'appGridFolderIconSize', + [ + [_('Adaptive (Default)'), -1], + [_('128'), 128], + [_('112'), 112], + [_('96'), 96], + [_('80'), 80], + [_('64'), 64], + [_('48'), 48], + ], + 'appDisplayModule' + ) + ); + + const folderColumnsSpinBtn = itemFactory.newSpinButton(folderColumnsAdjustment); + optionList.push(itemFactory.getRowWidget( + _('Maximum Number Of Columns (0 for automatic)'), + _('Specifies the maximum number of columns per page in folder grids. If you leave the value at 0, the maximum number of columns will be calculated based on available space. The actual folder grid dimensions will be determined by the number of items within the set limits'), + folderColumnsSpinBtn, + 'appGridFolderColumns', + null, + 'appDisplayModule' + )); + + const folderRowsAdjustment = new Gtk.Adjustment({ + upper: 15, + lower: 0, + step_increment: 1, + page_increment: 1, + }); + + const folderRowsSpinBtn = itemFactory.newSpinButton(folderRowsAdjustment); + optionList.push(itemFactory.getRowWidget( + _('Maximum Number Of Rows (0 for automatic)'), + _('Specifies the maximum number of rows per page in folder grids. If you leave the value at 0, the maximum number of rows will be calculated based on available space. The actual folder grid dimensions will be determined by the number of items within the set limits'), + folderRowsSpinBtn, + 'appGridFolderRows', + null, + 'appDisplayModule' + )); + + const appFolderSpacingAdjustment = new Gtk.Adjustment({ + upper: 30, + lower: 5, + step_increment: 1, + page_increment: 5, + }); + + const appFolderSpacingScale = itemFactory.newScale(appFolderSpacingAdjustment); + appFolderSpacingScale.add_mark(12, Gtk.PositionType.TOP, null); + optionList.push( + itemFactory.getRowWidget( + _('Folder Grid Spacing'), + _('Adjusts the spacing between icons in a folder grid'), + appFolderSpacingScale, + 'appGridFolderSpacing', + null, + 'appDisplayModule' + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Center Open Folders'), + _("App folders may open in the center of the screen or be centered on the folder's source icon"), + itemFactory.newSwitch(), + 'appGridFolderCenter', + null, + 'appDisplayModule' + ) + ); + + // -------------------------------------------------------------------------------------- + + optionList.push( + itemFactory.getRowWidget( + _('Content') + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('App Grid Content'), + _('The default Shell removes favorite apps, this option allows to duplicate them in the grid or remove also running applications. Option "Favorites and Running First" only works with the Alphabet and Usage sorting'), + itemFactory.newDropDown(), + 'appGridContent', + [ + [_('Include All'), 0], + [_('Include All - Favorites and Running First'), 1], + [_('Exclude Favorites (Default)'), 2], + [_('Exclude Running'), 3], + [_('Exclude Favorites and Running'), 4], + ], + 'appDisplayModule' + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('App Labels Behavior'), + _('Choose how and when to display app names'), + itemFactory.newDropDown(), + 'appGridNamesMode', + [ + [_('Ellipsized - Expand Selected (Default)'), 0], + [_('Always Expanded'), 1], + [_('Hidden - Show Selected Only'), 2], + ], + 'appDisplayModule' + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Show Page Navigation Buttons'), + _("You can hide the page navigation buttons if you don't need them or want to get more space for icons. The buttons are hidden automatically when there is only one page in the app grid"), + itemFactory.newSwitch(), + 'appGridShowPageArrows', + null, + 'appDisplayModule' + ) + ); + + + // -------------------------------------------------------------------------------------- + + optionList.push( + itemFactory.getRowWidget( + _('Performance') + ) + ); + + optionList.push( + itemFactory.getRowWidget( + _('Smooth App Grid Animations'), + _('This option allows V-Shell to pre-realize app grid and app folders during session startup in order to avoid stuttering animations when using them for the first time. If enabled, the session startup needs a little bit more time to finish and necessary memory will be allocated at this time'), + itemFactory.newSwitch(), + 'appGridPerformance' + ) + ); + + // -------------------------------------------------------------------------------------- + + optionList.push( + itemFactory.getRowWidget( + _('Reset') + ) + ); + + optionList.push(itemFactory.getRowWidget( + _('Reset App Grid Layout'), + _('Removes all stored app grid positions, after reset icons will be sorted alphabetically, except folder contents'), + itemFactory.newResetButton(() => { + const settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); + settings.set_value('app-picker-layout', new GLib.Variant('aa{sv}', [])); + }) + )); + + optionList.push(itemFactory.getRowWidget( + _('Remove App Grid Folders'), + _('Removes all folders, folder apps will move to the root grid'), + itemFactory.newResetButton(() => { + const settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' }); + settings.set_strv('folder-children', []); + }) + )); + + return optionList; + } + _getModulesOptionList(itemFactory) { const optionList = []; // options item format: // (text, caption, widget, settings-variable, [options for combo], sensitivity-depends-on-bool-variable) optionList.push( itemFactory.getRowWidget( - _('V-Shell Modules (allows you to disable modules that conflict with another extension)') + _('Optional Modules') ) ); @@ -1843,6 +1960,12 @@ export default class VShell extends ExtensionPreferences { optionList.push( itemFactory.getRowWidget( + _('Built-in Modules (allows to disable modules that conflict with another extension)') + ) + ); + + optionList.push( + itemFactory.getRowWidget( _('AppDisplay / IconGrid'), _('App grid customization and options'), itemFactory.newSwitch(), @@ -2017,39 +2140,18 @@ export default class VShell extends ExtensionPreferences { ) ); - /* optionList.push( - itemFactory.getRowWidget( - _('Compatibility') - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('Improve compatibility with Dash to Dock'), - _('With the default Ubuntu Dock and other Dash To Dock forks, you may experience issues with Activities overview after you change Dock position or re-enable the extension. This option is enabled automatically if a replacement for the Dash is detected. In any case, using Dash to Dock extension with V-Shell is problematic and not recommended.'), - itemFactory.newSwitch(), - 'fixUbuntuDock' - ) - );*/ - optionList.push( itemFactory.getRowWidget( - _('Performance') + _('Workarounds / Hacks') ) ); optionList.push( itemFactory.getRowWidget( - _('Smooth App Grid Animations'), - _('This option allows V-Shell to pre-realize app grid and app folders during session startup in order to avoid stuttering animations when using them for the first time. If enabled, the session startup needs a little bit more time to finish and necessary memory will be allocated at this time'), + _('Delay at Startup'), + _("If you encounter issues during GNOME Shell startup after logging in, which could be caused by V-Shell's incompatibility with another extension, try enabling this option. When enabled, V-Shell is activated after the startup is complete. It will activate automatically when Dash to Dock, Ubuntu Dock or Dash to Panel extensions are detected."), itemFactory.newSwitch(), - 'appGridPerformance' - ) - ); - - optionList.push( - itemFactory.getRowWidget( - _('Workarounds') + 'delayStartup' ) ); @@ -2074,6 +2176,8 @@ export default class VShell extends ExtensionPreferences { return optionList; } + // -------------------------------------------------------------------------------------------------- + _getAboutOptionList(itemFactory) { const optionList = []; diff --git a/extensions/46/vertical-workspaces/schemas/meson.build b/extensions/46/vertical-workspaces/schemas/meson.build new file mode 100644 index 0000000..ae9efc2 --- /dev/null +++ b/extensions/46/vertical-workspaces/schemas/meson.build @@ -0,0 +1,6 @@ +schema = rdnn + '.gschema.xml' +schema_dir = datadir / 'glib-2.0' / 'schemas' + +install_data(schema, install_dir : schema_dir) + +gnome.post_install(glib_compile_schemas : true) diff --git a/extensions/46/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml b/extensions/46/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml index ff1e205..c2c52fa 100644 --- a/extensions/46/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml +++ b/extensions/46/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml @@ -14,10 +14,10 @@ <default>350</default> </key> <key type="i" name="ws-preview-scale"> - <default>100</default> + <default>95</default> </key> <key type="i" name="secondary-ws-preview-scale"> - <default>100</default> + <default>95</default> </key> <key type="b" name="secondary-ws-preview-shift"> <default>false</default> @@ -77,7 +77,7 @@ <default>13</default> </key> <key type="i" name="dash-max-icon-size"> - <default>48</default> + <default>0</default> </key> <key type="i" name="dash-bg-opacity"> <default>20</default> @@ -89,7 +89,7 @@ <default>18</default> </key> <key type="b" name="dash-bg-gs3-style"> - <default>true</default> + <default>false</default> </key> <key type="i" name="running-dot-style"> <default>1</default> @@ -155,10 +155,10 @@ <default>0</default> </key> <key type="i" name="search-icon-size"> - <default>96</default> + <default>0</default> </key> <key type="i" name="search-width-scale"> - <default>104</default> + <default>100</default> </key> <key type="i" name="app-grid-icon-size"> <default>-1</default> @@ -190,8 +190,11 @@ <key type="i" name="app-grid-spacing"> <default>12</default> </key> + <key type="i" name="app-grid-folder-spacing"> + <default>12</default> + </key> <key type="b" name="app-grid-incomplete-pages"> - <default>true</default> + <default>false</default> </key> <key type="i" name="app-grid-names"> <default>1</default> @@ -208,6 +211,12 @@ <key type="i" name="app-grid-page-width-scale"> <default>90</default> </key> + <key type="i" name="app-grid-page-height-scale"> + <default>90</default> + </key> + <key type="b" name="app-grid-show-page-arrows"> + <default>true</default> + </key> <key type="i" name="dash-show-windows-before-activation"> <default>1</default> </key> @@ -232,6 +241,9 @@ <key type="i" name="search-max-results-rows"> <default>5</default> </key> + <key type="i" name="search-app-grid-mode"> + <default>0</default> + </key> <key type="i" name="panel-visibility"> <default>0</default> </key> @@ -301,6 +313,9 @@ <key type="i" name="overview-esc-behavior"> <default>0</default> </key> + <key type="b" name="click-empty-close"> + <default>false</default> + </key> <key type="b" name="new-window-focus-fix"> <default>false</default> </key> @@ -308,11 +323,14 @@ <default>false</default> </key> <key type="b" name="app-grid-performance"> - <default>true</default> + <default>false</default> </key> <key name='highlighting-style' type='i'> <default>1</default> </key> + <key type="b" name="delay-startup"> + <default>false</default> + </key> <key type="b" name="workspace-switcher-popup-module"> <default>true</default> @@ -381,7 +399,7 @@ 'workspaceThumbnailsPosition': '1', 'wsMaxSpacing': '350', 'wsPreviewScale': '95', - 'secWsPreviewScale': '100', + 'secWsPreviewScale': '95', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', @@ -392,7 +410,7 @@ 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', 'secWsTmbPositionAdjust': '-80', - 'dashMaxIconSize': '64', + 'dashMaxIconSize': '0', 'centerDashToWs': 'false', 'showAppsIconPosition': '1', 'wsThumbnailScale': '13', @@ -406,7 +424,6 @@ 'dashBgRadius': '0', 'dashBgGS3Style': 'true', 'runningDotStyle': '1', - 'enablePageShortcuts': 'false', 'showWsSwitcherBg': 'true', 'showWsPreviewBg': 'false', 'wsPreviewBgRadius': '30', @@ -426,8 +443,8 @@ 'overviewMode': '0', 'wsSwitcherMode': '0', 'workspaceSwitcherAnimation': '1', - 'searchIconSize': '96', - 'searchViewScale': '104', + 'searchIconSize': '0', + 'searchViewScale': '100', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', @@ -442,11 +459,15 @@ 'appGridNamesMode': '1', 'appGridActivePreview': 'false', 'appGridFolderCenter': 'false', - 'appGridPageWidthScale': '100', + 'appGridPageWidthScale': '90', + 'appGridPageHeightScale': '90', 'appGridSpacing': '12', + 'appGridFolderSpacing': '12', + 'appGridShowPageArrows': 'false', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', + 'searchAppGridMode': '0', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', @@ -476,7 +497,6 @@ 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'newWindowMonitorFix': '0', - 'appGridPerformance': 'true', 'highlightingStyle': '1', 'workspaceSwitcherPopupModule': 'true', @@ -506,8 +526,8 @@ <default>{ 'workspaceThumbnailsPosition': '5', 'wsMaxSpacing': '80', - 'wsPreviewScale': '100', - 'secWsPreviewScale': '100', + 'wsPreviewScale': '95', + 'secWsPreviewScale': '95', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', @@ -518,7 +538,7 @@ 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', 'secWsTmbPositionAdjust': '0', - 'dashMaxIconSize': '64', + 'dashMaxIconSize': '0', 'centerDashToWs': 'false', 'showAppsIconPosition': '1', 'wsThumbnailScale': '5', @@ -532,7 +552,6 @@ 'dashBgRadius': '0', 'dashBgGS3Style': 'false', 'runningDotStyle': '1', - 'enablePageShortcuts': 'true', 'showWsSwitcherBg': 'false', 'showWsPreviewBg': 'true', 'wsPreviewBgRadius': '30', @@ -552,8 +571,8 @@ 'overviewMode': '0', 'wsSwitcherMode': '0', 'workspaceSwitcherAnimation': '0', - 'searchIconSize': '96', - 'searchViewScale': '104', + 'searchIconSize': '0', + 'searchViewScale': '100', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', @@ -568,11 +587,15 @@ 'appGridNamesMode': '1', 'appGridActivePreview': 'false', 'appGridFolderCenter': 'true', - 'appGridPageWidthScale': '90', + 'appGridPageWidthScale': '80', + 'appGridPageHeightScale': '90', 'appGridSpacing': '12', + 'appGridFolderSpacing': '12', + 'appGridShowPageArrows': 'true', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', + 'searchAppGridMode': '0', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', @@ -602,7 +625,6 @@ 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'newWindowMonitorFix': '0', - 'appGridPerformance': 'true', 'highlightingStyle': '1', 'workspaceSwitcherPopupModule': 'true', @@ -633,7 +655,7 @@ 'workspaceThumbnailsPosition': '0', 'wsMaxSpacing': '350', 'wsPreviewScale': '95', - 'secWsPreviewScale': '100', + 'secWsPreviewScale': '95', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', @@ -643,8 +665,8 @@ 'showWsTmbLabels': '3', 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', - 'secWsTmbPositionAdjust': '0', - 'dashMaxIconSize': '48', + 'secWsTmbPositionAdjust': '-100', + 'dashMaxIconSize': '0', 'centerDashToWs': 'false', 'showAppsIconPosition': '0', 'wsThumbnailScale': '13', @@ -658,7 +680,6 @@ 'dashBgRadius': '0', 'dashBgGS3Style': 'false', 'runningDotStyle': '1', - 'enablePageShortcuts': 'true', 'showWsSwitcherBg': 'false', 'showWsPreviewBg': 'true', 'wsPreviewBgRadius': '30', @@ -678,8 +699,8 @@ 'overviewMode': '1', 'wsSwitcherMode': '0', 'workspaceSwitcherAnimation': '1', - 'searchIconSize': '96', - 'searchViewScale': '104', + 'searchIconSize': '0', + 'searchViewScale': '100', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', @@ -687,7 +708,7 @@ 'appGridFolderColumns': '0', 'appGridFolderRows': '0', 'appGridFolderIconGrid': '3', - 'appGridContent': '0', + 'appGridContent': '2', 'appGridIncompletePages': 'false', 'appGridOrder': '0', 'appFolderOrder': '0', @@ -695,10 +716,14 @@ 'appGridActivePreview': 'true', 'appGridFolderCenter': 'false', 'appGridPageWidthScale': '90', + 'appGridPageHeightScale': '90', 'appGridSpacing': '12', + 'appGridFolderSpacing': '12', + 'appGridShowPageArrows': 'false', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', + 'searchAppGridMode': '0', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', @@ -728,7 +753,6 @@ 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'newWindowMonitorFix': '0', - 'appGridPerformance': 'true', 'highlightingStyle': '1', 'workspaceSwitcherPopupModule': 'true', @@ -759,7 +783,7 @@ 'workspaceThumbnailsPosition': '6', 'wsMaxSpacing': '65', 'wsPreviewScale': '95', - 'secWsPreviewScale': '100', + 'secWsPreviewScale': '95', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', @@ -770,7 +794,7 @@ 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', 'secWsTmbPositionAdjust': '0', - 'dashMaxIconSize': '48', + 'dashMaxIconSize': '0', 'centerDashToWs': 'false', 'showAppsIconPosition': '1', 'wsThumbnailScale': '10', @@ -784,7 +808,6 @@ 'dashBgRadius': '0', 'dashBgGS3Style': 'false', 'runningDotStyle': '1', - 'enablePageShortcuts': 'true', 'showWsSwitcherBg': 'true', 'showWsPreviewBg': 'true', 'wsPreviewBgRadius': '30', @@ -804,8 +827,8 @@ 'overviewMode': '2', 'wsSwitcherMode': '0', 'workspaceSwitcherAnimation': '1', - 'searchIconSize': '96', - 'searchViewScale': '104', + 'searchIconSize': '0', + 'searchViewScale': '100', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', @@ -813,18 +836,22 @@ 'appGridFolderColumns': '0', 'appGridFolderRows': '0', 'appGridFolderIconGrid': '3', - 'appGridContent': '0', + 'appGridContent': '2', 'appGridIncompletePages': 'false', 'appGridOrder': '0', 'appFolderOrder': '0', 'appGridNamesMode': '1', 'appGridActivePreview': 'true', 'appGridFolderCenter': 'false', - 'appGridPageWidthScale': '90', - 'appGridSpacing': '5', + 'appGridPageWidthScale': '80', + 'appGridPageHeightScale': '90', + 'appGridSpacing': '12', + 'appGridFolderSpacing': '12', + 'appGridShowPageArrows': 'true', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', + 'searchAppGridMode': '0', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', @@ -854,7 +881,6 @@ 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'newWindowMonitorFix': '0', - 'appGridPerformance': 'true', 'highlightingStyle': '1', 'workspaceSwitcherPopupModule': 'true', diff --git a/extensions/46/vertical-workspaces/stylesheet.css b/extensions/46/vertical-workspaces/stylesheet.css index ef3b0ce..9aa1a99 100644 --- a/extensions/46/vertical-workspaces/stylesheet.css +++ b/extensions/46/vertical-workspaces/stylesheet.css @@ -15,8 +15,8 @@ to cover the spacing between dash and the edge of the screen so the icons will be selectable even at the edge this spacing must be accounted for in overview allocate() */ - padding-right: 16px; - padding-left: 16px; + padding-right: 24px; + padding-left: 24px; /*spacing between icons*/ padding-top: 1px; padding-bottom: 1px; @@ -35,12 +35,11 @@ padding: 5px 0; } -#dash.vertical .app-well-app-running-dot, -#dash.vertical .app-grid-running-dot { +#dash.vertical .app-well-app-running-dot { margin: 4px 0px; } -#dash.vertical .app-well-app-running-dot-custom { +#dash.vertical .app-grid-running-dot-custom { margin: 4px 0px; width: 2px; height: 16px; @@ -65,14 +64,14 @@ } #dash.vertical-gs3-left { - margin-right: 6px; + margin-right: 12px; margin-left: 0px; padding: 0px; } #dash.vertical-gs3-right { margin-right: 0px; - margin-left: 6px; + margin-left: 12px; padding: 0px; } @@ -94,11 +93,14 @@ border-color: rgba(150, 150, 150, 0.4); } -.app-well-app-running-dot-custom { +.app-grid-running-dot-custom { width: 16px; height: 2px; } +.dash-label { + border-radius: 14px; +} /* add shadow to the app grid app label to be readable if it overlaps light icon below */ .overview-icon-with-label, .folder-name-label { @@ -139,14 +141,32 @@ /* app grid page indicators */ .page-indicator-icon { - margin: 10px 10px 10px 10px; + margin: 0px; } .page-indicator { padding: 0px; } +.page-indicators { + spacing: 20px; + margin: 0; +} + +.page-indicators-horizontal { + margin-top: 0px; + margin-bottom: 10px; +} + +.page-indicators-vertical { + margin-left: 0px; + margin-right: 10px; +} + .search-entry{ + margin: 0; + margin-top: 12px; + margin-bottom: 6px; background-color: rgba(200, 200, 200, 0.1); color: white; border-color: rgba(160, 160, 160, 0.4); @@ -158,7 +178,7 @@ .search-entry:hover, .search-entry:focus { - background-color: rgba(200, 200, 200, 0.2); + background-color: rgba(200, 200, 200, 0.1); } .search-entry-om2 { @@ -177,26 +197,26 @@ border-radius: 26px; border: 1px, rgb(60, 60, 60); padding-top: 15px; -} - -.search-section-content-bg-om2 { background-color: rgb(40, 40, 40); } -.search-section-content { - background-color: rgba(200, 200, 200, 0.1); -} - /* Reduce edge fading of search results scroll view */ .vfade { -st-vfade-offset: 34px; } .hfade { -st-hfade-offset: 34px; } + +StButton#vhandle, .search-section-content { - background-color: rgba(200, 200, 200, 0.1); + background-color: rgba(200, 200, 200, 0.08); + border: solid 1px rgba(150, 150, 150, 0.3); +} + +.search-section { + spacing: 12px; } /* "no results" / "searching..." text*/ .search-statustext, .search-statustext-om2 { - background-color: rgba(200, 200, 200, 0.1); + background-color: rgba(200, 200, 200, 0.08); color: white; margin-top: 50px; padding: 30px; @@ -215,12 +235,9 @@ /* reduce spacing between app icons in search results */ .grid-search-results { - spacing: 4px; -} - -/* hide vertical scroll bar, it's distracting in the search results */ -StButton#vhandle { - background-color: transparent; + spacing: 8px; + margin-left: 12px; + margin-right: 12px; } .show-apps-icon-horizontal-hide { @@ -257,6 +274,20 @@ StButton#vhandle { height: 18px; } +.prev-page-indicator { + background-gradient-start: transparent; + background-gradient-end: rgba(255, 255, 255, 0.05); + background-gradient-direction: vertical; + border-radius: 0px 0px 30px 30px; +} +.next-page-indicator { + background-gradient-start: rgba(255, 255, 255, 0.05); + background-gradient-end: transparent; + background-gradient-direction: vertical; + border-radius: 30px 30px 0px 0px; + +} + /* reduce size of hot corner ripples to half */ .ripple-box { width: 26px; @@ -268,84 +299,80 @@ StButton#vhandle { margin-bottom: 8em; /* avoid overlap with dock extension */ } -.app-folder-46, -.app-folder-46 .overview-tile, -.app-folder-46 .overview-icon, -.app-folder-45 .overview-icon, -.edit-folder-button, -.folder-name-entry { - background-color: rgba(200, 200, 200, 0.08); -} - -.app-folder-dialog-vshell { - background-color: rgba(200, 200, 200, 0.08); +.app-folder-dialog-container { + padding: 18px; } .app-folder-dialog { border-color: rgba(160, 160, 160, 0.3); } -.edit-folder-button:hover, -.app-folder-46:hover, -.app-folder-45:hover .overview-icon, -.app-folder-45:focus .overview-icon { - background-color: rgba(200, 200, 200, 0.15); -} - -/* add missing spacing between buttons */ -.edit-folder-button-46 { - margin-right: 6px; +.folder-name-container { + spacing: 12px; } /* 46 changes the default bg color from transparent to the solid color blending with widget background */ - .search-provider-icon, - .list-search-result, - .overview-tile { +#dash.dash-46 .show-apps, +#dash.dash-46 .overview-tile, +#dash.dash-46 .overview-icon, +.app-folder-45 .overview-icon, /* 45 only */ +.app-folder-46 .overview-icon, +.page-navigation-arrow, +.search-provider-icon, +.list-search-result, +.grid-search-result, +.overview-tile { background-color: transparent; } /* Needed only for 46+, but doesn't hurt 45 */ - .search-provider-icon:hover, - .search-provider-icon:focus, - .search-provider-icon:selected, - .list-search-result:hover, - .list-search-result:focus, - .list-search-result:selected, - .overview-tile:hover, - .overview-tile:focus, - .overview-tile:selected, - .overview-icon:hover, - .overview-icon:focus, - .overview-icon:selected { - background-color: rgba(200, 200, 200, 0.15); +#dash.dash-46 .overview-tile:hover .overview-icon, +#dash.dash-46 .overview-tile:focus .overview-icon, +#dash.dash-46 .overview-tile:selected .overview-icon, +#dash.dash-46 .show-apps:hover .overview-icon, +#dash.dash-46 .show-apps:focus .overview-icon, +#dash.dash-46 .show-apps:selected .overview-icon, +.edit-folder-button:hover, +.page-navigation-arrow:hover, +.search-provider-icon:hover, +.search-provider-icon:focus, +.search-provider-icon:selected, +.list-search-result:hover, +.list-search-result:focus, +.list-search-result:selected, +.app-display-46 .overview-tile:hover, +.app-display-46 .overview-tile:focus, +.app-display-46 .overview-tile:selected, +.app-folder-46:hover, +.app-folder-45:hover .overview-icon, +.app-folder-45:focus .overview-icon, +#searchResults .overview-tile:hover, +#searchResults .overview-tile:focus, +#searchResults .overview-tile:selected, +.grid-search-result-46:hover, +.grid-search-result-46:focus, +.grid-search-result-46:selected, +.app-folder-dialog .overview-tile:hover, +.app-folder-dialog .overview-tile:focus, +.app-folder-dialog .overview-tile:selected, +.overview-icon:hover, +.overview-icon:focus, +.overview-icon:selected { + background-color: rgba(200, 200, 200, 0.15); } +.overview-tile:drop, /* 46 needs to add color so the highlighting style is visible on the app folder preview */ +.app-folder-dialog, +.edit-folder-button, +.folder-name-entry, .app-folder-46, .app-folder-46 .overview-tile, -.app-folder-45 .overview-icon, /* 45 only */ +.app-folder-45 .overview-icon, .edit-folder-button, .folder-name-entry { background-color: rgba(200, 200, 200, 0.08); } -.app-folder-46 .overview-icon, - #dash.dash-46 .overview-icon { - background-color: transparent; - } - - #dash.dash-46 .overview-tile, - #dash.dash-46 .show-apps { - background-color: transparent; - } - - #dash.dash-46 .overview-tile:hover .overview-icon, - #dash.dash-46 .overview-tile:focus .overview-icon, - #dash.dash-46 .overview-tile:selected .overview-icon, - #dash.dash-46 .show-apps:hover .overview-icon, - #dash.dash-46 .show-apps:focus .overview-icon, - #dash.dash-46 .show-apps:selected .overview-icon { - background-color: rgba(200, 200, 200, 0.15); - } #dash.vertical-46 { margin: 0px; @@ -354,10 +381,12 @@ StButton#vhandle { #dash.vertical-46-gs3-left { margin-left: 0px; + margin-right: 12px; } #dash.vertical-46-gs3-right { margin-right: 0px; + margin-left: 12px; } #dash.vertical-46 .overview-tile, @@ -365,7 +394,7 @@ StButton#vhandle { margin: 0px; background-color: transparent; /* this padding should keep the dash 6px from the screen edge */ - padding: 0, 18px; + padding: 0, 24px; } #dash.vertical-46 .dash-separator { @@ -376,10 +405,16 @@ StButton#vhandle { margin-bottom: 4px; } -#dash.vertical-46 .app-well-app-running-dot-custom { +#dash.vertical-46 .app-grid-running-dot { + margin: 0px; + offset-y: 0; +} + +#dash.vertical-46 .app-grid-running-dot-custom { margin: 0px; width: 2px; height: 16px; + offset-y: 0; } #dash.vertical-46 .dash-background { @@ -411,4 +446,4 @@ StButton#vhandle { /* reverse padding */ .ws-switcher-vertical { padding: 18px 12px -}
\ No newline at end of file +} |