From 5a714eebf8060302f3ffdfb241b41db9ab83a9e9 Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:59:16 +0200 Subject: [PATCH 01/18] Beautify DTP - Allow hover animation travel below 0% - Allow hover animation zoom below 100% - Hover highlighting independent of hover animation - Custom color for hover highlighting - Custom color for mouse down highlighting - Icon background with rounded corners - Customize margin for app icons towards screen border and desktop --- appIcons.js | 295 ++++++++++++------ panel.js | 120 +++---- prefs.js | 181 ++++++++--- ...shell.extensions.dash-to-panel.gschema.xml | 26 ++ stylesheet.css | 24 +- taskbar.js | 130 ++++---- ui/BoxAnimateAppIconHoverOptions.ui | 4 +- ui/BoxHighlightAppIconHoverOptions.ui | 70 +++++ ui/BoxShowDesktopOptions.ui | 2 +- ui/SettingsStyle.ui | 77 ++++- 10 files changed, 658 insertions(+), 271 deletions(-) create mode 100644 ui/BoxHighlightAppIconHoverOptions.ui diff --git a/appIcons.js b/appIcons.js index 3aabb50..3cacb3c 100644 --- a/appIcons.js +++ b/appIcons.js @@ -30,6 +30,7 @@ import GObject from 'gi://GObject'; import Mtk from 'gi://Mtk'; import Shell from 'gi://Shell'; import St from 'gi://St'; +import Gtk from 'gi://Gtk'; import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js'; import * as AppMenu from 'resource:///org/gnome/shell/ui/appMenu.js'; @@ -117,6 +118,9 @@ export const TaskbarAppIcon = GObject.registerClass({ this._previewMenu = previewMenu; this.iconAnimator = iconAnimator; this.lastClick = 0; + this._appicon_normalstyle = ''; + this._appicon_hoverstyle = ''; + this._appicon_pressedstyle = ''; super._init(appInfo.app, iconParams); @@ -127,7 +131,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if (event.type() == Clutter.EventType.TOUCH_BEGIN) { // Open the popup menu on long press. this._setPopupTimeout(); - } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { + } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { // Activate/launch the application. this.activate(1); this._removeMenuTimeout(); @@ -143,27 +147,27 @@ export const TaskbarAppIcon = GObject.registerClass({ this._removeMenuTimeout(); }; - + this._dot.set_width(0); this._isGroupApps = SETTINGS.get_boolean('group-apps'); - + this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); - this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._dotsContainer = new St.Widget({ style_class: 'dtp-dots-container', layout_manager: new Clutter.BinLayout() }); this._dtpIconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), style: getIconContainerStyle(panel.checkIfVertical()) }); this.remove_child(this._iconContainer); - + this._dtpIconContainer.add_child(this._iconContainer); if (appInfo.window) { let box = new St.BoxLayout(); - this._windowTitle = new St.Label({ - y_align: Clutter.ActorAlign.CENTER, - x_align: Clutter.ActorAlign.START, - style_class: 'overview-label' + this._windowTitle = new St.Label({ + y_align: Clutter.ActorAlign.CENTER, + x_align: Clutter.ActorAlign.START, + style_class: 'overview-label' }); - + this._updateWindowTitle(); this._updateWindowTitleStyle(); @@ -192,11 +196,12 @@ export const TaskbarAppIcon = GObject.registerClass({ } this._onAnimateAppiconHoverChanged(); + this._onAppIconHoverHighlightChanged(); this._setAppIconPadding(); this._setAppIconStyle(); this._showDots(); - this._focusWindowChangedId = global.display.connect('notify::focus-window', + this._focusWindowChangedId = global.display.connect('notify::focus-window', this._onFocusAppChanged.bind(this)); this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; @@ -207,17 +212,17 @@ export const TaskbarAppIcon = GObject.registerClass({ this._windowEnteredMonitorId = Utils.DisplayWrapper.getScreen().connect('window-entered-monitor', this.onWindowEnteredOrLeft.bind(this)); this._windowLeftMonitorId = Utils.DisplayWrapper.getScreen().connect('window-left-monitor', this.onWindowEnteredOrLeft.bind(this)); } - + this._titleWindowChangeId = 0; this._minimizedWindowChangeId = 0; } else { - this._titleWindowChangeId = this.window.connect('notify::title', + this._titleWindowChangeId = this.window.connect('notify::title', this._updateWindowTitle.bind(this)); this._minimizedWindowChangeId = this.window.connect('notify::minimized', this._updateWindowTitleStyle.bind(this)); } - + this._scrollEventId = this.connect('scroll-event', this._onMouseScroll.bind(this)); this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', @@ -227,9 +232,18 @@ export const TaskbarAppIcon = GObject.registerClass({ this._onSwitchWorkspace.bind(this)); this._hoverChangeId = this.connect('notify::hover', () => this._onAppIconHoverChanged()); - + if (!this._checkGtkVersion_cssVariables()) { + this._hoverChangeId2 = this.connect('notify::hover', () => this._onAppIconHoverChanged_GtkWorkaround()); + this._pressedChangedId = this.connect('notify::pressed', () => this._onAppIconPressedChanged_GtkWorkaround()); + } + this._dtpSettingsSignalIds = [ SETTINGS.connect('changed::animate-appicon-hover', this._onAnimateAppiconHoverChanged.bind(this)), + SETTINGS.connect('changed::animate-appicon-hover', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-hover', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-hover-background-color', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-pressed-background-color', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-hover-border-radius', this._onAppIconHoverHighlightChanged.bind(this)), SETTINGS.connect('changed::dot-position', this._settingsChangeRefresh.bind(this)), SETTINGS.connect('changed::dot-size', this._settingsChangeRefresh.bind(this)), SETTINGS.connect('changed::dot-style-focused', this._settingsChangeRefresh.bind(this)), @@ -255,8 +269,14 @@ export const TaskbarAppIcon = GObject.registerClass({ SETTINGS.connect('changed::group-apps-label-font-color-minimized', this._updateWindowTitleStyle.bind(this)), SETTINGS.connect('changed::group-apps-label-max-width', this._updateWindowTitleStyle.bind(this)), SETTINGS.connect('changed::group-apps-use-fixed-width', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-underline-unfocused', this._settingsChangeRefresh.bind(this)) - ] + SETTINGS.connect('changed::group-apps-underline-unfocused', this._settingsChangeRefresh.bind(this)), + ]; + + if (!this._checkGtkVersion_cssVariables()) { + this._dtpSettingsSignalIds += [ + SETTINGS.connect('changed::highlight-appicon-hover-border-radius', () => this._setIconStyle(this._isFocusedWindow())), + ]; + } this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); @@ -269,10 +289,11 @@ export const TaskbarAppIcon = GObject.registerClass({ // Used by TaskbarItemContainer to animate appIcons on hover getCloneButton() { - // The source of the clone is this._container, + // The source of the clone is this._dtpIconContainer, + // which contains the icon but no highlighting elements // using this.actor directly would break DnD style. let clone = new Clutter.Clone({ - source: this.child, + source: this._dtpIconContainer, x: this.child.x, y: this.child.y, width: this.child.width, height: this.child.height, pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }), @@ -293,19 +314,19 @@ export const TaskbarAppIcon = GObject.registerClass({ } shouldShowTooltip() { - if (!SETTINGS.get_boolean('show-tooltip') || + if (!SETTINGS.get_boolean('show-tooltip') || (!this.isLauncher && SETTINGS.get_boolean("show-window-previews") && this.getAppIconInterestingWindows().length > 0)) { return false; } else { - return this.hover && !this.window && - (!this._menu || !this._menu.isOpen) && + return this.hover && !this.window && + (!this._menu || !this._menu.isOpen) && (this._previewMenu.getCurrentAppIcon() !== this); } } _onAppIconHoverChanged() { - if (!SETTINGS.get_boolean('show-window-previews') || + if (!SETTINGS.get_boolean('show-window-previews') || (!this.window && !this._nWindows)) { return; } @@ -329,7 +350,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this.app.disconnect(this._stateChangedId); this._stateChangedId = 0; } - + if(this._overviewWindowDragEndId) Main.overview.disconnect(this._overviewWindowDragEndId); @@ -356,6 +377,12 @@ export const TaskbarAppIcon = GObject.registerClass({ if (this._hoverChangeId) { this.disconnect(this._hoverChangeId); } + if (this._hoverChangeId2) { + this.disconnect(this._hoverChangeId2); + } + if (this._pressedChangedId) { + this.disconnect(this._pressedChangedId); + } if (this._scrollEventId) { this.disconnect(this._scrollEventId); @@ -415,7 +442,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this.icon.createIcon = (iconSize) => this.app.create_icon_texture(2 * iconSize); this._iconIconBinActorAddedId = this.icon._iconBin.connect('child-added', () => { let size = this.icon.iconSize * Utils.getScaleFactor() - + if (this.icon._iconBin.child.mapped) { this.icon._iconBin.child.set_size(size, size); } else { @@ -438,9 +465,59 @@ export const TaskbarAppIcon = GObject.registerClass({ } } + _onAppIconHoverHighlightChanged() { + const background_color = SETTINGS.get_string('highlight-appicon-hover-background-color'); + const pressed_color = SETTINGS.get_string('highlight-appicon-pressed-background-color'); + const border_radius = SETTINGS.get_int('highlight-appicon-hover-border-radius'); + if (this._checkGtkVersion_cssVariables()) { + this._container.set_style(`--dtp-hover-background-color: ${background_color}; --dtp-hover-border-radius: ${border_radius}px; --dtp-pressed-background-color: ${pressed_color};`); + } else { + // Some trickery needed to get the same effect + const br = `border-radius: ${border_radius}px;`; + this._appicon_normalstyle = br; + this._container.set_style(this._appicon_normalstyle); + this._appicon_hoverstyle = `background-color: ${background_color}; ${br}`; + this._appicon_pressedstyle = `background-color: ${pressed_color}; ${br}`; + } + if (SETTINGS.get_boolean('highlight-appicon-hover')) { + this._container.remove_style_class_name('no-highlight'); + } else { + this._container.add_style_class_name('no-highlight'); + this._appicon_normalstyle = ''; + this._appicon_hoverstyle = ''; + this._appicon_pressedstyle = ''; + } + } + + _checkGtkVersion_cssVariables() { + // Support for CSS variables will be added in GTK 4.16 + return Gtk.get_major_version() >= 5 || + (Gtk.get_major_version() == 4 && Gtk.get_minor_version() >= 16); + } + + _onAppIconHoverChanged_GtkWorkaround() { + if (this.hover && this._appicon_hoverstyle) { + this._container.set_style(this._appicon_hoverstyle); + } else if(this._appicon_normalstyle) { + this._container.set_style(this._appicon_normalstyle); + } else { + this._container.set_style(''); + } + } + + _onAppIconPressedChanged_GtkWorkaround() { + if (this.pressed && this._appicon_pressedstyle) { + this._container.set_style(this._appicon_pressedstyle); + } else if(this._appicon_normalstyle) { + this._container.set_style(this._appicon_normalstyle); + } else { + this._container.set_style(''); + } + } + _onMouseScroll(actor, event) { let scrollAction = SETTINGS.get_string('scroll-icon-action'); - + if (scrollAction === 'PASS_THROUGH') { return this.dtpPanel._onPanelMouseScroll(actor, event); } else if (scrollAction === 'NOTHING' || (!this.window && !this._nWindows)) { @@ -458,7 +535,7 @@ export const TaskbarAppIcon = GObject.registerClass({ Utils.activateSiblingWindow(windows, direction, this.window); } } - + _showDots() { // Just update style if dots already exist if (this._focusedDots && this._unfocusedDots) { @@ -467,7 +544,7 @@ export const TaskbarAppIcon = GObject.registerClass({ } if (!this._isGroupApps) { - this._focusedDots = new St.Widget({ + this._focusedDots = new St.Widget({ layout_manager: new Clutter.BinLayout(), x_expand: true, y_expand: true, visible: false @@ -478,23 +555,23 @@ export const TaskbarAppIcon = GObject.registerClass({ this.disconnect(mappedId); }); } else { - this._focusedDots = new St.DrawingArea(), + this._focusedDots = new St.DrawingArea(), this._unfocusedDots = new St.DrawingArea(); - + this._focusedDots.connect('repaint', () => { if (!this._dashItemContainer.animatingOut) // don't draw and trigger more animations if the icon is in the middle of // being removed from the panel this._drawRunningIndicator(this._focusedDots, SETTINGS.get_string('dot-style-focused'), true); }); - + this._unfocusedDots.connect('repaint', () => { if (!this._dashItemContainer.animatingOut) this._drawRunningIndicator(this._unfocusedDots, SETTINGS.get_string('dot-style-unfocused'), false); }); - + this._dotsContainer.add_child(this._unfocusedDots); - + this._updateWindows(); this._timeoutsHandler.add([T3, 0, () => { @@ -512,7 +589,7 @@ export const TaskbarAppIcon = GObject.registerClass({ let sizeProp = isHorizontalDots ? 'width' : 'height'; let focusedDotStyle = SETTINGS.get_string('dot-style-focused'); let unfocusedDotStyle = SETTINGS.get_string('dot-style-unfocused'); - + this._focusedIsWide = this._isWideDotStyle(focusedDotStyle); this._unfocusedIsWide = this._isWideDotStyle(unfocusedDotStyle); @@ -558,7 +635,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._windowTitle.set_style('font-size: ' + SETTINGS.get_int('group-apps-label-font-size') * fontScale + 'px;' + 'font-weight: ' + fontWeight + ';' + - (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + + (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + 'color: ' + fontColor); } } @@ -566,7 +643,7 @@ export const TaskbarAppIcon = GObject.registerClass({ _updateWindowTitle() { if (this._windowTitle.text != this.window.title) { this._windowTitle.text = (this.window.title ? this.window.title : this.app.get_name()).replace(/\r?\n|\r/g, '').trim(); - + if (this._focusedDots) { this._displayProperIndicator(); } @@ -576,8 +653,8 @@ export const TaskbarAppIcon = GObject.registerClass({ _setIconStyle(isFocused) { let inlineStyle = 'margin: 0;'; - if(SETTINGS.get_boolean('focus-highlight') && - this._checkIfFocusedApp() && !this.isLauncher && + if(SETTINGS.get_boolean('focus-highlight') && + this._checkIfFocusedApp() && !this.isLauncher && (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { let focusedDotStyle = SETTINGS.get_string('dot-style-focused'); let pos = SETTINGS.get_string('dot-position'); @@ -585,7 +662,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if(!this.window) { let containerWidth = this._dtpIconContainer.get_width() / Utils.getScaleFactor(); - let backgroundSize = containerWidth + "px " + + let backgroundSize = containerWidth + "px " + (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; if (focusedDotStyle == DOT_STYLE.CILIORA || focusedDotStyle == DOT_STYLE.SEGMENTED) @@ -598,16 +675,19 @@ export const TaskbarAppIcon = GObject.registerClass({ bgSvg += (this.dtpPanel.checkIfVertical() ? '_2' : '_3'); } - inlineStyle += "background-image: url('" + EXTENSION_PATH + bgSvg + ".svg');" + + inlineStyle += "background-image: url('" + EXTENSION_PATH + bgSvg + ".svg');" + "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + "background-size: " + backgroundSize; } } let highlightColor = this._getFocusHighlightColor(); - inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, SETTINGS.get_int('focus-highlight-opacity') * 0.01); + inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, SETTINGS.get_int('focus-highlight-opacity') * 0.01) + ";"; + if (!this._checkGtkVersion_cssVariables()) { + inlineStyle += this._appicon_normalstyle; + } } - + if(this._dotsContainer.get_style() != inlineStyle) { this._dotsContainer.set_style(inlineStyle); } @@ -618,17 +698,30 @@ export const TaskbarAppIcon = GObject.registerClass({ } _checkIfMonitorHasFocus() { - return global.display.focus_window && + return global.display.focus_window && (!SETTINGS.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. - !SETTINGS.get_boolean('isolate-monitors') || + !SETTINGS.get_boolean('isolate-monitors') || global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); } _setAppIconPadding() { - let padding = getIconPadding(this.dtpPanel.monitor.index); - let margin = SETTINGS.get_int('appicon-margin'); + const padding = getIconPadding(this.dtpPanel.monitor.index); + const margin = SETTINGS.get_int('appicon-margin'); + const margin_todesktop = SETTINGS.get_int('appicon-margin-todesktop'); + const margin_toscreenborder = SETTINGS.get_int('appicon-margin-toscreenborder'); - this.set_style('padding:' + (this.dtpPanel.checkIfVertical() ? margin + 'px 0' : '0 ' + margin + 'px;')); + let margin_style = ''; + const panelPosition = this.dtpPanel.getPosition(); + if (panelPosition == St.Side.TOP) { + margin_style = `${margin_toscreenborder}px ${margin}px ${margin_todesktop}px ${margin}px`; + } else if (panelPosition == St.Side.RIGHT) { + margin_style = `${margin}px ${margin_toscreenborder}px ${margin}px ${margin_todesktop}px`; + } else if (panelPosition == St.Side.LEFT) { + margin_style = `${margin}px ${margin_todesktop}px ${margin}px ${margin_toscreenborder}px`; + } else { + margin_style = `${margin_todesktop}px ${margin}px ${margin_toscreenborder}px ${margin}px`; + } + this.set_style(`padding: ${margin_style};`); this._iconContainer.set_style('padding: ' + padding + 'px;'); } @@ -710,7 +803,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if(!this._isGroupApps) { if (this.window && (SETTINGS.get_boolean('group-apps-underline-unfocused') || isFocused)) { let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; - + this._focusedDots.set_size(0, 0); this._focusedDots[isHorizontalDots ? 'height' : 'width'] = this._getRunningIndicatorSize(); @@ -727,11 +820,11 @@ export const TaskbarAppIcon = GObject.registerClass({ let newFocusedDotsOpacity = 0; let newUnfocusedDotsSize = 0; let newUnfocusedDotsOpacity = 0; - + isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); this._timeoutsHandler.add([T6, 0, () => { - if(isFocused) + if(isFocused) this.add_style_class_name('focused'); else this.remove_style_class_name('focused'); @@ -744,7 +837,7 @@ export const TaskbarAppIcon = GObject.registerClass({ newFocusedDotsSize = this._containerSize; newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; } - + if(this._unfocusedIsWide) { newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? this._containerSize : 0; newUnfocusedDotsOpacity = 255; @@ -752,7 +845,7 @@ export const TaskbarAppIcon = GObject.registerClass({ newUnfocusedDotsSize = this._containerSize; newUnfocusedDotsOpacity = (!isFocused && this._nWindows > 0) ? 255 : 0; } - + // Only animate if... // animation is enabled in settings // AND (going from a wide style to a narrow style indicator or vice-versa @@ -770,10 +863,10 @@ export const TaskbarAppIcon = GObject.registerClass({ _animateDotDisplay(dots, newSize, otherDots, newOtherOpacity, sizeProp, duration) { Utils.stopAnimations(dots) - let tweenOpts = { + let tweenOpts = { time: duration, transition: 'easeInOutCubic', - onComplete: () => { + onComplete: () => { if(newOtherOpacity > 0) otherDots.opacity = newOtherOpacity; } @@ -789,7 +882,7 @@ export const TaskbarAppIcon = GObject.registerClass({ _isFocusedWindow() { let focusedWindow = global.display.focus_window; - + while (focusedWindow) { if (focusedWindow == this.window) { return true; @@ -802,9 +895,9 @@ export const TaskbarAppIcon = GObject.registerClass({ } _isWideDotStyle(dotStyle) { - return dotStyle == DOT_STYLE.SEGMENTED || - dotStyle == DOT_STYLE.CILIORA || - dotStyle == DOT_STYLE.METRO || + return dotStyle == DOT_STYLE.SEGMENTED || + dotStyle == DOT_STYLE.CILIORA || + dotStyle == DOT_STYLE.METRO || dotStyle == DOT_STYLE.SOLID; } @@ -812,7 +905,7 @@ export const TaskbarAppIcon = GObject.registerClass({ // This is an attempt to determine if the theme is providing their own // running indicator by way of a border image on the icon, for example in // the theme Ciliora - return (this.icon.get_stage() && + return (this.icon.get_stage() && this.icon.get_theme_node().get_border_image()); } @@ -875,23 +968,23 @@ export const TaskbarAppIcon = GObject.registerClass({ //ungrouped applications behaviors switch (buttonAction) { case 'RAISE': case 'CYCLE': case 'CYCLE-MIN': case 'MINIMIZE': case 'TOGGLE-SHOWPREVIEW': case 'TOGGLE-CYCLE': - if (!Main.overview._shown && - (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && + if (!Main.overview._shown && + (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { this.window.minimize(); } else { Main.activateWindow(this.window); } - + break; - + case "LAUNCH": this._launchNewInstance(); break; case "QUIT": this.window.delete(global.get_current_time()); - break; + break; } } else { //grouped application behaviors @@ -902,11 +995,11 @@ export const TaskbarAppIcon = GObject.registerClass({ case "RAISE": activateAllWindows(this.app, monitor); break; - + case "LAUNCH": this._launchNewInstance(); break; - + case "MINIMIZE": // In overview just activate the app, unless the acion is explicitely // requested with a keyboard modifier @@ -925,10 +1018,10 @@ export const TaskbarAppIcon = GObject.registerClass({ else this.app.activate(); break; - + case "CYCLE": if (!Main.overview._shown){ - if (appHasFocus) + if (appHasFocus) cycleThroughWindows(this.app, false, false, monitor); else { activateFirstWindow(this.app, monitor); @@ -939,7 +1032,7 @@ export const TaskbarAppIcon = GObject.registerClass({ break; case "CYCLE-MIN": if (!Main.overview._shown){ - if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) + if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) cycleThroughWindows(this.app, false, true, monitor); else { activateFirstWindow(this.app, monitor); @@ -964,10 +1057,10 @@ export const TaskbarAppIcon = GObject.registerClass({ minimizeWindow(this.app, true, monitor); } else if (previewedAppIcon != this) { this._previewMenu.open(this); - } - + } + this.emit('sync-tooltip'); - } + } } else this.app.activate(); @@ -981,7 +1074,7 @@ export const TaskbarAppIcon = GObject.registerClass({ activateFirstWindow(this.app, monitor); } else { cycleThroughWindows(this.app, false, false, monitor); - } + } } else this.app.activate(); @@ -1003,7 +1096,7 @@ export const TaskbarAppIcon = GObject.registerClass({ _launchNewInstance(ctrlPressed) { let maybeAnimate = () => SETTINGS.get_boolean('animate-window-launch') && this.animateLaunch() - if ((ctrlPressed || this.app.state == Shell.AppState.RUNNING) && + if ((ctrlPressed || this.app.state == Shell.AppState.RUNNING) && this.app.can_open_new_window()) { maybeAnimate(); this.app.open_new_window(-1); @@ -1021,12 +1114,12 @@ export const TaskbarAppIcon = GObject.registerClass({ _updateWindows() { let windows = [this.window]; - + if (!this.window) { windows = this.getAppIconInterestingWindows(); - + this._nWindows = windows.length; - + for (let i = 1; i <= MAX_INDICATORS; i++){ let className = 'running'+i; if(i != this._nWindows) @@ -1065,7 +1158,7 @@ export const TaskbarAppIcon = GObject.registerClass({ } } else if(SETTINGS.get_boolean('dot-color-override')) { let dotColorSettingPrefix = 'dot-color-'; - + if(!isFocused && SETTINGS.get_boolean('dot-color-unfocused-different')) dotColorSettingPrefix = 'dot-color-unfocused-'; @@ -1164,7 +1257,7 @@ export const TaskbarAppIcon = GObject.registerClass({ dist = i * dashLength + i * spacing; cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0, dashLength, size] : [0, dist, size, dashLength])); }; - + switch (type) { case DOT_STYLE.CILIORA: spacing = size; @@ -1226,7 +1319,7 @@ export const TaskbarAppIcon = GObject.registerClass({ } cr.fill(); } - + cr.$dispose(); } @@ -1287,7 +1380,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if (source == Main.xdndHandler) { this._previewMenu.close(true); } - + return DND.DragMotionResult.CONTINUE; } @@ -1354,7 +1447,7 @@ export function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { if (recentlyClickedAppLoopId > 0) GLib.Source.remove(recentlyClickedAppLoopId); - + recentlyClickedAppLoopId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, MEMORY_TIME, resetRecentlyClickedApp); @@ -1377,7 +1470,7 @@ export function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { recentlyClickedAppIndex++; } let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; - + if(recentlyClickedAppWindows[index] === "MINIMIZE") minimizeWindow(app, true, monitor); else @@ -1407,8 +1500,8 @@ export function closeAllWindows(app, monitor) { // nautilus desktop window. export function getInterestingWindows(app, monitor, isolateMonitors) { let windows = ( - app ? - app.get_windows() : + app ? + app.get_windows() : global.get_window_actors().map(wa => wa.get_meta_window()) ).filter(w => !w.skip_taskbar); @@ -1416,7 +1509,7 @@ export function getInterestingWindows(app, monitor, isolateMonitors) { // that are not in the current workspace or on the same monitor as the appicon if (SETTINGS.get_boolean('isolate-workspaces')) windows = windows.filter(function(w) { - return w.get_workspace() && + return w.get_workspace() && w.get_workspace() == Utils.getCurrentWorkspace(); }); @@ -1425,7 +1518,7 @@ export function getInterestingWindows(app, monitor, isolateMonitors) { return w.get_monitor() == monitor.index; }); } - + return windows; } @@ -1486,7 +1579,7 @@ export class TaskbarSecondaryMenu extends AppMenu.AppMenu { } updateQuitText() { - let count = this.sourceActor.window ? 1 : + let count = this.sourceActor.window ? 1 : getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor).length; if ( count > 0) { @@ -1502,17 +1595,17 @@ export class TaskbarSecondaryMenu extends AppMenu.AppMenu { _quitFromTaskbar() { let time = global.get_current_time() - let windows = + let windows = this.sourceActor.window ? // ungrouped applications - [this.sourceActor.window] : + [this.sourceActor.window] : getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor) - + if (windows.length == this._app.get_windows().length) this._app.request_quit() GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { windows.forEach((w) => !!w.get_compositor_private() && w.delete(time++)); - + return GLib.SOURCE_REMOVE; }); } @@ -1577,13 +1670,13 @@ export function ItemShowLabel() { this.label.set_position(Math.round(x), Math.round(y)); - let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; - + let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; + if (duration > 1) { duration /= 1000; } - - Utils.animate(this.label, { + + Utils.animate(this.label, { opacity: 255, time: duration, transition: 'easeOutQuad', @@ -1657,10 +1750,10 @@ export const ShowAppsIconWrapper = class extends EventEmitter { this._changedAppIconPaddingId = SETTINGS.connect('changed::appicon-padding', () => this.setShowAppsPadding()); this._changedAppIconSidePaddingId = SETTINGS.connect('changed::show-apps-icon-side-padding', () => this.setShowAppsPadding()); - + this.setShowAppsPadding(); } - + _onButtonPress(_actor, event) { let button = event.get_button(); if (button == 1) { @@ -1736,7 +1829,7 @@ export const ShowAppsIconWrapper = class extends EventEmitter { } shouldShowTooltip() { - return SETTINGS.get_boolean('show-tooltip') && + return SETTINGS.get_boolean('show-tooltip') && (this.actor.hover && (!this._menu || !this._menu.isOpen)); } @@ -1863,12 +1956,12 @@ export const MyShowAppsIconMenu = class extends PopupMenu.PopupMenu { return null; } - + _appendList(commandList, titleList) { if (commandList.length != titleList.length) { return; } - + for (let entry = 0; entry < commandList.length; entry++) { this._appendItem({ title: titleList[entry], diff --git a/panel.js b/panel.js index d025b9b..a0bfdac 100644 --- a/panel.js +++ b/panel.js @@ -17,13 +17,13 @@ * Credits: * This file is based on code from the Dash to Dock extension by micheleg * and code from the Taskbar extension by Zorin OS - * + * * Code to re-anchor the panel was taken from Thoma5 BottomPanel: * https://github.com/Thoma5/gnome-shell-extension-bottompanel - * + * * Pattern for moving clock based on Frippery Move Clock by R M Yorston * http://frippery.org/extensions/ - * + * * Some code was also adapted from the upstream Gnome Shell source code. */ @@ -85,7 +85,7 @@ export const Panel = GObject.registerClass({ // so in this case use isPrimary to get the panel on the primary dtp monitor, which // might be different from the system's primary monitor. this.isStandalone = isStandalone; - this.isPrimary = !isStandalone || (SETTINGS.get_boolean('stockgs-keep-top-panel') && + this.isPrimary = !isStandalone || (SETTINGS.get_boolean('stockgs-keep-top-panel') && monitor == panelManager.dtpPrimaryMonitor); this._sessionStyle = null; @@ -144,20 +144,20 @@ export const Panel = GObject.registerClass({ }); } - // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of + // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of // its behavior is handled by the taskbar, but its positioning is done at the panel level this.showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this); this.panel.add_child(this.showAppsIconWrapper.realShowAppsIcon); this.panel._delegate = this; - + this.add_child(this.panel); if (Main.panel._onButtonPress || Main.panel._tryDragWindow) { this._signalsHandler.add([ - this.panel, + this.panel, [ - 'button-press-event', + 'button-press-event', 'touch-event' ], this._onButtonPress.bind(this) @@ -167,7 +167,7 @@ export const Panel = GObject.registerClass({ if (Main.panel._onKeyPress) { this._signalsHandler.add([this.panel, 'key-press-event', Main.panel._onKeyPress.bind(this)]); } - + Main.ctrlAltTabManager.addGroup(this, _("Top Bar")+" "+ monitor.index, 'focus-top-bar-symbolic', { sortGroup: CtrlAltTab.SortGroup.TOP }); } @@ -180,7 +180,7 @@ export const Panel = GObject.registerClass({ } this.geom = this.getGeometry(); - + this._setPanelPosition(); if (!this.isStandalone) { @@ -209,13 +209,13 @@ export const Panel = GObject.registerClass({ }; this.dynamicTransparency = new Transparency.DynamicTransparency(this); - + this.taskbar = new Taskbar.Taskbar(this); this.panel.add_child(this.taskbar.actor); this._setShowDesktopButton(true); - + this._setAllocationMap(); this.panel.add_style_class_name('dashtopanelMainPanel ' + this.getOrientation()); @@ -225,14 +225,14 @@ export const Panel = GObject.registerClass({ this._signalsHandler.add( // this is to catch changes to the theme or window scale factor [ - Utils.getStageTheme(), - 'changed', + Utils.getStageTheme(), + 'changed', () => (this._resetGeometry(), this._setShowDesktopButtonStyle()), ], [ // sync hover after a popupmenu is closed this.taskbar, - 'menu-closed', + 'menu-closed', () => this.panel.sync_hover() ], [ @@ -255,10 +255,10 @@ export const Panel = GObject.registerClass({ ], [ this.statusArea.activities, - 'captured-event', + 'captured-event', (actor, e) => { if (e.type() == Clutter.EventType.BUTTON_PRESS || e.type() == Clutter.EventType.TOUCH_BEGIN) { - //temporarily use as primary the monitor on which the activities btn was clicked + //temporarily use as primary the monitor on which the activities btn was clicked this.panelManager.setFocusedMonitor(this.monitor); } } @@ -302,7 +302,7 @@ export const Panel = GObject.registerClass({ if (this.statusArea.dateMenu) { this._formatVerticalClock(); - + this._signalsHandler.add([ this.statusArea.dateMenu._clock, 'notify::clock', @@ -324,7 +324,7 @@ export const Panel = GObject.registerClass({ this._timeoutsHandler.destroy(); this._signalsHandler.destroy(); - + this.panel.remove_child(this.taskbar.actor); if (this.intellihide) { @@ -366,14 +366,14 @@ export const Panel = GObject.registerClass({ ['activities', systemMenuName, 'dateMenu'].forEach(b => { let container = this.statusArea[b].container; let originalParent = container._dtpOriginalParent; - + this.panel.remove_child(container); originalParent && originalParent.insert_child_at_index( - container, + container, Math.min(container._dtpOriginalIndex, originalParent.get_children().length - 1) ); - + delete container._dtpOriginalParent; delete container._dtpOriginalIndex; }); @@ -384,7 +384,7 @@ export const Panel = GObject.registerClass({ delete Utils.getIndicators(this.statusArea[systemMenuName]._volumeOutput)._dtpIgnoreScroll; this._injectionManager.clear(); - + this.panel._delegate = this.panel; } else { this._removePanelMenu('dateMenu'); @@ -405,16 +405,16 @@ export const Panel = GObject.registerClass({ } else if (position == Pos.BOTTOM) { return St.Side.BOTTOM; } - + return St.Side.LEFT; } checkIfVertical() { let position = this.getPosition(); - + return (position == St.Side.LEFT || position == St.Side.RIGHT); } - + getOrientation() { return (this.checkIfVertical() ? 'vertical' : 'horizontal'); } @@ -452,7 +452,7 @@ export const Panel = GObject.registerClass({ currentPosition = Pos.STACKED_BR; } - if (!previousPosition || + if (!previousPosition || (previousPosition == Pos.STACKED_TL && currentPosition != Pos.STACKED_TL) || (previousPosition != Pos.STACKED_BR && currentPosition == Pos.STACKED_BR) || (isCentered && previousPosition != currentPosition && previousPosition != Pos.STACKED_BR)) { @@ -486,6 +486,8 @@ export const Panel = GObject.registerClass({ SETTINGS, [ 'changed::panel-sizes', + 'changed::appicon-margin-todesktop', + 'changed::appicon-margin-toscreenborder', 'changed::group-apps' ], () => this._resetGeometry() @@ -514,7 +516,7 @@ export const Panel = GObject.registerClass({ 'changed::clock-format', () => { this._clockFormat = null; - + if (isVertical) { this._formatVerticalClock(); } @@ -544,7 +546,7 @@ export const Panel = GObject.registerClass({ container.insert_child_at_index(this.statusArea[propName].container, 0); } } - + _removePanelMenu(propName) { if (this.statusArea[propName]) { let parent = this.statusArea[propName].container.get_parent(); @@ -555,8 +557,8 @@ export const Panel = GObject.registerClass({ //calling this.statusArea[propName].destroy(); is buggy for now, gnome-shell never //destroys those panel menus... - //since we can't destroy the menu (hence properly disconnect its signals), let's - //store it so the next time a panel needs one of its kind, we can reuse it instead + //since we can't destroy the menu (hence properly disconnect its signals), let's + //store it so the next time a panel needs one of its kind, we can reuse it instead //of creating a new one let panelMenu = this.statusArea[propName]; @@ -619,7 +621,7 @@ export const Panel = GObject.registerClass({ let x = 0, y = 0; let w = 0, h = 0; - const panelSize = PanelSettings.getPanelSize(SETTINGS, this.monitor.index); + const panelSize = PanelSettings.getPanelSize(SETTINGS, this.monitor.index) + SETTINGS.get_int('appicon-margin-todesktop') + SETTINGS.get_int('appicon-margin-toscreenborder'); this.dtpSize = panelSize * scaleFactor; if (SETTINGS.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.primaryMonitor == this.monitor) { @@ -660,7 +662,7 @@ export const Panel = GObject.registerClass({ if (this.checkIfVertical()) { let viewHeight = this.monitor.height - gsTopPanelOffset; - + if (anchor === Pos.MIDDLE) { anchorPlaceOnMonitor = (viewHeight - h) / 2; } else if (anchor === Pos.END) { @@ -681,7 +683,7 @@ export const Panel = GObject.registerClass({ } return { - x, y, + x, y, w, h, lrPadding, tbPadding, @@ -691,11 +693,11 @@ export const Panel = GObject.registerClass({ _setAllocationMap() { this.allocationMap = {}; - let setMap = (name, actor) => this.allocationMap[name] = { + let setMap = (name, actor) => this.allocationMap[name] = { actor: actor, - box: new Clutter.ActorBox() + box: new Clutter.ActorBox() }; - + setMap(Pos.SHOW_APPS_BTN, this.showAppsIconWrapper.realShowAppsIcon); setMap(Pos.ACTIVITIES_BTN, this.statusArea.activities ? this.statusArea.activities.container : 0); setMap(Pos.LEFT_BOX, this._leftBox); @@ -772,19 +774,19 @@ export const Panel = GObject.registerClass({ brSize += refGroup.size; } } - + if (group.isCentered) { availableSize -= Math.max(tlSize, brSize) * 2; } else { availableSize -= tlSize + brSize; } - + if (availableSize < group.size) { expandable.natSize -= (group.size - availableSize) * (group.isCentered && !Pos.checkIfCentered(expandable.position) ? .5 : 1); assignGroupSize(group, true); } } - + if (group.isCentered) { startPosition = tlLimit + (brLimit - tlLimit - group.size) * .5; } else if (group.position == Pos.STACKED_BR) { @@ -833,9 +835,9 @@ export const Panel = GObject.registerClass({ let prevGroup = this._elementGroups[i - 1]; let nextGroup = this._elementGroups[i + 1]; - let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : + let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : centeredMonitorGroup && group.index > centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c2] : panelAlloc[this.varCoord.c1]; - let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : + let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : centeredMonitorGroup && group.index < centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c1] : panelAlloc[this.varCoord.c2]; if (group.position == Pos.STACKED_TL) { @@ -860,7 +862,7 @@ export const Panel = GObject.registerClass({ // styles for theming Object.keys(St.Side).forEach(p => { let cssName = 'dashtopanel' + p.charAt(0) + p.slice(1).toLowerCase(); - + this.panel[(St.Side[p] == this.geom.position ? 'add' : 'remove') + '_style_class_name'](cssName); }); @@ -892,7 +894,7 @@ export const Panel = GObject.registerClass({ } else { const targetActor = global.stage.get_event_actor(event); - if (Main.modalCount > 0 || targetActor != actor || + if (Main.modalCount > 0 || targetActor != actor || (!isPress && type != Clutter.EventType.TOUCH_BEGIN) || (isPress && button != 1)) { return Clutter.EVENT_PROPAGATE; @@ -956,7 +958,7 @@ export const Panel = GObject.registerClass({ actor.vertical = isVertical; } else if ( actor != this.statusArea.appMenu && - ((actor._delegate || actor) instanceof PanelMenu.ButtonBox || actor == this.statusArea.quickSettings) + ((actor._delegate || actor) instanceof PanelMenu.ButtonBox || actor == this.statusArea.quickSettings) ) { let child = actor.get_first_child(); @@ -983,7 +985,7 @@ export const Panel = GObject.registerClass({ }; _set(actor, false); - + if (isVertical) _set(actor, isVertical); } @@ -994,7 +996,7 @@ export const Panel = GObject.registerClass({ delete actor._dtpVisibleId; delete actor._dtpDestroyId; - + this._unmappedButtons.splice(this._unmappedButtons.indexOf(actor), 1); } @@ -1008,16 +1010,16 @@ export const Panel = GObject.registerClass({ let setClockText = (text, useTimeSeparator) => { let stacks = text instanceof Array; let separator = `\n ${useTimeSeparator ? '‧‧' : '—' } \n`; - + clockText.set_text((stacks ? text.join(separator) : text).trim()); clockText.set_use_markup(stacks); clockText.get_allocation_box(); - + return !clockText.get_layout().is_ellipsized(); }; if (clockText.ellipsize == Pango.EllipsizeMode.NONE) { - //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back + //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back clockText.ellipsize = Pango.EllipsizeMode.END; } @@ -1029,8 +1031,8 @@ export const Panel = GObject.registerClass({ datetimeParts = [datetimeParts.join(' '), time]; } - if (!setClockText(datetime) && - !setClockText(datetimeParts) && + if (!setClockText(datetime) && + !setClockText(datetimeParts) && !setClockText(time)) { let timeParts = time.split('∶'); @@ -1078,7 +1080,7 @@ export const Panel = GObject.registerClass({ }]); } }); - + this._showDesktopButton.connect('leave-event', () => { this._showDesktopButton.remove_style_class_name(this._getBackgroundBrightness() ? 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); @@ -1136,7 +1138,7 @@ export const Panel = GObject.registerClass({ time: time, transition: 'easeOutQuad' }; - + Utils.animateWindowOpacity(w.get_compositor_private(), tweenOpts); } }); @@ -1168,14 +1170,14 @@ export const Panel = GObject.registerClass({ windows.forEach(function(w) { w.minimize(); }); - + this._restoreWindowList = windows; this._timeoutsHandler.add([T5, 20, () => this._signalsHandler.addWithLabel( - label, + label, [ - tracker, - 'notify::focus-app', + tracker, + 'notify::focus-app', () => this._restoreWindowList = null ] )]); @@ -1208,7 +1210,7 @@ export const Panel = GObject.registerClass({ showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = null; } else if (direction && scrollAction === 'CYCLE_WINDOWS') { let windows = this.taskbar.getAppInfos().reduce((ws, appInfo) => ws.concat(appInfo.windows), []); - + Utils.activateSiblingWindow(windows, direction); } else if (scrollAction === 'CHANGE_VOLUME' && !event.is_pointer_emulated()) { let proto = Volume.OutputIndicator.prototype; diff --git a/prefs.js b/prefs.js index d2337c2..2746ef4 100644 --- a/prefs.js +++ b/prefs.js @@ -160,7 +160,7 @@ const Preferences = class { this._builder.set_scope(new BuilderScope(this)); this._settings = settings; this._path = path; - + this._metadata = ExtensionPreferences.lookupByURL(import.meta.url).metadata; this._builder.set_translation_domain(this._metadata['gettext-domain']); @@ -168,6 +168,7 @@ const Preferences = class { // dialogs this._builder.add_from_file(this._path + '/ui/BoxAnimateAppIconHoverOptions.ui'); + this._builder.add_from_file(this._path + '/ui/BoxHighlightAppIconHoverOptions.ui'); this._builder.add_from_file(this._path + '/ui/BoxDotOptions.ui'); this._builder.add_from_file(this._path + '/ui/BoxShowDesktopOptions.ui'); this._builder.add_from_file(this._path + '/ui/BoxDynamicOpacityOptions.ui'); @@ -222,6 +223,8 @@ const Preferences = class { this._tray_size_timeout = 0; this._leftbox_size_timeout = 0; this._appicon_margin_timeout = 0; + this._appicon_margin_todesktop_timeout = 0; + this._appicon_margin_toscreenborder_timeout = 0; this._appicon_padding_timeout = 0; this._opacity_timeout = 0; this._tray_padding_timeout = 0; @@ -377,7 +380,7 @@ const Preferences = class { _displayPanelPositionsForMonitor(monitorIndex) { let taskbarListBox = this._builder.get_object('taskbar_display_listbox'); - + while(taskbarListBox.get_first_child()) { taskbarListBox.remove(taskbarListBox.get_first_child()); @@ -403,7 +406,7 @@ const Preferences = class { }); child = child.get_next_sibling(); } - + monitors.forEach(m => panelElementPositionsSettings[m] = newPanelElementPositions); this._settings.set_string('panel-element-positions', JSON.stringify(panelElementPositionsSettings)); }; @@ -462,7 +465,7 @@ const Preferences = class { if (Pos.optionDialogFunctions[el.element]) { let cogImg = new Gtk.Image({ icon_name: 'emblem-system-symbolic' }); let optionsBtn = new Gtk.Button({ tooltip_text: _('More options') }); - + optionsBtn.get_style_context().add_class('circular'); optionsBtn.set_child(cogImg); grid.attach(optionsBtn, 2, 0, 1, 1); @@ -484,7 +487,7 @@ const Preferences = class { _createPreferencesDialog(title, content, reset_function = null) { let dialog; - + dialog = new Gtk.Dialog({ title: title, transient_for: this.notebook.get_root(), use_header_bar: true, @@ -572,7 +575,7 @@ const Preferences = class { _showDesktopButtonOptions() { let box = this._builder.get_object('box_show_showdesktop_options'); - + let dialog = this._createPreferencesDialog(_('Show Desktop options'), box, () => { // restore default settings @@ -621,6 +624,14 @@ const Preferences = class { .set_format_value_func((scale, value) => { return value + ' px'; }); + this._builder.get_object('appicon_margin_todesktop_scale') + .set_format_value_func((scale, value) => { + return value + ' px'; + }); + this._builder.get_object('appicon_margin_toscreenborder_scale') + .set_format_value_func((scale, value) => { + return value + ' px'; + }); this._builder.get_object('appicon_padding_scale') .set_format_value_func((scale, value) => { @@ -684,6 +695,12 @@ const Preferences = class { .set_format_value_func((scale, value) => { return ngettext("%d icon", "%d icons", value).format(value); }); + + // highlight appicon on hover dialog + this._builder.get_object('highlight_appicon_borderradius') + .set_format_value_func((scale, value) => { + return value + ' px'; + }); } _bindSettings() { @@ -846,7 +863,7 @@ const Preferences = class { this._builder.get_object('grid_dot_color'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('dot-color-override', this._builder.get_object('dot_color_unfocused_box'), 'sensitive', @@ -856,7 +873,7 @@ const Preferences = class { this._builder.get_object('grid_dot_color_unfocused'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { let rgba = new Gdk.RGBA(); rgba.parse(this._settings.get_string('dot-color-' + i)); @@ -927,7 +944,7 @@ const Preferences = class { this._settings.connect('changed::panel-positions', () => this._updateVerticalRelatedOptions()); this._updateVerticalRelatedOptions(); - + for (let i = 0; i < this.monitors.length; ++i) { //the gnome-shell primary index is the first one in the "available-monitors" setting let label = !i ? _('Primary monitor') : _('Monitor ') + (i + 1); @@ -935,7 +952,7 @@ const Preferences = class { this._builder.get_object('multimon_primary_combo').append_text(label); this._builder.get_object('taskbar_position_monitor_combo').append_text(label); } - + this._builder.get_object('multimon_primary_combo').set_active(dtpPrimaryMonitorIndex); this._builder.get_object('taskbar_position_monitor_combo').set_active(dtpPrimaryMonitorIndex); @@ -1110,7 +1127,7 @@ const Preferences = class { this._builder.get_object('trans_options_distance_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('trans-dynamic-distance', widget.get_value()); }); - + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); this._builder.get_object('trans_options_min_opacity_spinbutton').connect('value-changed', (widget) => { this._settings.set_double('trans-dynamic-anim-target', widget.get_value() * 0.01); @@ -1143,7 +1160,7 @@ const Preferences = class { dialog.set_default_size(1, 1); }); - + this._settings.bind('desktop-line-use-custom-color', this._builder.get_object('override_show_desktop_line_color_switch'), 'active', @@ -1153,7 +1170,7 @@ const Preferences = class { this._builder.get_object('override_show_desktop_line_color_colorbutton'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + rgba.parse(this._settings.get_string('desktop-line-custom-color')); this._builder.get_object('override_show_desktop_line_color_colorbutton').set_rgba(rgba); this._builder.get_object('override_show_desktop_line_color_colorbutton').connect('color-set', (button) => { @@ -1191,7 +1208,7 @@ const Preferences = class { this._settings.bind('intellihide-use-pressure', this._builder.get_object('intellihide_use_pressure_switch'), 'active', - Gio.SettingsBindFlags.DEFAULT); + Gio.SettingsBindFlags.DEFAULT); this._settings.bind('intellihide-use-pressure', this._builder.get_object('intellihide_use_pressure_options'), @@ -1268,7 +1285,7 @@ const Preferences = class { this._settings.set_value('intellihide-pressure-threshold', this._settings.get_default_value('intellihide-pressure-threshold')); this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); - + this._settings.set_value('intellihide-pressure-time', this._settings.get_default_value('intellihide-pressure-time')); this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); @@ -1340,7 +1357,7 @@ const Preferences = class { this._builder.get_object('multimon_multi_show_favorites_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('show-favorites', this._builder.get_object('multimon_multi_show_favorites_switch'), 'sensitive', @@ -1349,7 +1366,7 @@ const Preferences = class { this._settings.bind('show-running-apps', this._builder.get_object('show_runnning_apps_switch'), 'active', - Gio.SettingsBindFlags.DEFAULT); + Gio.SettingsBindFlags.DEFAULT); this._setPreviewTitlePosition(); @@ -1378,7 +1395,7 @@ const Preferences = class { this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); this._settings.set_value('preview-use-custom-opacity', this._settings.get_default_value('preview-use-custom-opacity')); - + this._settings.set_value('window-preview-use-custom-icon-size', this._settings.get_default_value('window-preview-use-custom-icon-size')); this._settings.set_value('preview-custom-opacity', this._settings.get_default_value('preview-custom-opacity')); @@ -1405,7 +1422,7 @@ const Preferences = class { this._settings.set_value('window-preview-aspect-ratio-y', this._settings.get_default_value('window-preview-aspect-ratio-y')); this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); - + this._settings.set_value('window-preview-padding', this._settings.get_default_value('window-preview-padding')); this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); @@ -1413,7 +1430,7 @@ const Preferences = class { this._settings.set_value('window-preview-title-font-size', this._settings.get_default_value('window-preview-title-font-size')); this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); - + this._settings.set_value('window-preview-custom-icon-size', this._settings.get_default_value('window-preview-custom-icon-size')); this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); @@ -1467,7 +1484,7 @@ const Preferences = class { this._builder.get_object('preview_custom_opacity_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('preview-custom-opacity', widget.get_value()); }); - + this._settings.bind('peek-mode', this._builder.get_object('peek_mode_switch'), 'active', @@ -1480,7 +1497,7 @@ const Preferences = class { this._builder.get_object('grid_peek_mode_opacity'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('window-preview-show-title', this._builder.get_object('preview_show_title_switch'), 'active', @@ -1551,7 +1568,7 @@ const Preferences = class { this._builder.get_object('preview_title_size_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('window-preview-title-font-size', widget.get_value()); }); - + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); this._builder.get_object('preview_custom_icon_size_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('window-preview-custom-icon-size', widget.get_value()); @@ -1571,7 +1588,7 @@ const Preferences = class { dialog.show(); }); - + this._settings.bind('isolate-workspaces', this._builder.get_object('isolate_workspaces_switch'), 'active', @@ -1634,7 +1651,7 @@ const Preferences = class { this._settings.bind('group-apps-use-launchers', this._builder.get_object('group_apps_use_launchers_switch'), 'active', - Gio.SettingsBindFlags.DEFAULT); + Gio.SettingsBindFlags.DEFAULT); this._builder.get_object('show_group_apps_options_button').connect('clicked', () => { let box = this._builder.get_object('box_group_apps_options'); @@ -1696,7 +1713,7 @@ const Preferences = class { dialog.show(); dialog.set_default_size(600, 1); - }); + }); this._builder.get_object('click_action_combo').set_active_id(this._settings.get_string('click-action')); this._builder.get_object('click_action_combo').connect('changed', (widget) => { @@ -1890,7 +1907,7 @@ const Preferences = class { dialog.set_default_size(600, 1); }); - + // setup dialog for secondary menu options this._builder.get_object('secondarymenu_options_button').connect('clicked', () => { let box = this._builder.get_object('box_secondarymenu_options'); @@ -1935,11 +1952,14 @@ const Preferences = class { {objectName: 'tray_size_scale', valueName: 'tray-size', range: DEFAULT_FONT_SIZES }, {objectName: 'leftbox_size_scale', valueName: 'leftbox-size', range: DEFAULT_FONT_SIZES }, {objectName: 'appicon_margin_scale', valueName: 'appicon-margin', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'appicon_margin_todesktop_scale', valueName: 'appicon-margin-todesktop', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'appicon_margin_toscreenborder_scale', valueName: 'appicon-margin-toscreenborder', range: DEFAULT_MARGIN_SIZES }, {objectName: 'appicon_padding_scale', valueName: 'appicon-padding', range: DEFAULT_MARGIN_SIZES }, {objectName: 'tray_padding_scale', valueName: 'tray-padding', range: DEFAULT_PADDING_SIZES }, {objectName: 'leftbox_padding_scale', valueName: 'leftbox-padding', range: DEFAULT_PADDING_SIZES }, {objectName: 'statusicon_padding_scale', valueName: 'status-icon-padding', range: DEFAULT_PADDING_SIZES }, - {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS } + {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS }, + {objectName: 'highlight_appicon_borderradius', valueName: 'highlight-appicon-hover-border-radius', range: [ 16, 12, 8, 4, 2, 0 ] }, ]; for(const idx in sizeScales) { @@ -2054,6 +2074,71 @@ const Preferences = class { }); + this._settings.bind('highlight-appicon-hover', + this._builder.get_object('highlight_appicon_hover_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('highlight-appicon-hover', + this._builder.get_object('highlight_appicon_hover_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + { + rgba.parse(this._settings.get_string('highlight-appicon-hover-background-color')); + this._builder.get_object('highlight_appicon_color').set_rgba(rgba); + this._builder.get_object('highlight_appicon_color').connect('color-set', (button) => { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + this._settings.set_string('highlight-appicon-hover-background-color', css); + }); + + rgba.parse(this._settings.get_string('highlight-appicon-pressed-background-color')); + this._builder.get_object('pressed_appicon_color').set_rgba(rgba); + this._builder.get_object('pressed_appicon_color').connect('color-set', (button) => { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + this._settings.set_string('highlight-appicon-pressed-background-color', css); + }); + + let scales = [ + ['highlight_appicon_borderradius', 'highlight-appicon-hover-border-radius'], + ]; + + const updateScale = scale => { + let [id, key] = scale; + this._builder.get_object(id).set_value(this._settings.get_int(key)); + }; + scales.forEach(scale => { + updateScale(scale); + let [id, key] = scale; + this._builder.get_object(id).connect('value-changed', widget => { + this._settings.set_int(key, widget.get_value()); + }); + }); + + } + + this._builder.get_object('highlight_appicon_hover_button').connect('clicked', () => { + let box = this._builder.get_object('highlight_appicon_hover_options'); + + let dialog = this._createPreferencesDialog(_('App icon highlight options'), box, () => + { + // restore default settings + this._settings.set_value('highlight-appicon-hover-background-color', this._settings.get_default_value('highlight-appicon-hover-background-color')); + rgba.parse(this._settings.get_string('highlight-appicon-hover-background-color')); + this._builder.get_object('highlight_appicon_color').set_rgba(rgba); + this._settings.set_value('highlight-appicon-pressed-background-color', this._settings.get_default_value('highlight-appicon-pressed-background-color')); + rgba.parse(this._settings.get_string('highlight-appicon-pressed-background-color')); + this._builder.get_object('pressed_appicon_color').set_rgba(rgba); + this._settings.set_value('highlight-appicon-hover-border-radius', this._settings.get_default_value('highlight-appicon-hover-border-radius')); + this._builder.get_object('highlight_appicon_borderradius').set_value(this._settings.get_int('highlight-appicon-hover-border-radius')); + }); + + dialog.show(); + + }); + this._settings.bind('stockgs-keep-dash', this._builder.get_object('stockgs_dash_switch'), 'active', @@ -2064,7 +2149,7 @@ const Preferences = class { 'active', Gio.SettingsBindFlags.DEFAULT); - + this._settings.connect('changed::stockgs-keep-top-panel', () => this._maybeDisableTopPosition()); @@ -2074,7 +2159,7 @@ const Preferences = class { this._builder.get_object('stockgs_panelbtn_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('stockgs-force-hotcorner', this._builder.get_object('stockgs_hotcorner_switch'), 'active', @@ -2151,7 +2236,7 @@ const Preferences = class { dialog.connect('response', (dialog, id) => { if (id == Gtk.ResponseType.ACCEPT) acceptHandler.call(this, dialog.get_file().get_path()); - + dialog.destroy(); }); } @@ -2161,7 +2246,7 @@ const Preferences = class { const BuilderScope = GObject.registerClass({ Implements: [Gtk.BuilderScope], }, class BuilderScope extends GObject.Object { - + _init(preferences) { this._preferences = preferences; super._init(); @@ -2170,13 +2255,13 @@ const BuilderScope = GObject.registerClass({ vfunc_create_closure(builder, handlerName, flags, connectObject) { if (flags & Gtk.BuilderClosureFlags.SWAPPED) throw new Error('Unsupported template signal flag "swapped"'); - + if (typeof this[handlerName] === 'undefined') throw new Error(`${handlerName} is undefined`); - + return this[handlerName].bind(connectObject || this); } - + on_btn_click(connectObject) { connectObject.set_label("Clicked"); } @@ -2188,7 +2273,7 @@ const BuilderScope = GObject.registerClass({ position_top_button_clicked_cb(button) { if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.TOP); } - + position_left_button_clicked_cb(button) { if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.LEFT); } @@ -2281,6 +2366,30 @@ const BuilderScope = GObject.registerClass({ }); } + appicon_margin_todesktop_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_margin_todesktop_timeout > 0) + GLib.Source.remove(this._preferences._appicon_margin_todesktop_timeout); + + this._preferences._appicon_margin_todesktop_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { + this._preferences._settings.set_int('appicon-margin-todesktop', scale.get_value()); + this._preferences._appicon_margin_todesktop_timeout = 0; + return GLib.SOURCE_REMOVE; + }); + } + + appicon_margin_toscreenborder_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_margin_toscreenborder_timeout > 0) + GLib.Source.remove(this._preferences._appicon_margin_toscreenborder_timeout); + + this._preferences._appicon_margin_toscreenborder_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { + this._preferences._settings.set_int('appicon-margin-toscreenborder', scale.get_value()); + this._preferences._appicon_margin_toscreenborder_timeout = 0; + return GLib.SOURCE_REMOVE; + }); + } + appicon_padding_scale_value_changed_cb(scale) { // Avoid settings the size consinuosly if (this._preferences._appicon_padding_timeout > 0) diff --git a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml index a73a349..c79bd50 100644 --- a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml +++ b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -735,6 +735,16 @@ App icon margin Set the margin for application icons in the embedded dash. + + 0 + App icon margin to desktop + Set the margin for application icons in the embedded dash towards the desktop (top margin if panel is on the bottom). + + + 0 + App icon margin to screen border + Set the margin for application icons in the embedded dash towards the desktop (bottom margin if panel is on the bottom). + 4 App icon padding @@ -795,6 +805,22 @@ {'SIMPLE':1,'RIPPLE':1.25,'PLANK':2} App icon hover animation zoom scale in relation to the app icon size + + true + Highlight app icon on hover + + + "rgba(238, 238, 236, 0.1)" + Highlight color + + + "rgba(238, 238, 236, 0.18)" + Mouse down highlight color + + + 0 + Highlight border radius + true Integrate items from the gnome appmenu into the right click menu diff --git a/stylesheet.css b/stylesheet.css index 3640d17..bd86490 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -24,7 +24,7 @@ #dashtopanelTaskbar .dash-item-container > StWidget, .dashtopanelMainPanel .show-apps { margin: 0; - padding: 0; + padding: 0; } #dashtopanelScrollview .overview-tile, @@ -41,16 +41,28 @@ #dashtopanelScrollview .overview-tile:hover .dtp-container, #dashtopanelScrollview .overview-tile:focus .dtp-container { background-color: rgba(238, 238, 236, 0.1); + border-radius: 0px; + background-color: var(--dtp-hover-background-color); + border-radius: var(--dtp-hover-border-radius); +} + +#dashtopanelScrollview .overview-tile:hover .dtp-container > .dtp-dots-container, +#dashtopanelScrollview .overview-tile:focus .dtp-container > .dtp-dots-container { + border-radius: 0px; + border-radius: var(--dtp-hover-border-radius); } #dashtopanelTaskbar .dash-item-container .overview-tile:hover, #dashtopanelTaskbar .dash-item-container .overview-tile .dtp-container .overview-icon, -#dashtopanelScrollview .overview-tile:hover .dtp-container.animate-appicon-hover { +#dashtopanelScrollview .overview-tile:hover .dtp-container.no-highlight, +#dashtopanelScrollview .overview-tile:focus .dtp-container.no-highlight { background: none; } + #dashtopanelScrollview .overview-tile:active .dtp-container { background-color: rgba(238, 238, 236, 0.18); + background-color: var(--dtp-pressed-background-color); } #dashtopanelScrollview .overview-tile .favorite { @@ -66,13 +78,13 @@ } .dashtopanelMainPanel.vertical .panel-button { - text-align: center; + text-align: center; } .dashtopanelMainPanel.vertical .panel-button.vertical *, .dashtopanelMainPanel.vertical .panel-button.clock-display * { padding: 0; - margin: 0; + margin: 0; } .dashtopanelMainPanel.vertical .panel-button > *, @@ -80,7 +92,7 @@ .dashtopanelMainPanel.vertical .panel-button.vertical .system-status-icon, .dashtopanelMainPanel.vertical .panel-button.clock-display > *, .dashtopanelMainPanel.vertical .panel-button.clock-display .clock { - padding: 8px 0; + padding: 8px 0; } .dashtopanelMainPanel.vertical .panel-button.clock-display { @@ -113,7 +125,7 @@ } #panel #panelLeft, #panel #panelCenter { - spacing: 0px; + spacing: 0px; } .showdesktop-button-dark-hovered { diff --git a/taskbar.js b/taskbar.js index 54da64f..af08ccd 100644 --- a/taskbar.js +++ b/taskbar.js @@ -98,11 +98,11 @@ const iconAnimationSettings = { }, get travel() { - return Math.max(0, this._getDictValue('animate-appicon-hover-animation-travel')); + return Math.max(-1, this._getDictValue('animate-appicon-hover-animation-travel')); }, get zoom() { - return Math.max(1, this._getDictValue('animate-appicon-hover-animation-zoom')); + return Math.max(0.5, this._getDictValue('animate-appicon-hover-animation-zoom')); }, }; @@ -154,7 +154,7 @@ export const TaskbarActor = GObject.registerClass({ leftFade.set_style(gradientStyle); rightFade.set_style(gradientStyle); } - + childBox[panel.varCoord.c2] = childBox[panel.varCoord.c1] + (value > 0 ? scrollview._dtpFadeSize : 0); leftFade.allocate(childBox); @@ -168,13 +168,13 @@ export const TaskbarActor = GObject.registerClass({ // then calls BoxLayout) vfunc_get_preferred_width(forHeight) { let [, natWidth] = St.Widget.prototype.vfunc_get_preferred_width.call(this, forHeight); - + return [0, natWidth]; } vfunc_get_preferred_height(forWidth) { let [, natHeight] = St.Widget.prototype.vfunc_get_preferred_height.call(this, forWidth); - + return [0, natHeight]; } }); @@ -199,7 +199,7 @@ export const Taskbar = class extends EventEmitter { super(); this.dtpPanel = panel; - + // start at smallest size due to running indicator drawing area expanding but not shrinking this.iconSize = 16; @@ -252,13 +252,13 @@ export const Taskbar = class extends EventEmitter { this._container.add_child(new St.Widget({ width: 0, reactive: false })); this._container.add_child(this._scrollView); - + let orientation = panel.getOrientation(); let fadeStyle = 'background-gradient-direction:' + orientation; let fade1 = new St.Widget({ style_class: 'scrollview-fade', reactive: false }); - let fade2 = new St.Widget({ style_class: 'scrollview-fade', - reactive: false, - pivot_point: new Graphene.Point({ x: .5, y: .5 }), + let fade2 = new St.Widget({ style_class: 'scrollview-fade', + reactive: false, + pivot_point: new Graphene.Point({ x: .5, y: .5 }), rotation_angle_z: 180 }); fade1.set_style(fadeStyle); @@ -278,7 +278,7 @@ export const Taskbar = class extends EventEmitter { }); const adjustment = this._scrollView[orientation[0] + 'adjustment']; - + this._workId = Main.initializeDeferredWork(this._box, this._redisplay.bind(this)); this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); @@ -318,7 +318,7 @@ export const Taskbar = class extends EventEmitter { ], [ global.window_manager, - 'switch-workspace', + 'switch-workspace', () => this._connectWorkspaceSignals() ], [ @@ -400,7 +400,7 @@ export const Taskbar = class extends EventEmitter { let setAttributes = () => { this.isGroupApps = SETTINGS.get_boolean('group-apps'); this.usingLaunchers = !this.isGroupApps && SETTINGS.get_boolean('group-apps-use-launchers'); - this.showFavorites = SETTINGS.get_boolean('show-favorites') && + this.showFavorites = SETTINGS.get_boolean('show-favorites') && (this.dtpPanel.isPrimary || SETTINGS.get_boolean('show-favorites-all-monitors')) this.showRunningApps = SETTINGS.get_boolean('show-running-apps') this.allowSplitApps = this.usingLaunchers || (!this.isGroupApps && !this.showFavorites) @@ -425,7 +425,7 @@ export const Taskbar = class extends EventEmitter { this._signalsHandler = 0; this._container.destroy(); - + this.previewMenu.disable(); this.previewMenu.destroy(); @@ -592,7 +592,7 @@ export const Taskbar = class extends EventEmitter { if (this._dragInfo) { this._box.set_child_at_index(this._dragInfo[1]._dashItemContainer, this._dragInfo[0]); } - + this._endDrag(); } @@ -614,10 +614,10 @@ export const Taskbar = class extends EventEmitter { this._clearEmptyDropTarget(); this._showAppsIcon.setDragApp(null); DND.removeDragMonitor(this._dragMonitor); - + this._dragMonitor = null; this.emit('end-drag'); - + this._toggleFavoriteHighlight(); } @@ -639,9 +639,9 @@ export const Taskbar = class extends EventEmitter { _toggleFavoriteHighlight(show) { let appFavorites = AppFavorites.getAppFavorites(); let cssFuncName = (show ? 'add' : 'remove') + '_style_class_name'; - + if (this.showFavorites) - this._getAppIcons().filter(appIcon => (this.usingLaunchers && appIcon.isLauncher) || + this._getAppIcons().filter(appIcon => (this.usingLaunchers && appIcon.isLauncher) || (!this.usingLaunchers && appFavorites.isFavorite(appIcon.app.get_id()))) .forEach(fav => fav._container[cssFuncName]('favorite')); } @@ -686,12 +686,12 @@ export const Taskbar = class extends EventEmitter { _createAppItem(app, window, isLauncher) { let appIcon = new AppIcons.TaskbarAppIcon( { - app, + app, window, isLauncher }, this.dtpPanel, - { + { setSizeManually: true, showLabel: false, isDraggable: !SETTINGS.get_boolean('taskbar-locked'), @@ -730,7 +730,7 @@ export const Taskbar = class extends EventEmitter { appIcon.connect('notify::hover', () => { if (appIcon.hover){ - this._timeoutsHandler.add([T1, 100, + this._timeoutsHandler.add([T1, 100, () => Utils.ensureActorVisibleInScrollView(this._scrollView, appIcon, this._scrollView._dtpFadeSize) ]) @@ -761,7 +761,7 @@ export const Taskbar = class extends EventEmitter { appIcon._menu._boxPointer.yOffset = -y_shift; } }); - + // Override default AppIcon label_actor, now the // accessible_name is set at DashItemContainer.setLabelText appIcon.label_actor = null; @@ -863,13 +863,13 @@ export const Taskbar = class extends EventEmitter { if (availSize < minIconSize) { availSize = minIconSize; } - + // For the icon size, we only consider children which are "proper" - // icons and which are not animating out (which means they will be + // icons and which are not animating out (which means they will be // destroyed at the end of the animation) let iconChildren = this._getTaskbarIcons().concat([this._showAppsIcon]); let scale = this.iconSize / availSize; - + this.iconSize = availSize; for (let i = 0; i < iconChildren.length; i++) { @@ -902,7 +902,7 @@ export const Taskbar = class extends EventEmitter { } sortAppsCompareFunction(appA, appB) { - return getAppStableSequence(appA, this.dtpPanel.monitor) - + return getAppStableSequence(appA, this.dtpPanel.monitor) - getAppStableSequence(appB, this.dtpPanel.monitor); } @@ -941,9 +941,9 @@ export const Taskbar = class extends EventEmitter { (!this.allowSplitApps || this.isGroupApps || appInfo.windows[0] == appIcon.window) && appInfo.isLauncher == appIcon.isLauncher); - if (appIndex < 0 || + if (appIndex < 0 || (appIcon.window && (this.isGroupApps || expectedAppInfos[appIndex].windows.indexOf(appIcon.window) < 0)) || - (!appIcon.window && !appIcon.isLauncher && + (!appIcon.window && !appIcon.isLauncher && !this.isGroupApps && expectedAppInfos[appIndex].windows.length)) { currentAppIcons[i][this._shownInitially ? 'animateOutAndDestroy' : 'destroy'](); currentAppIcons.splice(i, 1); @@ -953,13 +953,13 @@ export const Taskbar = class extends EventEmitter { //if needed, reorder the existing appIcons and create the missing ones let currentPosition = 0; for (let i = 0, l = expectedAppInfos.length; i < l; ++i) { - let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? - [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : + let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? + [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : expectedAppInfos[i].windows.map(window => ({ app: expectedAppInfos[i].app, window: window, isLauncher: false })); - + for (let j = 0, ll = neededAppIcons.length; j < ll; ++j) { //check if the icon already exists - let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && + let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && appIcon.child._delegate.window == neededAppIcons[j].window); if (matchingAppIconIndex > 0 && matchingAppIconIndex != currentPosition) { @@ -969,10 +969,10 @@ export const Taskbar = class extends EventEmitter { } else if (matchingAppIconIndex < 0) { //the icon doesn't exist yet, create a new one let newAppIcon = this._createAppItem(neededAppIcons[j].app, neededAppIcons[j].window, neededAppIcons[j].isLauncher); - + this._box.insert_child_at_index(newAppIcon, currentPosition); currentAppIcons.splice(currentPosition, 0, newAppIcon); - + // Skip animations on first run when adding the initial set // of items, to avoid all items zooming in at once newAppIcon.show(this._shownInitially); @@ -1011,14 +1011,14 @@ export const Taskbar = class extends EventEmitter { apps.push(app); } } - + return apps; } _createAppInfos(apps, defaultWindows, defaultIsLauncher) { if (this.allowSplitApps && !defaultIsLauncher) { let separateApps = [] - + if (apps.length) { let tracker = Shell.WindowTracker.get_default(); let windows = AppIcons.getInterestingWindows(null, this.dtpPanel.monitor) @@ -1029,8 +1029,8 @@ export const Taskbar = class extends EventEmitter { if (apps.indexOf(windowApp) >= 0) separateApps.push({ - app: windowApp, - isLauncher: false, + app: windowApp, + isLauncher: false, windows: [w] }) }) @@ -1039,8 +1039,8 @@ export const Taskbar = class extends EventEmitter { return separateApps } - return apps.map(app => ({ - app: app, + return apps.map(app => ({ + app: app, isLauncher: defaultIsLauncher || false, windows: defaultWindows || AppIcons.getInterestingWindows(app, this.dtpPanel.monitor) .sort(sortWindowsCompareFunction) @@ -1129,10 +1129,10 @@ export const Taskbar = class extends EventEmitter { let currentAppIcons = this._getAppIcons(); let sourceIndex = currentAppIcons.indexOf(source); - let hoveredIndex = Utils.findIndex(currentAppIcons, - appIcon => pos >= appIcon._dashItemContainer[posProp] && + let hoveredIndex = Utils.findIndex(currentAppIcons, + appIcon => pos >= appIcon._dashItemContainer[posProp] && pos <= (appIcon._dashItemContainer[posProp] + appIcon._dashItemContainer[sizeProp])); - + if (!this._dragInfo) { this._dragInfo = [sourceIndex, source]; } @@ -1145,13 +1145,13 @@ export const Taskbar = class extends EventEmitter { // Don't allow positioning before or after self and between icons of same app if ungrouped and showing favorites if (!(hoveredIndex === sourceIndex || (isLeft && hoveredIndex - 1 == sourceIndex) || - (!this.allowSplitApps && isLeft && hoveredIndex - 1 >= 0 && source.app != prevIcon.app && + (!this.allowSplitApps && isLeft && hoveredIndex - 1 >= 0 && source.app != prevIcon.app && prevIcon.app == currentAppIcons[hoveredIndex].app) || (!isLeft && hoveredIndex + 1 == sourceIndex) || - (!this.allowSplitApps && !isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != nextIcon.app && + (!this.allowSplitApps && !isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != nextIcon.app && nextIcon.app == currentAppIcons[hoveredIndex].app))) { this._box.set_child_at_index(source._dashItemContainer, hoveredIndex); - + // Ensure the next and previous icon are visible when moving the icon // (I assume there's room for both of them) if (hoveredIndex > 1) @@ -1160,14 +1160,14 @@ export const Taskbar = class extends EventEmitter { Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex+1], this._scrollView._dtpFadeSize); } } - + return this._dragInfo[0] !== sourceIndex ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.CONTINUE; } // Draggable target interface acceptDrop (source, actor, x, y, time) { // Don't allow favoriting of transient apps - if (!this._dragInfo || !source.app || source.app.is_window_backed() || + if (!this._dragInfo || !source.app || source.app.is_window_backed() || !this._settings.is_writable('favorite-apps')) { return false; } @@ -1198,9 +1198,9 @@ export const Taskbar = class extends EventEmitter { let appWindows = interestingWindows[app]; //prevents "reference to undefined property Symbol.toPrimitive" warning return appWindows; }; - - if (sameApps.length && - ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && + + if (sameApps.length && + ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && (!appIcons[sourceIndex + 1] || appIcons[sourceIndex + 1].app !== source.app))) { appIcons.splice(appIcons.indexOf(sameApps[0]), sameApps.length); Array.prototype.splice.apply(appIcons, [sourceIndex + 1, 0].concat(sameApps)); @@ -1208,15 +1208,15 @@ export const Taskbar = class extends EventEmitter { for (let i = 0, l = appIcons.length; i < l; ++i) { let windows = []; - + if (!usingLaunchers || (!source.isLauncher && !appIcons[i].isLauncher)) { windows = appIcons[i].window ? [appIcons[i].window] : getAppWindows(appIcons[i].app); } windows.forEach(w => w._dtpPosition = position++); - if (this.showFavorites && - ((usingLaunchers && appIcons[i].isLauncher) || + if (this.showFavorites && + ((usingLaunchers && appIcons[i].isLauncher) || (!usingLaunchers && appFavorites.isFavorite(appIcons[i].app.get_id())))) { ++favoritesCount; } @@ -1255,10 +1255,10 @@ export const Taskbar = class extends EventEmitter { SearchController._onStageKeyPress = function(actor, event) { if (Main.modalCount == 1 && event.get_key_symbol() === Clutter.KEY_Escape) { this._searchActive ? this.reset() : Main.overview.hide(); - + return Clutter.EVENT_STOP; } - + return Object.getPrototypeOf(this)._onStageKeyPress.call(this, actor, event); }; @@ -1293,13 +1293,13 @@ export const Taskbar = class extends EventEmitter { } } } - + _syncShowAppsButtonToggled() { let status = SearchController._showAppsButton.checked; if (this.showAppsButton.checked !== status) this.showAppsButton.checked = status; } - + showShowAppsButton() { this.showAppsButton.visible = true; this.showAppsButton.set_width(-1); @@ -1374,7 +1374,7 @@ export const TaskbarItemContainer = GObject.registerClass({ let travel = iconAnimationSettings.travel; let zoom = iconAnimationSettings.zoom; - return this._dtpPanel.dtpSize * (travel + (zoom - 1) / 2); + return this._dtpPanel.dtpSize * Math.max(0, travel + (zoom - 1) / 2); } _updateCloneContainerPosition(cloneContainer) { @@ -1470,10 +1470,10 @@ export const TaskbarItemContainer = GObject.registerClass({ let translationMax = (vertical ? width : height) * (travel + (zoom - 1) / 2); let translationEnd = translationMax * level; let translationDone = vertical ? this._raisedClone.translation_x : this._raisedClone.translation_y; - let translationTodo = Math.abs(translationEnd - translationDone); + let translationTodo = Math.sign(travel)*Math.abs(translationEnd - translationDone); let scale = 1 + (zoom - 1) * level; let rotationAngleZ = rotationDirection * rotation * level; - let time = duration * translationTodo / translationMax; + let time = Math.abs(duration * translationTodo / translationMax); let options = { scale_x: scale, scale_y: scale, @@ -1524,7 +1524,7 @@ const DragPlaceholderItem = GObject.registerClass({ this.child = { _delegate: appIcon }; - this._clone = new Clutter.Clone({ + this._clone = new Clutter.Clone({ source: appIcon.icon._iconBin, width: iconSize, height: iconSize @@ -1541,7 +1541,7 @@ const DragPlaceholderItem = GObject.registerClass({ export function getAppStableSequence(app, monitor) { let windows = AppIcons.getInterestingWindows(app, monitor); - + return windows.reduce((prevWindow, window) => { return Math.min(prevWindow, getWindowStableSequence(window)); }, Infinity); @@ -1552,5 +1552,5 @@ export function sortWindowsCompareFunction(windowA, windowB) { } export function getWindowStableSequence(window) { - return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); + return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); } diff --git a/ui/BoxAnimateAppIconHoverOptions.ui b/ui/BoxAnimateAppIconHoverOptions.ui index f49e2d7..f0ab669 100644 --- a/ui/BoxAnimateAppIconHoverOptions.ui +++ b/ui/BoxAnimateAppIconHoverOptions.ui @@ -18,14 +18,14 @@ - 0 + -100 100 1 5 - 100 + 10 250 1 5 diff --git a/ui/BoxHighlightAppIconHoverOptions.ui b/ui/BoxHighlightAppIconHoverOptions.ui new file mode 100644 index 0000000..5b99fcf --- /dev/null +++ b/ui/BoxHighlightAppIconHoverOptions.ui @@ -0,0 +1,70 @@ + + + + + + + 0 + 10 + 1 + 2 + + + + vertical + 600 + 24 + 32 + 32 + 32 + 32 + + + + + + Highlight AppIcon color + + + True + center + True + + + + + + + Pressed AppIcon color + + + True + center + True + + + + + + + Highlight AppIcon border radius + (default is 0) + + + 300 + highlight_appicon_borderradius_adjustment + 0 + 0 + right + True + + + + + + + + + + + \ No newline at end of file diff --git a/ui/BoxShowDesktopOptions.ui b/ui/BoxShowDesktopOptions.ui index be5d21c..e068126 100644 --- a/ui/BoxShowDesktopOptions.ui +++ b/ui/BoxShowDesktopOptions.ui @@ -52,7 +52,7 @@ Override Show Desktop line color - > + True center True diff --git a/ui/SettingsStyle.ui b/ui/SettingsStyle.ui index abe5c34..b76c96c 100644 --- a/ui/SettingsStyle.ui +++ b/ui/SettingsStyle.ui @@ -9,6 +9,20 @@ 0.1 + + 0.33 + 1 + 0.01 + 0.1 + + + + 0.33 + 1 + 0.01 + 0.1 + + 0.33 1 @@ -42,7 +56,7 @@ AppIcon style - + App Icon Margin @@ -61,6 +75,42 @@ + + + App Icon Margin Towards Desktop + (default is 0) + + + 300 + appicon_margin_todesktop_adjustment + 0 + 0 + right + True + + + + + + + + + App Icon Margin Towards Screen Border + (default is 0) + + + 300 + appicon_margin_toscreenborder_adjustment + 0 + 0 + right + True + + + + + + App Icon Padding @@ -104,6 +154,31 @@ + + + Highlight hovering app icons + + + True + center + + + emblem-system-symbolic + + + + + + + + center + + + + + Icon style From 013c6e32e2fca2471ff76eb5a75095bea3b58697 Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Fri, 13 Sep 2024 08:07:03 +0200 Subject: [PATCH 02/18] Beautify DTP - Fix ugly icon animation when using ungroup applications option --- appIcons.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/appIcons.js b/appIcons.js index 3cacb3c..d09f09b 100644 --- a/appIcons.js +++ b/appIcons.js @@ -292,10 +292,11 @@ export const TaskbarAppIcon = GObject.registerClass({ // The source of the clone is this._dtpIconContainer, // which contains the icon but no highlighting elements // using this.actor directly would break DnD style. + let cloneSource = this._dtpIconContainer; let clone = new Clutter.Clone({ - source: this._dtpIconContainer, + source: cloneSource, x: this.child.x, y: this.child.y, - width: this.child.width, height: this.child.height, + width: cloneSource.width, height: cloneSource.height, pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }), opacity: 255, reactive: false, From 28fe18ac167d67d68fe7bfea3253e3774d1acbfa Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:59:16 +0200 Subject: [PATCH 03/18] Beautify DTP - Allow hover animation travel below 0% - Allow hover animation zoom below 100% - Hover highlighting independent of hover animation - Custom color for hover highlighting - Custom color for mouse down highlighting - Icon background with rounded corners - Customize margin for app icons towards screen border and desktop --- appIcons.js | 295 ++++++++++++------ panel.js | 120 +++---- prefs.js | 181 ++++++++--- ...shell.extensions.dash-to-panel.gschema.xml | 26 ++ stylesheet.css | 28 +- taskbar.js | 130 ++++---- ui/BoxAnimateAppIconHoverOptions.ui | 4 +- ui/BoxHighlightAppIconHoverOptions.ui | 70 +++++ ui/BoxShowDesktopOptions.ui | 2 +- ui/SettingsStyle.ui | 77 ++++- 10 files changed, 662 insertions(+), 271 deletions(-) create mode 100644 ui/BoxHighlightAppIconHoverOptions.ui diff --git a/appIcons.js b/appIcons.js index c24e133..517cc5c 100644 --- a/appIcons.js +++ b/appIcons.js @@ -30,6 +30,7 @@ import GObject from 'gi://GObject'; import Mtk from 'gi://Mtk'; import Shell from 'gi://Shell'; import St from 'gi://St'; +import Gtk from 'gi://Gtk'; import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js'; import * as AppMenu from 'resource:///org/gnome/shell/ui/appMenu.js'; @@ -117,6 +118,9 @@ export const TaskbarAppIcon = GObject.registerClass({ this._previewMenu = previewMenu; this.iconAnimator = iconAnimator; this.lastClick = 0; + this._appicon_normalstyle = ''; + this._appicon_hoverstyle = ''; + this._appicon_pressedstyle = ''; super._init(appInfo.app, iconParams); @@ -127,7 +131,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if (event.type() == Clutter.EventType.TOUCH_BEGIN) { // Open the popup menu on long press. this._setPopupTimeout(); - } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { + } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { // Activate/launch the application. this.activate(1); this._removeMenuTimeout(); @@ -143,27 +147,27 @@ export const TaskbarAppIcon = GObject.registerClass({ this._removeMenuTimeout(); }; - + this._dot.set_width(0); this._isGroupApps = SETTINGS.get_boolean('group-apps'); - + this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); - this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._dotsContainer = new St.Widget({ style_class: 'dtp-dots-container', layout_manager: new Clutter.BinLayout() }); this._dtpIconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), style: getIconContainerStyle(panel.checkIfVertical()) }); this.remove_child(this._iconContainer); - + this._dtpIconContainer.add_child(this._iconContainer); if (appInfo.window) { let box = new St.BoxLayout(); - this._windowTitle = new St.Label({ - y_align: Clutter.ActorAlign.CENTER, - x_align: Clutter.ActorAlign.START, - style_class: 'overview-label' + this._windowTitle = new St.Label({ + y_align: Clutter.ActorAlign.CENTER, + x_align: Clutter.ActorAlign.START, + style_class: 'overview-label' }); - + this._updateWindowTitle(); this._updateWindowTitleStyle(); @@ -192,11 +196,12 @@ export const TaskbarAppIcon = GObject.registerClass({ } this._onAnimateAppiconHoverChanged(); + this._onAppIconHoverHighlightChanged(); this._setAppIconPadding(); this._setAppIconStyle(); this._showDots(); - this._focusWindowChangedId = global.display.connect('notify::focus-window', + this._focusWindowChangedId = global.display.connect('notify::focus-window', this._onFocusAppChanged.bind(this)); this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; @@ -207,17 +212,17 @@ export const TaskbarAppIcon = GObject.registerClass({ this._windowEnteredMonitorId = Utils.DisplayWrapper.getScreen().connect('window-entered-monitor', this.onWindowEnteredOrLeft.bind(this)); this._windowLeftMonitorId = Utils.DisplayWrapper.getScreen().connect('window-left-monitor', this.onWindowEnteredOrLeft.bind(this)); } - + this._titleWindowChangeId = 0; this._minimizedWindowChangeId = 0; } else { - this._titleWindowChangeId = this.window.connect('notify::title', + this._titleWindowChangeId = this.window.connect('notify::title', this._updateWindowTitle.bind(this)); this._minimizedWindowChangeId = this.window.connect('notify::minimized', this._updateWindowTitleStyle.bind(this)); } - + this._scrollEventId = this.connect('scroll-event', this._onMouseScroll.bind(this)); this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', @@ -227,9 +232,18 @@ export const TaskbarAppIcon = GObject.registerClass({ this._onSwitchWorkspace.bind(this)); this._hoverChangeId = this.connect('notify::hover', () => this._onAppIconHoverChanged()); - + if (!this._checkGtkVersion_cssVariables()) { + this._hoverChangeId2 = this.connect('notify::hover', () => this._onAppIconHoverChanged_GtkWorkaround()); + this._pressedChangedId = this.connect('notify::pressed', () => this._onAppIconPressedChanged_GtkWorkaround()); + } + this._dtpSettingsSignalIds = [ SETTINGS.connect('changed::animate-appicon-hover', this._onAnimateAppiconHoverChanged.bind(this)), + SETTINGS.connect('changed::animate-appicon-hover', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-hover', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-hover-background-color', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-pressed-background-color', this._onAppIconHoverHighlightChanged.bind(this)), + SETTINGS.connect('changed::highlight-appicon-hover-border-radius', this._onAppIconHoverHighlightChanged.bind(this)), SETTINGS.connect('changed::dot-position', this._settingsChangeRefresh.bind(this)), SETTINGS.connect('changed::dot-size', this._settingsChangeRefresh.bind(this)), SETTINGS.connect('changed::dot-style-focused', this._settingsChangeRefresh.bind(this)), @@ -255,8 +269,14 @@ export const TaskbarAppIcon = GObject.registerClass({ SETTINGS.connect('changed::group-apps-label-font-color-minimized', this._updateWindowTitleStyle.bind(this)), SETTINGS.connect('changed::group-apps-label-max-width', this._updateWindowTitleStyle.bind(this)), SETTINGS.connect('changed::group-apps-use-fixed-width', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-underline-unfocused', this._settingsChangeRefresh.bind(this)) - ] + SETTINGS.connect('changed::group-apps-underline-unfocused', this._settingsChangeRefresh.bind(this)), + ]; + + if (!this._checkGtkVersion_cssVariables()) { + this._dtpSettingsSignalIds += [ + SETTINGS.connect('changed::highlight-appicon-hover-border-radius', () => this._setIconStyle(this._isFocusedWindow())), + ]; + } this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); @@ -269,10 +289,11 @@ export const TaskbarAppIcon = GObject.registerClass({ // Used by TaskbarItemContainer to animate appIcons on hover getCloneButton() { - // The source of the clone is this._container, + // The source of the clone is this._dtpIconContainer, + // which contains the icon but no highlighting elements // using this.actor directly would break DnD style. let clone = new Clutter.Clone({ - source: this.child, + source: this._dtpIconContainer, x: this.child.x, y: this.child.y, width: this.child.width, height: this.child.height, pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }), @@ -293,19 +314,19 @@ export const TaskbarAppIcon = GObject.registerClass({ } shouldShowTooltip() { - if (!SETTINGS.get_boolean('show-tooltip') || + if (!SETTINGS.get_boolean('show-tooltip') || (!this.isLauncher && SETTINGS.get_boolean("show-window-previews") && this.getAppIconInterestingWindows().length > 0)) { return false; } else { - return this.hover && !this.window && - (!this._menu || !this._menu.isOpen) && + return this.hover && !this.window && + (!this._menu || !this._menu.isOpen) && (this._previewMenu.getCurrentAppIcon() !== this); } } _onAppIconHoverChanged() { - if (!SETTINGS.get_boolean('show-window-previews') || + if (!SETTINGS.get_boolean('show-window-previews') || (!this.window && !this._nWindows)) { return; } @@ -329,7 +350,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this.app.disconnect(this._stateChangedId); this._stateChangedId = 0; } - + if(this._overviewWindowDragEndId) Main.overview.disconnect(this._overviewWindowDragEndId); @@ -356,6 +377,12 @@ export const TaskbarAppIcon = GObject.registerClass({ if (this._hoverChangeId) { this.disconnect(this._hoverChangeId); } + if (this._hoverChangeId2) { + this.disconnect(this._hoverChangeId2); + } + if (this._pressedChangedId) { + this.disconnect(this._pressedChangedId); + } if (this._scrollEventId) { this.disconnect(this._scrollEventId); @@ -415,7 +442,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this.icon.createIcon = (iconSize) => this.app.create_icon_texture(2 * iconSize); this._iconIconBinActorAddedId = this.icon._iconBin.connect('child-added', () => { let size = this.icon.iconSize * Utils.getScaleFactor() - + if (this.icon._iconBin.child.mapped) { this.icon._iconBin.child.set_size(size, size); } else { @@ -438,9 +465,59 @@ export const TaskbarAppIcon = GObject.registerClass({ } } + _onAppIconHoverHighlightChanged() { + const background_color = SETTINGS.get_string('highlight-appicon-hover-background-color'); + const pressed_color = SETTINGS.get_string('highlight-appicon-pressed-background-color'); + const border_radius = SETTINGS.get_int('highlight-appicon-hover-border-radius'); + if (this._checkGtkVersion_cssVariables()) { + this._container.set_style(`--dtp-hover-background-color: ${background_color}; --dtp-hover-border-radius: ${border_radius}px; --dtp-pressed-background-color: ${pressed_color};`); + } else { + // Some trickery needed to get the same effect + const br = `border-radius: ${border_radius}px;`; + this._appicon_normalstyle = br; + this._container.set_style(this._appicon_normalstyle); + this._appicon_hoverstyle = `background-color: ${background_color}; ${br}`; + this._appicon_pressedstyle = `background-color: ${pressed_color}; ${br}`; + } + if (SETTINGS.get_boolean('highlight-appicon-hover')) { + this._container.remove_style_class_name('no-highlight'); + } else { + this._container.add_style_class_name('no-highlight'); + this._appicon_normalstyle = ''; + this._appicon_hoverstyle = ''; + this._appicon_pressedstyle = ''; + } + } + + _checkGtkVersion_cssVariables() { + // Support for CSS variables will be added in GTK 4.16 + return Gtk.get_major_version() >= 5 || + (Gtk.get_major_version() == 4 && Gtk.get_minor_version() >= 16); + } + + _onAppIconHoverChanged_GtkWorkaround() { + if (this.hover && this._appicon_hoverstyle) { + this._container.set_style(this._appicon_hoverstyle); + } else if(this._appicon_normalstyle) { + this._container.set_style(this._appicon_normalstyle); + } else { + this._container.set_style(''); + } + } + + _onAppIconPressedChanged_GtkWorkaround() { + if (this.pressed && this._appicon_pressedstyle) { + this._container.set_style(this._appicon_pressedstyle); + } else if(this._appicon_normalstyle) { + this._container.set_style(this._appicon_normalstyle); + } else { + this._container.set_style(''); + } + } + _onMouseScroll(actor, event) { let scrollAction = SETTINGS.get_string('scroll-icon-action'); - + if (scrollAction === 'PASS_THROUGH') { return this.dtpPanel._onPanelMouseScroll(actor, event); } else if (scrollAction === 'NOTHING' || (!this.window && !this._nWindows)) { @@ -458,7 +535,7 @@ export const TaskbarAppIcon = GObject.registerClass({ Utils.activateSiblingWindow(windows, direction, this.window); } } - + _showDots() { // Just update style if dots already exist if (this._focusedDots && this._unfocusedDots) { @@ -467,7 +544,7 @@ export const TaskbarAppIcon = GObject.registerClass({ } if (!this._isGroupApps) { - this._focusedDots = new St.Widget({ + this._focusedDots = new St.Widget({ layout_manager: new Clutter.BinLayout(), x_expand: true, y_expand: true, visible: false @@ -478,23 +555,23 @@ export const TaskbarAppIcon = GObject.registerClass({ this.disconnect(mappedId); }); } else { - this._focusedDots = new St.DrawingArea(), + this._focusedDots = new St.DrawingArea(), this._unfocusedDots = new St.DrawingArea(); - + this._focusedDots.connect('repaint', () => { if (!this._dashItemContainer.animatingOut) // don't draw and trigger more animations if the icon is in the middle of // being removed from the panel this._drawRunningIndicator(this._focusedDots, SETTINGS.get_string('dot-style-focused'), true); }); - + this._unfocusedDots.connect('repaint', () => { if (!this._dashItemContainer.animatingOut) this._drawRunningIndicator(this._unfocusedDots, SETTINGS.get_string('dot-style-unfocused'), false); }); - + this._dotsContainer.add_child(this._unfocusedDots); - + this._updateWindows(); this._timeoutsHandler.add([T3, 0, () => { @@ -512,7 +589,7 @@ export const TaskbarAppIcon = GObject.registerClass({ let sizeProp = isHorizontalDots ? 'width' : 'height'; let focusedDotStyle = SETTINGS.get_string('dot-style-focused'); let unfocusedDotStyle = SETTINGS.get_string('dot-style-unfocused'); - + this._focusedIsWide = this._isWideDotStyle(focusedDotStyle); this._unfocusedIsWide = this._isWideDotStyle(unfocusedDotStyle); @@ -558,7 +635,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._windowTitle.set_style('font-size: ' + SETTINGS.get_int('group-apps-label-font-size') * fontScale + 'px;' + 'font-weight: ' + fontWeight + ';' + - (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + + (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + 'color: ' + fontColor); } } @@ -566,7 +643,7 @@ export const TaskbarAppIcon = GObject.registerClass({ _updateWindowTitle() { if (this._windowTitle.text != this.window.title) { this._windowTitle.text = (this.window.title ? this.window.title : this.app.get_name()).replace(/\r?\n|\r/g, '').trim(); - + if (this._focusedDots) { this._displayProperIndicator(); } @@ -576,8 +653,8 @@ export const TaskbarAppIcon = GObject.registerClass({ _setIconStyle(isFocused) { let inlineStyle = 'margin: 0;'; - if(SETTINGS.get_boolean('focus-highlight') && - this._checkIfFocusedApp() && !this.isLauncher && + if(SETTINGS.get_boolean('focus-highlight') && + this._checkIfFocusedApp() && !this.isLauncher && (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { let focusedDotStyle = SETTINGS.get_string('dot-style-focused'); let pos = SETTINGS.get_string('dot-position'); @@ -585,7 +662,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if(!this.window) { let containerWidth = this._dtpIconContainer.get_width() / Utils.getScaleFactor(); - let backgroundSize = containerWidth + "px " + + let backgroundSize = containerWidth + "px " + (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; if (focusedDotStyle == DOT_STYLE.CILIORA || focusedDotStyle == DOT_STYLE.SEGMENTED) @@ -598,16 +675,19 @@ export const TaskbarAppIcon = GObject.registerClass({ bgSvg += (this.dtpPanel.checkIfVertical() ? '_2' : '_3'); } - inlineStyle += "background-image: url('" + EXTENSION_PATH + bgSvg + ".svg');" + + inlineStyle += "background-image: url('" + EXTENSION_PATH + bgSvg + ".svg');" + "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + "background-size: " + backgroundSize; } } let highlightColor = this._getFocusHighlightColor(); - inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, SETTINGS.get_int('focus-highlight-opacity') * 0.01); + inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, SETTINGS.get_int('focus-highlight-opacity') * 0.01) + ";"; + if (!this._checkGtkVersion_cssVariables()) { + inlineStyle += this._appicon_normalstyle; + } } - + if(this._dotsContainer.get_style() != inlineStyle) { this._dotsContainer.set_style(inlineStyle); } @@ -618,17 +698,30 @@ export const TaskbarAppIcon = GObject.registerClass({ } _checkIfMonitorHasFocus() { - return global.display.focus_window && + return global.display.focus_window && (!SETTINGS.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. - !SETTINGS.get_boolean('isolate-monitors') || + !SETTINGS.get_boolean('isolate-monitors') || global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); } _setAppIconPadding() { - let padding = getIconPadding(this.dtpPanel.monitor.index); - let margin = SETTINGS.get_int('appicon-margin'); + const padding = getIconPadding(this.dtpPanel.monitor.index); + const margin = SETTINGS.get_int('appicon-margin'); + const margin_todesktop = SETTINGS.get_int('appicon-margin-todesktop'); + const margin_toscreenborder = SETTINGS.get_int('appicon-margin-toscreenborder'); - this.set_style('padding:' + (this.dtpPanel.checkIfVertical() ? margin + 'px 0' : '0 ' + margin + 'px;')); + let margin_style = ''; + const panelPosition = this.dtpPanel.getPosition(); + if (panelPosition == St.Side.TOP) { + margin_style = `${margin_toscreenborder}px ${margin}px ${margin_todesktop}px ${margin}px`; + } else if (panelPosition == St.Side.RIGHT) { + margin_style = `${margin}px ${margin_toscreenborder}px ${margin}px ${margin_todesktop}px`; + } else if (panelPosition == St.Side.LEFT) { + margin_style = `${margin}px ${margin_todesktop}px ${margin}px ${margin_toscreenborder}px`; + } else { + margin_style = `${margin_todesktop}px ${margin}px ${margin_toscreenborder}px ${margin}px`; + } + this.set_style(`padding: ${margin_style};`); this._iconContainer.set_style('padding: ' + padding + 'px;'); } @@ -710,7 +803,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if(!this._isGroupApps) { if (this.window && (SETTINGS.get_boolean('group-apps-underline-unfocused') || isFocused)) { let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; - + this._focusedDots.set_size(0, 0); this._focusedDots[isHorizontalDots ? 'height' : 'width'] = this._getRunningIndicatorSize(); @@ -727,11 +820,11 @@ export const TaskbarAppIcon = GObject.registerClass({ let newFocusedDotsOpacity = 0; let newUnfocusedDotsSize = 0; let newUnfocusedDotsOpacity = 0; - + isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); this._timeoutsHandler.add([T6, 0, () => { - if(isFocused) + if(isFocused) this.add_style_class_name('focused'); else this.remove_style_class_name('focused'); @@ -744,7 +837,7 @@ export const TaskbarAppIcon = GObject.registerClass({ newFocusedDotsSize = this._containerSize; newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; } - + if(this._unfocusedIsWide) { newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? this._containerSize : 0; newUnfocusedDotsOpacity = 255; @@ -752,7 +845,7 @@ export const TaskbarAppIcon = GObject.registerClass({ newUnfocusedDotsSize = this._containerSize; newUnfocusedDotsOpacity = (!isFocused && this._nWindows > 0) ? 255 : 0; } - + // Only animate if... // animation is enabled in settings // AND (going from a wide style to a narrow style indicator or vice-versa @@ -770,10 +863,10 @@ export const TaskbarAppIcon = GObject.registerClass({ _animateDotDisplay(dots, newSize, otherDots, newOtherOpacity, sizeProp, duration) { Utils.stopAnimations(dots) - let tweenOpts = { + let tweenOpts = { time: duration, transition: 'easeInOutCubic', - onComplete: () => { + onComplete: () => { if(newOtherOpacity > 0) otherDots.opacity = newOtherOpacity; } @@ -789,7 +882,7 @@ export const TaskbarAppIcon = GObject.registerClass({ _isFocusedWindow() { let focusedWindow = global.display.focus_window; - + while (focusedWindow) { if (focusedWindow == this.window) { return true; @@ -802,9 +895,9 @@ export const TaskbarAppIcon = GObject.registerClass({ } _isWideDotStyle(dotStyle) { - return dotStyle == DOT_STYLE.SEGMENTED || - dotStyle == DOT_STYLE.CILIORA || - dotStyle == DOT_STYLE.METRO || + return dotStyle == DOT_STYLE.SEGMENTED || + dotStyle == DOT_STYLE.CILIORA || + dotStyle == DOT_STYLE.METRO || dotStyle == DOT_STYLE.SOLID; } @@ -812,7 +905,7 @@ export const TaskbarAppIcon = GObject.registerClass({ // This is an attempt to determine if the theme is providing their own // running indicator by way of a border image on the icon, for example in // the theme Ciliora - return (this.icon.get_stage() && + return (this.icon.get_stage() && this.icon.get_theme_node().get_border_image()); } @@ -875,23 +968,23 @@ export const TaskbarAppIcon = GObject.registerClass({ //ungrouped applications behaviors switch (buttonAction) { case 'RAISE': case 'CYCLE': case 'CYCLE-MIN': case 'MINIMIZE': case 'TOGGLE-SHOWPREVIEW': case 'TOGGLE-CYCLE': - if (!Main.overview._shown && - (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && + if (!Main.overview._shown && + (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { this.window.minimize(); } else { Main.activateWindow(this.window); } - + break; - + case "LAUNCH": this._launchNewInstance(); break; case "QUIT": this.window.delete(global.get_current_time()); - break; + break; } } else { //grouped application behaviors @@ -902,11 +995,11 @@ export const TaskbarAppIcon = GObject.registerClass({ case "RAISE": activateAllWindows(this.app, monitor); break; - + case "LAUNCH": this._launchNewInstance(); break; - + case "MINIMIZE": // In overview just activate the app, unless the acion is explicitely // requested with a keyboard modifier @@ -925,10 +1018,10 @@ export const TaskbarAppIcon = GObject.registerClass({ else this.app.activate(); break; - + case "CYCLE": if (!Main.overview._shown){ - if (appHasFocus) + if (appHasFocus) cycleThroughWindows(this.app, false, false, monitor); else { activateFirstWindow(this.app, monitor); @@ -939,7 +1032,7 @@ export const TaskbarAppIcon = GObject.registerClass({ break; case "CYCLE-MIN": if (!Main.overview._shown){ - if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) + if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) cycleThroughWindows(this.app, false, true, monitor); else { activateFirstWindow(this.app, monitor); @@ -964,10 +1057,10 @@ export const TaskbarAppIcon = GObject.registerClass({ minimizeWindow(this.app, true, monitor); } else if (previewedAppIcon != this) { this._previewMenu.open(this); - } - + } + this.emit('sync-tooltip'); - } + } } else this.app.activate(); @@ -981,7 +1074,7 @@ export const TaskbarAppIcon = GObject.registerClass({ activateFirstWindow(this.app, monitor); } else { cycleThroughWindows(this.app, false, false, monitor); - } + } } else this.app.activate(); @@ -1003,7 +1096,7 @@ export const TaskbarAppIcon = GObject.registerClass({ _launchNewInstance(ctrlPressed) { let maybeAnimate = () => SETTINGS.get_boolean('animate-window-launch') && this.animateLaunch() - if ((ctrlPressed || this.app.state == Shell.AppState.RUNNING) && + if ((ctrlPressed || this.app.state == Shell.AppState.RUNNING) && this.app.can_open_new_window()) { maybeAnimate(); this.app.open_new_window(-1); @@ -1021,12 +1114,12 @@ export const TaskbarAppIcon = GObject.registerClass({ _updateWindows() { let windows = [this.window]; - + if (!this.window) { windows = this.getAppIconInterestingWindows(); - + this._nWindows = windows.length; - + for (let i = 1; i <= MAX_INDICATORS; i++){ let className = 'running'+i; if(i != this._nWindows) @@ -1065,7 +1158,7 @@ export const TaskbarAppIcon = GObject.registerClass({ } } else if(SETTINGS.get_boolean('dot-color-override')) { let dotColorSettingPrefix = 'dot-color-'; - + if(!isFocused && SETTINGS.get_boolean('dot-color-unfocused-different')) dotColorSettingPrefix = 'dot-color-unfocused-'; @@ -1164,7 +1257,7 @@ export const TaskbarAppIcon = GObject.registerClass({ dist = i * dashLength + i * spacing; cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0, dashLength, size] : [0, dist, size, dashLength])); }; - + switch (type) { case DOT_STYLE.CILIORA: spacing = size; @@ -1226,7 +1319,7 @@ export const TaskbarAppIcon = GObject.registerClass({ } cr.fill(); } - + cr.$dispose(); } @@ -1287,7 +1380,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if (source == Main.xdndHandler) { this._previewMenu.close(true); } - + return DND.DragMotionResult.CONTINUE; } @@ -1354,7 +1447,7 @@ export function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { if (recentlyClickedAppLoopId > 0) GLib.Source.remove(recentlyClickedAppLoopId); - + recentlyClickedAppLoopId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, MEMORY_TIME, resetRecentlyClickedApp); @@ -1377,7 +1470,7 @@ export function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { recentlyClickedAppIndex++; } let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; - + if(recentlyClickedAppWindows[index] === "MINIMIZE") minimizeWindow(app, true, monitor); else @@ -1407,8 +1500,8 @@ export function closeAllWindows(app, monitor) { // nautilus desktop window. export function getInterestingWindows(app, monitor, isolateMonitors) { let windows = ( - app ? - app.get_windows() : + app ? + app.get_windows() : global.get_window_actors().map(wa => wa.get_meta_window()) ).filter(w => !w.skip_taskbar); @@ -1416,7 +1509,7 @@ export function getInterestingWindows(app, monitor, isolateMonitors) { // that are not in the current workspace or on the same monitor as the appicon if (SETTINGS.get_boolean('isolate-workspaces')) windows = windows.filter(function(w) { - return w.get_workspace() && + return w.get_workspace() && w.get_workspace() == Utils.getCurrentWorkspace(); }); @@ -1425,7 +1518,7 @@ export function getInterestingWindows(app, monitor, isolateMonitors) { return w.get_monitor() == monitor.index; }); } - + return windows; } @@ -1486,7 +1579,7 @@ export class TaskbarSecondaryMenu extends AppMenu.AppMenu { } updateQuitText() { - let count = this.sourceActor.window ? 1 : + let count = this.sourceActor.window ? 1 : getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor).length; if ( count > 0) { @@ -1502,17 +1595,17 @@ export class TaskbarSecondaryMenu extends AppMenu.AppMenu { _quitFromTaskbar() { let time = global.get_current_time() - let windows = + let windows = this.sourceActor.window ? // ungrouped applications - [this.sourceActor.window] : + [this.sourceActor.window] : getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor) - + if (windows.length == this._app.get_windows().length) this._app.request_quit() GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { windows.forEach((w) => !!w.get_compositor_private() && w.delete(time++)); - + return GLib.SOURCE_REMOVE; }); } @@ -1577,13 +1670,13 @@ export function ItemShowLabel() { this.label.set_position(Math.round(x), Math.round(y)); - let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; - + let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; + if (duration > 1) { duration /= 1000; } - - Utils.animate(this.label, { + + Utils.animate(this.label, { opacity: 255, time: duration, transition: 'easeOutQuad', @@ -1657,10 +1750,10 @@ export const ShowAppsIconWrapper = class extends EventEmitter { this._changedAppIconPaddingId = SETTINGS.connect('changed::appicon-padding', () => this.setShowAppsPadding()); this._changedAppIconSidePaddingId = SETTINGS.connect('changed::show-apps-icon-side-padding', () => this.setShowAppsPadding()); - + this.setShowAppsPadding(); } - + _onButtonPress(_actor, event) { let button = event.get_button(); if (button == 1) { @@ -1736,7 +1829,7 @@ export const ShowAppsIconWrapper = class extends EventEmitter { } shouldShowTooltip() { - return SETTINGS.get_boolean('show-tooltip') && + return SETTINGS.get_boolean('show-tooltip') && (this.actor.hover && (!this._menu || !this._menu.isOpen)); } @@ -1863,12 +1956,12 @@ export const MyShowAppsIconMenu = class extends PopupMenu.PopupMenu { return null; } - + _appendList(commandList, titleList) { if (commandList.length != titleList.length) { return; } - + for (let entry = 0; entry < commandList.length; entry++) { this._appendItem({ title: titleList[entry], diff --git a/panel.js b/panel.js index d025b9b..a0bfdac 100644 --- a/panel.js +++ b/panel.js @@ -17,13 +17,13 @@ * Credits: * This file is based on code from the Dash to Dock extension by micheleg * and code from the Taskbar extension by Zorin OS - * + * * Code to re-anchor the panel was taken from Thoma5 BottomPanel: * https://github.com/Thoma5/gnome-shell-extension-bottompanel - * + * * Pattern for moving clock based on Frippery Move Clock by R M Yorston * http://frippery.org/extensions/ - * + * * Some code was also adapted from the upstream Gnome Shell source code. */ @@ -85,7 +85,7 @@ export const Panel = GObject.registerClass({ // so in this case use isPrimary to get the panel on the primary dtp monitor, which // might be different from the system's primary monitor. this.isStandalone = isStandalone; - this.isPrimary = !isStandalone || (SETTINGS.get_boolean('stockgs-keep-top-panel') && + this.isPrimary = !isStandalone || (SETTINGS.get_boolean('stockgs-keep-top-panel') && monitor == panelManager.dtpPrimaryMonitor); this._sessionStyle = null; @@ -144,20 +144,20 @@ export const Panel = GObject.registerClass({ }); } - // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of + // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of // its behavior is handled by the taskbar, but its positioning is done at the panel level this.showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this); this.panel.add_child(this.showAppsIconWrapper.realShowAppsIcon); this.panel._delegate = this; - + this.add_child(this.panel); if (Main.panel._onButtonPress || Main.panel._tryDragWindow) { this._signalsHandler.add([ - this.panel, + this.panel, [ - 'button-press-event', + 'button-press-event', 'touch-event' ], this._onButtonPress.bind(this) @@ -167,7 +167,7 @@ export const Panel = GObject.registerClass({ if (Main.panel._onKeyPress) { this._signalsHandler.add([this.panel, 'key-press-event', Main.panel._onKeyPress.bind(this)]); } - + Main.ctrlAltTabManager.addGroup(this, _("Top Bar")+" "+ monitor.index, 'focus-top-bar-symbolic', { sortGroup: CtrlAltTab.SortGroup.TOP }); } @@ -180,7 +180,7 @@ export const Panel = GObject.registerClass({ } this.geom = this.getGeometry(); - + this._setPanelPosition(); if (!this.isStandalone) { @@ -209,13 +209,13 @@ export const Panel = GObject.registerClass({ }; this.dynamicTransparency = new Transparency.DynamicTransparency(this); - + this.taskbar = new Taskbar.Taskbar(this); this.panel.add_child(this.taskbar.actor); this._setShowDesktopButton(true); - + this._setAllocationMap(); this.panel.add_style_class_name('dashtopanelMainPanel ' + this.getOrientation()); @@ -225,14 +225,14 @@ export const Panel = GObject.registerClass({ this._signalsHandler.add( // this is to catch changes to the theme or window scale factor [ - Utils.getStageTheme(), - 'changed', + Utils.getStageTheme(), + 'changed', () => (this._resetGeometry(), this._setShowDesktopButtonStyle()), ], [ // sync hover after a popupmenu is closed this.taskbar, - 'menu-closed', + 'menu-closed', () => this.panel.sync_hover() ], [ @@ -255,10 +255,10 @@ export const Panel = GObject.registerClass({ ], [ this.statusArea.activities, - 'captured-event', + 'captured-event', (actor, e) => { if (e.type() == Clutter.EventType.BUTTON_PRESS || e.type() == Clutter.EventType.TOUCH_BEGIN) { - //temporarily use as primary the monitor on which the activities btn was clicked + //temporarily use as primary the monitor on which the activities btn was clicked this.panelManager.setFocusedMonitor(this.monitor); } } @@ -302,7 +302,7 @@ export const Panel = GObject.registerClass({ if (this.statusArea.dateMenu) { this._formatVerticalClock(); - + this._signalsHandler.add([ this.statusArea.dateMenu._clock, 'notify::clock', @@ -324,7 +324,7 @@ export const Panel = GObject.registerClass({ this._timeoutsHandler.destroy(); this._signalsHandler.destroy(); - + this.panel.remove_child(this.taskbar.actor); if (this.intellihide) { @@ -366,14 +366,14 @@ export const Panel = GObject.registerClass({ ['activities', systemMenuName, 'dateMenu'].forEach(b => { let container = this.statusArea[b].container; let originalParent = container._dtpOriginalParent; - + this.panel.remove_child(container); originalParent && originalParent.insert_child_at_index( - container, + container, Math.min(container._dtpOriginalIndex, originalParent.get_children().length - 1) ); - + delete container._dtpOriginalParent; delete container._dtpOriginalIndex; }); @@ -384,7 +384,7 @@ export const Panel = GObject.registerClass({ delete Utils.getIndicators(this.statusArea[systemMenuName]._volumeOutput)._dtpIgnoreScroll; this._injectionManager.clear(); - + this.panel._delegate = this.panel; } else { this._removePanelMenu('dateMenu'); @@ -405,16 +405,16 @@ export const Panel = GObject.registerClass({ } else if (position == Pos.BOTTOM) { return St.Side.BOTTOM; } - + return St.Side.LEFT; } checkIfVertical() { let position = this.getPosition(); - + return (position == St.Side.LEFT || position == St.Side.RIGHT); } - + getOrientation() { return (this.checkIfVertical() ? 'vertical' : 'horizontal'); } @@ -452,7 +452,7 @@ export const Panel = GObject.registerClass({ currentPosition = Pos.STACKED_BR; } - if (!previousPosition || + if (!previousPosition || (previousPosition == Pos.STACKED_TL && currentPosition != Pos.STACKED_TL) || (previousPosition != Pos.STACKED_BR && currentPosition == Pos.STACKED_BR) || (isCentered && previousPosition != currentPosition && previousPosition != Pos.STACKED_BR)) { @@ -486,6 +486,8 @@ export const Panel = GObject.registerClass({ SETTINGS, [ 'changed::panel-sizes', + 'changed::appicon-margin-todesktop', + 'changed::appicon-margin-toscreenborder', 'changed::group-apps' ], () => this._resetGeometry() @@ -514,7 +516,7 @@ export const Panel = GObject.registerClass({ 'changed::clock-format', () => { this._clockFormat = null; - + if (isVertical) { this._formatVerticalClock(); } @@ -544,7 +546,7 @@ export const Panel = GObject.registerClass({ container.insert_child_at_index(this.statusArea[propName].container, 0); } } - + _removePanelMenu(propName) { if (this.statusArea[propName]) { let parent = this.statusArea[propName].container.get_parent(); @@ -555,8 +557,8 @@ export const Panel = GObject.registerClass({ //calling this.statusArea[propName].destroy(); is buggy for now, gnome-shell never //destroys those panel menus... - //since we can't destroy the menu (hence properly disconnect its signals), let's - //store it so the next time a panel needs one of its kind, we can reuse it instead + //since we can't destroy the menu (hence properly disconnect its signals), let's + //store it so the next time a panel needs one of its kind, we can reuse it instead //of creating a new one let panelMenu = this.statusArea[propName]; @@ -619,7 +621,7 @@ export const Panel = GObject.registerClass({ let x = 0, y = 0; let w = 0, h = 0; - const panelSize = PanelSettings.getPanelSize(SETTINGS, this.monitor.index); + const panelSize = PanelSettings.getPanelSize(SETTINGS, this.monitor.index) + SETTINGS.get_int('appicon-margin-todesktop') + SETTINGS.get_int('appicon-margin-toscreenborder'); this.dtpSize = panelSize * scaleFactor; if (SETTINGS.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.primaryMonitor == this.monitor) { @@ -660,7 +662,7 @@ export const Panel = GObject.registerClass({ if (this.checkIfVertical()) { let viewHeight = this.monitor.height - gsTopPanelOffset; - + if (anchor === Pos.MIDDLE) { anchorPlaceOnMonitor = (viewHeight - h) / 2; } else if (anchor === Pos.END) { @@ -681,7 +683,7 @@ export const Panel = GObject.registerClass({ } return { - x, y, + x, y, w, h, lrPadding, tbPadding, @@ -691,11 +693,11 @@ export const Panel = GObject.registerClass({ _setAllocationMap() { this.allocationMap = {}; - let setMap = (name, actor) => this.allocationMap[name] = { + let setMap = (name, actor) => this.allocationMap[name] = { actor: actor, - box: new Clutter.ActorBox() + box: new Clutter.ActorBox() }; - + setMap(Pos.SHOW_APPS_BTN, this.showAppsIconWrapper.realShowAppsIcon); setMap(Pos.ACTIVITIES_BTN, this.statusArea.activities ? this.statusArea.activities.container : 0); setMap(Pos.LEFT_BOX, this._leftBox); @@ -772,19 +774,19 @@ export const Panel = GObject.registerClass({ brSize += refGroup.size; } } - + if (group.isCentered) { availableSize -= Math.max(tlSize, brSize) * 2; } else { availableSize -= tlSize + brSize; } - + if (availableSize < group.size) { expandable.natSize -= (group.size - availableSize) * (group.isCentered && !Pos.checkIfCentered(expandable.position) ? .5 : 1); assignGroupSize(group, true); } } - + if (group.isCentered) { startPosition = tlLimit + (brLimit - tlLimit - group.size) * .5; } else if (group.position == Pos.STACKED_BR) { @@ -833,9 +835,9 @@ export const Panel = GObject.registerClass({ let prevGroup = this._elementGroups[i - 1]; let nextGroup = this._elementGroups[i + 1]; - let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : + let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : centeredMonitorGroup && group.index > centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c2] : panelAlloc[this.varCoord.c1]; - let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : + let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : centeredMonitorGroup && group.index < centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c1] : panelAlloc[this.varCoord.c2]; if (group.position == Pos.STACKED_TL) { @@ -860,7 +862,7 @@ export const Panel = GObject.registerClass({ // styles for theming Object.keys(St.Side).forEach(p => { let cssName = 'dashtopanel' + p.charAt(0) + p.slice(1).toLowerCase(); - + this.panel[(St.Side[p] == this.geom.position ? 'add' : 'remove') + '_style_class_name'](cssName); }); @@ -892,7 +894,7 @@ export const Panel = GObject.registerClass({ } else { const targetActor = global.stage.get_event_actor(event); - if (Main.modalCount > 0 || targetActor != actor || + if (Main.modalCount > 0 || targetActor != actor || (!isPress && type != Clutter.EventType.TOUCH_BEGIN) || (isPress && button != 1)) { return Clutter.EVENT_PROPAGATE; @@ -956,7 +958,7 @@ export const Panel = GObject.registerClass({ actor.vertical = isVertical; } else if ( actor != this.statusArea.appMenu && - ((actor._delegate || actor) instanceof PanelMenu.ButtonBox || actor == this.statusArea.quickSettings) + ((actor._delegate || actor) instanceof PanelMenu.ButtonBox || actor == this.statusArea.quickSettings) ) { let child = actor.get_first_child(); @@ -983,7 +985,7 @@ export const Panel = GObject.registerClass({ }; _set(actor, false); - + if (isVertical) _set(actor, isVertical); } @@ -994,7 +996,7 @@ export const Panel = GObject.registerClass({ delete actor._dtpVisibleId; delete actor._dtpDestroyId; - + this._unmappedButtons.splice(this._unmappedButtons.indexOf(actor), 1); } @@ -1008,16 +1010,16 @@ export const Panel = GObject.registerClass({ let setClockText = (text, useTimeSeparator) => { let stacks = text instanceof Array; let separator = `\n ${useTimeSeparator ? '‧‧' : '—' } \n`; - + clockText.set_text((stacks ? text.join(separator) : text).trim()); clockText.set_use_markup(stacks); clockText.get_allocation_box(); - + return !clockText.get_layout().is_ellipsized(); }; if (clockText.ellipsize == Pango.EllipsizeMode.NONE) { - //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back + //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back clockText.ellipsize = Pango.EllipsizeMode.END; } @@ -1029,8 +1031,8 @@ export const Panel = GObject.registerClass({ datetimeParts = [datetimeParts.join(' '), time]; } - if (!setClockText(datetime) && - !setClockText(datetimeParts) && + if (!setClockText(datetime) && + !setClockText(datetimeParts) && !setClockText(time)) { let timeParts = time.split('∶'); @@ -1078,7 +1080,7 @@ export const Panel = GObject.registerClass({ }]); } }); - + this._showDesktopButton.connect('leave-event', () => { this._showDesktopButton.remove_style_class_name(this._getBackgroundBrightness() ? 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); @@ -1136,7 +1138,7 @@ export const Panel = GObject.registerClass({ time: time, transition: 'easeOutQuad' }; - + Utils.animateWindowOpacity(w.get_compositor_private(), tweenOpts); } }); @@ -1168,14 +1170,14 @@ export const Panel = GObject.registerClass({ windows.forEach(function(w) { w.minimize(); }); - + this._restoreWindowList = windows; this._timeoutsHandler.add([T5, 20, () => this._signalsHandler.addWithLabel( - label, + label, [ - tracker, - 'notify::focus-app', + tracker, + 'notify::focus-app', () => this._restoreWindowList = null ] )]); @@ -1208,7 +1210,7 @@ export const Panel = GObject.registerClass({ showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = null; } else if (direction && scrollAction === 'CYCLE_WINDOWS') { let windows = this.taskbar.getAppInfos().reduce((ws, appInfo) => ws.concat(appInfo.windows), []); - + Utils.activateSiblingWindow(windows, direction); } else if (scrollAction === 'CHANGE_VOLUME' && !event.is_pointer_emulated()) { let proto = Volume.OutputIndicator.prototype; diff --git a/prefs.js b/prefs.js index d2337c2..2746ef4 100644 --- a/prefs.js +++ b/prefs.js @@ -160,7 +160,7 @@ const Preferences = class { this._builder.set_scope(new BuilderScope(this)); this._settings = settings; this._path = path; - + this._metadata = ExtensionPreferences.lookupByURL(import.meta.url).metadata; this._builder.set_translation_domain(this._metadata['gettext-domain']); @@ -168,6 +168,7 @@ const Preferences = class { // dialogs this._builder.add_from_file(this._path + '/ui/BoxAnimateAppIconHoverOptions.ui'); + this._builder.add_from_file(this._path + '/ui/BoxHighlightAppIconHoverOptions.ui'); this._builder.add_from_file(this._path + '/ui/BoxDotOptions.ui'); this._builder.add_from_file(this._path + '/ui/BoxShowDesktopOptions.ui'); this._builder.add_from_file(this._path + '/ui/BoxDynamicOpacityOptions.ui'); @@ -222,6 +223,8 @@ const Preferences = class { this._tray_size_timeout = 0; this._leftbox_size_timeout = 0; this._appicon_margin_timeout = 0; + this._appicon_margin_todesktop_timeout = 0; + this._appicon_margin_toscreenborder_timeout = 0; this._appicon_padding_timeout = 0; this._opacity_timeout = 0; this._tray_padding_timeout = 0; @@ -377,7 +380,7 @@ const Preferences = class { _displayPanelPositionsForMonitor(monitorIndex) { let taskbarListBox = this._builder.get_object('taskbar_display_listbox'); - + while(taskbarListBox.get_first_child()) { taskbarListBox.remove(taskbarListBox.get_first_child()); @@ -403,7 +406,7 @@ const Preferences = class { }); child = child.get_next_sibling(); } - + monitors.forEach(m => panelElementPositionsSettings[m] = newPanelElementPositions); this._settings.set_string('panel-element-positions', JSON.stringify(panelElementPositionsSettings)); }; @@ -462,7 +465,7 @@ const Preferences = class { if (Pos.optionDialogFunctions[el.element]) { let cogImg = new Gtk.Image({ icon_name: 'emblem-system-symbolic' }); let optionsBtn = new Gtk.Button({ tooltip_text: _('More options') }); - + optionsBtn.get_style_context().add_class('circular'); optionsBtn.set_child(cogImg); grid.attach(optionsBtn, 2, 0, 1, 1); @@ -484,7 +487,7 @@ const Preferences = class { _createPreferencesDialog(title, content, reset_function = null) { let dialog; - + dialog = new Gtk.Dialog({ title: title, transient_for: this.notebook.get_root(), use_header_bar: true, @@ -572,7 +575,7 @@ const Preferences = class { _showDesktopButtonOptions() { let box = this._builder.get_object('box_show_showdesktop_options'); - + let dialog = this._createPreferencesDialog(_('Show Desktop options'), box, () => { // restore default settings @@ -621,6 +624,14 @@ const Preferences = class { .set_format_value_func((scale, value) => { return value + ' px'; }); + this._builder.get_object('appicon_margin_todesktop_scale') + .set_format_value_func((scale, value) => { + return value + ' px'; + }); + this._builder.get_object('appicon_margin_toscreenborder_scale') + .set_format_value_func((scale, value) => { + return value + ' px'; + }); this._builder.get_object('appicon_padding_scale') .set_format_value_func((scale, value) => { @@ -684,6 +695,12 @@ const Preferences = class { .set_format_value_func((scale, value) => { return ngettext("%d icon", "%d icons", value).format(value); }); + + // highlight appicon on hover dialog + this._builder.get_object('highlight_appicon_borderradius') + .set_format_value_func((scale, value) => { + return value + ' px'; + }); } _bindSettings() { @@ -846,7 +863,7 @@ const Preferences = class { this._builder.get_object('grid_dot_color'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('dot-color-override', this._builder.get_object('dot_color_unfocused_box'), 'sensitive', @@ -856,7 +873,7 @@ const Preferences = class { this._builder.get_object('grid_dot_color_unfocused'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { let rgba = new Gdk.RGBA(); rgba.parse(this._settings.get_string('dot-color-' + i)); @@ -927,7 +944,7 @@ const Preferences = class { this._settings.connect('changed::panel-positions', () => this._updateVerticalRelatedOptions()); this._updateVerticalRelatedOptions(); - + for (let i = 0; i < this.monitors.length; ++i) { //the gnome-shell primary index is the first one in the "available-monitors" setting let label = !i ? _('Primary monitor') : _('Monitor ') + (i + 1); @@ -935,7 +952,7 @@ const Preferences = class { this._builder.get_object('multimon_primary_combo').append_text(label); this._builder.get_object('taskbar_position_monitor_combo').append_text(label); } - + this._builder.get_object('multimon_primary_combo').set_active(dtpPrimaryMonitorIndex); this._builder.get_object('taskbar_position_monitor_combo').set_active(dtpPrimaryMonitorIndex); @@ -1110,7 +1127,7 @@ const Preferences = class { this._builder.get_object('trans_options_distance_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('trans-dynamic-distance', widget.get_value()); }); - + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); this._builder.get_object('trans_options_min_opacity_spinbutton').connect('value-changed', (widget) => { this._settings.set_double('trans-dynamic-anim-target', widget.get_value() * 0.01); @@ -1143,7 +1160,7 @@ const Preferences = class { dialog.set_default_size(1, 1); }); - + this._settings.bind('desktop-line-use-custom-color', this._builder.get_object('override_show_desktop_line_color_switch'), 'active', @@ -1153,7 +1170,7 @@ const Preferences = class { this._builder.get_object('override_show_desktop_line_color_colorbutton'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + rgba.parse(this._settings.get_string('desktop-line-custom-color')); this._builder.get_object('override_show_desktop_line_color_colorbutton').set_rgba(rgba); this._builder.get_object('override_show_desktop_line_color_colorbutton').connect('color-set', (button) => { @@ -1191,7 +1208,7 @@ const Preferences = class { this._settings.bind('intellihide-use-pressure', this._builder.get_object('intellihide_use_pressure_switch'), 'active', - Gio.SettingsBindFlags.DEFAULT); + Gio.SettingsBindFlags.DEFAULT); this._settings.bind('intellihide-use-pressure', this._builder.get_object('intellihide_use_pressure_options'), @@ -1268,7 +1285,7 @@ const Preferences = class { this._settings.set_value('intellihide-pressure-threshold', this._settings.get_default_value('intellihide-pressure-threshold')); this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); - + this._settings.set_value('intellihide-pressure-time', this._settings.get_default_value('intellihide-pressure-time')); this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); @@ -1340,7 +1357,7 @@ const Preferences = class { this._builder.get_object('multimon_multi_show_favorites_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('show-favorites', this._builder.get_object('multimon_multi_show_favorites_switch'), 'sensitive', @@ -1349,7 +1366,7 @@ const Preferences = class { this._settings.bind('show-running-apps', this._builder.get_object('show_runnning_apps_switch'), 'active', - Gio.SettingsBindFlags.DEFAULT); + Gio.SettingsBindFlags.DEFAULT); this._setPreviewTitlePosition(); @@ -1378,7 +1395,7 @@ const Preferences = class { this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); this._settings.set_value('preview-use-custom-opacity', this._settings.get_default_value('preview-use-custom-opacity')); - + this._settings.set_value('window-preview-use-custom-icon-size', this._settings.get_default_value('window-preview-use-custom-icon-size')); this._settings.set_value('preview-custom-opacity', this._settings.get_default_value('preview-custom-opacity')); @@ -1405,7 +1422,7 @@ const Preferences = class { this._settings.set_value('window-preview-aspect-ratio-y', this._settings.get_default_value('window-preview-aspect-ratio-y')); this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); - + this._settings.set_value('window-preview-padding', this._settings.get_default_value('window-preview-padding')); this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); @@ -1413,7 +1430,7 @@ const Preferences = class { this._settings.set_value('window-preview-title-font-size', this._settings.get_default_value('window-preview-title-font-size')); this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); - + this._settings.set_value('window-preview-custom-icon-size', this._settings.get_default_value('window-preview-custom-icon-size')); this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); @@ -1467,7 +1484,7 @@ const Preferences = class { this._builder.get_object('preview_custom_opacity_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('preview-custom-opacity', widget.get_value()); }); - + this._settings.bind('peek-mode', this._builder.get_object('peek_mode_switch'), 'active', @@ -1480,7 +1497,7 @@ const Preferences = class { this._builder.get_object('grid_peek_mode_opacity'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('window-preview-show-title', this._builder.get_object('preview_show_title_switch'), 'active', @@ -1551,7 +1568,7 @@ const Preferences = class { this._builder.get_object('preview_title_size_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('window-preview-title-font-size', widget.get_value()); }); - + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); this._builder.get_object('preview_custom_icon_size_spinbutton').connect('value-changed', (widget) => { this._settings.set_int('window-preview-custom-icon-size', widget.get_value()); @@ -1571,7 +1588,7 @@ const Preferences = class { dialog.show(); }); - + this._settings.bind('isolate-workspaces', this._builder.get_object('isolate_workspaces_switch'), 'active', @@ -1634,7 +1651,7 @@ const Preferences = class { this._settings.bind('group-apps-use-launchers', this._builder.get_object('group_apps_use_launchers_switch'), 'active', - Gio.SettingsBindFlags.DEFAULT); + Gio.SettingsBindFlags.DEFAULT); this._builder.get_object('show_group_apps_options_button').connect('clicked', () => { let box = this._builder.get_object('box_group_apps_options'); @@ -1696,7 +1713,7 @@ const Preferences = class { dialog.show(); dialog.set_default_size(600, 1); - }); + }); this._builder.get_object('click_action_combo').set_active_id(this._settings.get_string('click-action')); this._builder.get_object('click_action_combo').connect('changed', (widget) => { @@ -1890,7 +1907,7 @@ const Preferences = class { dialog.set_default_size(600, 1); }); - + // setup dialog for secondary menu options this._builder.get_object('secondarymenu_options_button').connect('clicked', () => { let box = this._builder.get_object('box_secondarymenu_options'); @@ -1935,11 +1952,14 @@ const Preferences = class { {objectName: 'tray_size_scale', valueName: 'tray-size', range: DEFAULT_FONT_SIZES }, {objectName: 'leftbox_size_scale', valueName: 'leftbox-size', range: DEFAULT_FONT_SIZES }, {objectName: 'appicon_margin_scale', valueName: 'appicon-margin', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'appicon_margin_todesktop_scale', valueName: 'appicon-margin-todesktop', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'appicon_margin_toscreenborder_scale', valueName: 'appicon-margin-toscreenborder', range: DEFAULT_MARGIN_SIZES }, {objectName: 'appicon_padding_scale', valueName: 'appicon-padding', range: DEFAULT_MARGIN_SIZES }, {objectName: 'tray_padding_scale', valueName: 'tray-padding', range: DEFAULT_PADDING_SIZES }, {objectName: 'leftbox_padding_scale', valueName: 'leftbox-padding', range: DEFAULT_PADDING_SIZES }, {objectName: 'statusicon_padding_scale', valueName: 'status-icon-padding', range: DEFAULT_PADDING_SIZES }, - {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS } + {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS }, + {objectName: 'highlight_appicon_borderradius', valueName: 'highlight-appicon-hover-border-radius', range: [ 16, 12, 8, 4, 2, 0 ] }, ]; for(const idx in sizeScales) { @@ -2054,6 +2074,71 @@ const Preferences = class { }); + this._settings.bind('highlight-appicon-hover', + this._builder.get_object('highlight_appicon_hover_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('highlight-appicon-hover', + this._builder.get_object('highlight_appicon_hover_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + { + rgba.parse(this._settings.get_string('highlight-appicon-hover-background-color')); + this._builder.get_object('highlight_appicon_color').set_rgba(rgba); + this._builder.get_object('highlight_appicon_color').connect('color-set', (button) => { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + this._settings.set_string('highlight-appicon-hover-background-color', css); + }); + + rgba.parse(this._settings.get_string('highlight-appicon-pressed-background-color')); + this._builder.get_object('pressed_appicon_color').set_rgba(rgba); + this._builder.get_object('pressed_appicon_color').connect('color-set', (button) => { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + this._settings.set_string('highlight-appicon-pressed-background-color', css); + }); + + let scales = [ + ['highlight_appicon_borderradius', 'highlight-appicon-hover-border-radius'], + ]; + + const updateScale = scale => { + let [id, key] = scale; + this._builder.get_object(id).set_value(this._settings.get_int(key)); + }; + scales.forEach(scale => { + updateScale(scale); + let [id, key] = scale; + this._builder.get_object(id).connect('value-changed', widget => { + this._settings.set_int(key, widget.get_value()); + }); + }); + + } + + this._builder.get_object('highlight_appicon_hover_button').connect('clicked', () => { + let box = this._builder.get_object('highlight_appicon_hover_options'); + + let dialog = this._createPreferencesDialog(_('App icon highlight options'), box, () => + { + // restore default settings + this._settings.set_value('highlight-appicon-hover-background-color', this._settings.get_default_value('highlight-appicon-hover-background-color')); + rgba.parse(this._settings.get_string('highlight-appicon-hover-background-color')); + this._builder.get_object('highlight_appicon_color').set_rgba(rgba); + this._settings.set_value('highlight-appicon-pressed-background-color', this._settings.get_default_value('highlight-appicon-pressed-background-color')); + rgba.parse(this._settings.get_string('highlight-appicon-pressed-background-color')); + this._builder.get_object('pressed_appicon_color').set_rgba(rgba); + this._settings.set_value('highlight-appicon-hover-border-radius', this._settings.get_default_value('highlight-appicon-hover-border-radius')); + this._builder.get_object('highlight_appicon_borderradius').set_value(this._settings.get_int('highlight-appicon-hover-border-radius')); + }); + + dialog.show(); + + }); + this._settings.bind('stockgs-keep-dash', this._builder.get_object('stockgs_dash_switch'), 'active', @@ -2064,7 +2149,7 @@ const Preferences = class { 'active', Gio.SettingsBindFlags.DEFAULT); - + this._settings.connect('changed::stockgs-keep-top-panel', () => this._maybeDisableTopPosition()); @@ -2074,7 +2159,7 @@ const Preferences = class { this._builder.get_object('stockgs_panelbtn_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - + this._settings.bind('stockgs-force-hotcorner', this._builder.get_object('stockgs_hotcorner_switch'), 'active', @@ -2151,7 +2236,7 @@ const Preferences = class { dialog.connect('response', (dialog, id) => { if (id == Gtk.ResponseType.ACCEPT) acceptHandler.call(this, dialog.get_file().get_path()); - + dialog.destroy(); }); } @@ -2161,7 +2246,7 @@ const Preferences = class { const BuilderScope = GObject.registerClass({ Implements: [Gtk.BuilderScope], }, class BuilderScope extends GObject.Object { - + _init(preferences) { this._preferences = preferences; super._init(); @@ -2170,13 +2255,13 @@ const BuilderScope = GObject.registerClass({ vfunc_create_closure(builder, handlerName, flags, connectObject) { if (flags & Gtk.BuilderClosureFlags.SWAPPED) throw new Error('Unsupported template signal flag "swapped"'); - + if (typeof this[handlerName] === 'undefined') throw new Error(`${handlerName} is undefined`); - + return this[handlerName].bind(connectObject || this); } - + on_btn_click(connectObject) { connectObject.set_label("Clicked"); } @@ -2188,7 +2273,7 @@ const BuilderScope = GObject.registerClass({ position_top_button_clicked_cb(button) { if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.TOP); } - + position_left_button_clicked_cb(button) { if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.LEFT); } @@ -2281,6 +2366,30 @@ const BuilderScope = GObject.registerClass({ }); } + appicon_margin_todesktop_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_margin_todesktop_timeout > 0) + GLib.Source.remove(this._preferences._appicon_margin_todesktop_timeout); + + this._preferences._appicon_margin_todesktop_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { + this._preferences._settings.set_int('appicon-margin-todesktop', scale.get_value()); + this._preferences._appicon_margin_todesktop_timeout = 0; + return GLib.SOURCE_REMOVE; + }); + } + + appicon_margin_toscreenborder_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_margin_toscreenborder_timeout > 0) + GLib.Source.remove(this._preferences._appicon_margin_toscreenborder_timeout); + + this._preferences._appicon_margin_toscreenborder_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { + this._preferences._settings.set_int('appicon-margin-toscreenborder', scale.get_value()); + this._preferences._appicon_margin_toscreenborder_timeout = 0; + return GLib.SOURCE_REMOVE; + }); + } + appicon_padding_scale_value_changed_cb(scale) { // Avoid settings the size consinuosly if (this._preferences._appicon_padding_timeout > 0) diff --git a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml index a73a349..c79bd50 100644 --- a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml +++ b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -735,6 +735,16 @@ App icon margin Set the margin for application icons in the embedded dash. + + 0 + App icon margin to desktop + Set the margin for application icons in the embedded dash towards the desktop (top margin if panel is on the bottom). + + + 0 + App icon margin to screen border + Set the margin for application icons in the embedded dash towards the desktop (bottom margin if panel is on the bottom). + 4 App icon padding @@ -795,6 +805,22 @@ {'SIMPLE':1,'RIPPLE':1.25,'PLANK':2} App icon hover animation zoom scale in relation to the app icon size + + true + Highlight app icon on hover + + + "rgba(238, 238, 236, 0.1)" + Highlight color + + + "rgba(238, 238, 236, 0.18)" + Mouse down highlight color + + + 0 + Highlight border radius + true Integrate items from the gnome appmenu into the right click menu diff --git a/stylesheet.css b/stylesheet.css index 58d191a..fd05e22 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -39,24 +39,40 @@ } #dashtopanelScrollview .overview-tile:hover .dtp-container, -#dashtopanelScrollview .overview-tile:focus .dtp-container, +#dashtopanelScrollview .overview-tile:focus .dtp-container { + background-color: rgba(238, 238, 236, 0.1); + border-radius: 0px; + background-color: var(--dtp-hover-background-color); + border-radius: var(--dtp-hover-border-radius); +} + +#dashtopanelScrollview .overview-tile:hover .dtp-container > .dtp-dots-container, +#dashtopanelScrollview .overview-tile:focus .dtp-container > .dtp-dots-container { + border-radius: 0px; + border-radius: var(--dtp-hover-border-radius); +} + .dashtopanelMainPanel .dash-item-container .show-apps:hover { background-color: rgba(238, 238, 238, 0.1); } - .dashtopanelMainPanel .dash-item-container .show-apps .overview-icon { color: #FFF; } - -#dashtopanelTaskbar .dash-item-container .overview-tile:hover, -#dashtopanelTaskbar .dash-item-container .overview-tile .dtp-container .overview-icon, -#dashtopanelScrollview .overview-tile:hover .dtp-container.animate-appicon-hover, .dashtopanelMainPanel .dash-item-container .show-apps:hover .overview-icon { background: none; } +#dashtopanelTaskbar .dash-item-container .overview-tile:hover, +#dashtopanelTaskbar .dash-item-container .overview-tile .dtp-container .overview-icon, +#dashtopanelScrollview .overview-tile:hover .dtp-container.no-highlight, +#dashtopanelScrollview .overview-tile:focus .dtp-container.no-highlight { + background: none; +} + + #dashtopanelScrollview .overview-tile:active .dtp-container { background-color: rgba(238, 238, 236, 0.18); + background-color: var(--dtp-pressed-background-color); } #dashtopanelScrollview .overview-tile .favorite { diff --git a/taskbar.js b/taskbar.js index 54da64f..af08ccd 100644 --- a/taskbar.js +++ b/taskbar.js @@ -98,11 +98,11 @@ const iconAnimationSettings = { }, get travel() { - return Math.max(0, this._getDictValue('animate-appicon-hover-animation-travel')); + return Math.max(-1, this._getDictValue('animate-appicon-hover-animation-travel')); }, get zoom() { - return Math.max(1, this._getDictValue('animate-appicon-hover-animation-zoom')); + return Math.max(0.5, this._getDictValue('animate-appicon-hover-animation-zoom')); }, }; @@ -154,7 +154,7 @@ export const TaskbarActor = GObject.registerClass({ leftFade.set_style(gradientStyle); rightFade.set_style(gradientStyle); } - + childBox[panel.varCoord.c2] = childBox[panel.varCoord.c1] + (value > 0 ? scrollview._dtpFadeSize : 0); leftFade.allocate(childBox); @@ -168,13 +168,13 @@ export const TaskbarActor = GObject.registerClass({ // then calls BoxLayout) vfunc_get_preferred_width(forHeight) { let [, natWidth] = St.Widget.prototype.vfunc_get_preferred_width.call(this, forHeight); - + return [0, natWidth]; } vfunc_get_preferred_height(forWidth) { let [, natHeight] = St.Widget.prototype.vfunc_get_preferred_height.call(this, forWidth); - + return [0, natHeight]; } }); @@ -199,7 +199,7 @@ export const Taskbar = class extends EventEmitter { super(); this.dtpPanel = panel; - + // start at smallest size due to running indicator drawing area expanding but not shrinking this.iconSize = 16; @@ -252,13 +252,13 @@ export const Taskbar = class extends EventEmitter { this._container.add_child(new St.Widget({ width: 0, reactive: false })); this._container.add_child(this._scrollView); - + let orientation = panel.getOrientation(); let fadeStyle = 'background-gradient-direction:' + orientation; let fade1 = new St.Widget({ style_class: 'scrollview-fade', reactive: false }); - let fade2 = new St.Widget({ style_class: 'scrollview-fade', - reactive: false, - pivot_point: new Graphene.Point({ x: .5, y: .5 }), + let fade2 = new St.Widget({ style_class: 'scrollview-fade', + reactive: false, + pivot_point: new Graphene.Point({ x: .5, y: .5 }), rotation_angle_z: 180 }); fade1.set_style(fadeStyle); @@ -278,7 +278,7 @@ export const Taskbar = class extends EventEmitter { }); const adjustment = this._scrollView[orientation[0] + 'adjustment']; - + this._workId = Main.initializeDeferredWork(this._box, this._redisplay.bind(this)); this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); @@ -318,7 +318,7 @@ export const Taskbar = class extends EventEmitter { ], [ global.window_manager, - 'switch-workspace', + 'switch-workspace', () => this._connectWorkspaceSignals() ], [ @@ -400,7 +400,7 @@ export const Taskbar = class extends EventEmitter { let setAttributes = () => { this.isGroupApps = SETTINGS.get_boolean('group-apps'); this.usingLaunchers = !this.isGroupApps && SETTINGS.get_boolean('group-apps-use-launchers'); - this.showFavorites = SETTINGS.get_boolean('show-favorites') && + this.showFavorites = SETTINGS.get_boolean('show-favorites') && (this.dtpPanel.isPrimary || SETTINGS.get_boolean('show-favorites-all-monitors')) this.showRunningApps = SETTINGS.get_boolean('show-running-apps') this.allowSplitApps = this.usingLaunchers || (!this.isGroupApps && !this.showFavorites) @@ -425,7 +425,7 @@ export const Taskbar = class extends EventEmitter { this._signalsHandler = 0; this._container.destroy(); - + this.previewMenu.disable(); this.previewMenu.destroy(); @@ -592,7 +592,7 @@ export const Taskbar = class extends EventEmitter { if (this._dragInfo) { this._box.set_child_at_index(this._dragInfo[1]._dashItemContainer, this._dragInfo[0]); } - + this._endDrag(); } @@ -614,10 +614,10 @@ export const Taskbar = class extends EventEmitter { this._clearEmptyDropTarget(); this._showAppsIcon.setDragApp(null); DND.removeDragMonitor(this._dragMonitor); - + this._dragMonitor = null; this.emit('end-drag'); - + this._toggleFavoriteHighlight(); } @@ -639,9 +639,9 @@ export const Taskbar = class extends EventEmitter { _toggleFavoriteHighlight(show) { let appFavorites = AppFavorites.getAppFavorites(); let cssFuncName = (show ? 'add' : 'remove') + '_style_class_name'; - + if (this.showFavorites) - this._getAppIcons().filter(appIcon => (this.usingLaunchers && appIcon.isLauncher) || + this._getAppIcons().filter(appIcon => (this.usingLaunchers && appIcon.isLauncher) || (!this.usingLaunchers && appFavorites.isFavorite(appIcon.app.get_id()))) .forEach(fav => fav._container[cssFuncName]('favorite')); } @@ -686,12 +686,12 @@ export const Taskbar = class extends EventEmitter { _createAppItem(app, window, isLauncher) { let appIcon = new AppIcons.TaskbarAppIcon( { - app, + app, window, isLauncher }, this.dtpPanel, - { + { setSizeManually: true, showLabel: false, isDraggable: !SETTINGS.get_boolean('taskbar-locked'), @@ -730,7 +730,7 @@ export const Taskbar = class extends EventEmitter { appIcon.connect('notify::hover', () => { if (appIcon.hover){ - this._timeoutsHandler.add([T1, 100, + this._timeoutsHandler.add([T1, 100, () => Utils.ensureActorVisibleInScrollView(this._scrollView, appIcon, this._scrollView._dtpFadeSize) ]) @@ -761,7 +761,7 @@ export const Taskbar = class extends EventEmitter { appIcon._menu._boxPointer.yOffset = -y_shift; } }); - + // Override default AppIcon label_actor, now the // accessible_name is set at DashItemContainer.setLabelText appIcon.label_actor = null; @@ -863,13 +863,13 @@ export const Taskbar = class extends EventEmitter { if (availSize < minIconSize) { availSize = minIconSize; } - + // For the icon size, we only consider children which are "proper" - // icons and which are not animating out (which means they will be + // icons and which are not animating out (which means they will be // destroyed at the end of the animation) let iconChildren = this._getTaskbarIcons().concat([this._showAppsIcon]); let scale = this.iconSize / availSize; - + this.iconSize = availSize; for (let i = 0; i < iconChildren.length; i++) { @@ -902,7 +902,7 @@ export const Taskbar = class extends EventEmitter { } sortAppsCompareFunction(appA, appB) { - return getAppStableSequence(appA, this.dtpPanel.monitor) - + return getAppStableSequence(appA, this.dtpPanel.monitor) - getAppStableSequence(appB, this.dtpPanel.monitor); } @@ -941,9 +941,9 @@ export const Taskbar = class extends EventEmitter { (!this.allowSplitApps || this.isGroupApps || appInfo.windows[0] == appIcon.window) && appInfo.isLauncher == appIcon.isLauncher); - if (appIndex < 0 || + if (appIndex < 0 || (appIcon.window && (this.isGroupApps || expectedAppInfos[appIndex].windows.indexOf(appIcon.window) < 0)) || - (!appIcon.window && !appIcon.isLauncher && + (!appIcon.window && !appIcon.isLauncher && !this.isGroupApps && expectedAppInfos[appIndex].windows.length)) { currentAppIcons[i][this._shownInitially ? 'animateOutAndDestroy' : 'destroy'](); currentAppIcons.splice(i, 1); @@ -953,13 +953,13 @@ export const Taskbar = class extends EventEmitter { //if needed, reorder the existing appIcons and create the missing ones let currentPosition = 0; for (let i = 0, l = expectedAppInfos.length; i < l; ++i) { - let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? - [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : + let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? + [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : expectedAppInfos[i].windows.map(window => ({ app: expectedAppInfos[i].app, window: window, isLauncher: false })); - + for (let j = 0, ll = neededAppIcons.length; j < ll; ++j) { //check if the icon already exists - let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && + let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && appIcon.child._delegate.window == neededAppIcons[j].window); if (matchingAppIconIndex > 0 && matchingAppIconIndex != currentPosition) { @@ -969,10 +969,10 @@ export const Taskbar = class extends EventEmitter { } else if (matchingAppIconIndex < 0) { //the icon doesn't exist yet, create a new one let newAppIcon = this._createAppItem(neededAppIcons[j].app, neededAppIcons[j].window, neededAppIcons[j].isLauncher); - + this._box.insert_child_at_index(newAppIcon, currentPosition); currentAppIcons.splice(currentPosition, 0, newAppIcon); - + // Skip animations on first run when adding the initial set // of items, to avoid all items zooming in at once newAppIcon.show(this._shownInitially); @@ -1011,14 +1011,14 @@ export const Taskbar = class extends EventEmitter { apps.push(app); } } - + return apps; } _createAppInfos(apps, defaultWindows, defaultIsLauncher) { if (this.allowSplitApps && !defaultIsLauncher) { let separateApps = [] - + if (apps.length) { let tracker = Shell.WindowTracker.get_default(); let windows = AppIcons.getInterestingWindows(null, this.dtpPanel.monitor) @@ -1029,8 +1029,8 @@ export const Taskbar = class extends EventEmitter { if (apps.indexOf(windowApp) >= 0) separateApps.push({ - app: windowApp, - isLauncher: false, + app: windowApp, + isLauncher: false, windows: [w] }) }) @@ -1039,8 +1039,8 @@ export const Taskbar = class extends EventEmitter { return separateApps } - return apps.map(app => ({ - app: app, + return apps.map(app => ({ + app: app, isLauncher: defaultIsLauncher || false, windows: defaultWindows || AppIcons.getInterestingWindows(app, this.dtpPanel.monitor) .sort(sortWindowsCompareFunction) @@ -1129,10 +1129,10 @@ export const Taskbar = class extends EventEmitter { let currentAppIcons = this._getAppIcons(); let sourceIndex = currentAppIcons.indexOf(source); - let hoveredIndex = Utils.findIndex(currentAppIcons, - appIcon => pos >= appIcon._dashItemContainer[posProp] && + let hoveredIndex = Utils.findIndex(currentAppIcons, + appIcon => pos >= appIcon._dashItemContainer[posProp] && pos <= (appIcon._dashItemContainer[posProp] + appIcon._dashItemContainer[sizeProp])); - + if (!this._dragInfo) { this._dragInfo = [sourceIndex, source]; } @@ -1145,13 +1145,13 @@ export const Taskbar = class extends EventEmitter { // Don't allow positioning before or after self and between icons of same app if ungrouped and showing favorites if (!(hoveredIndex === sourceIndex || (isLeft && hoveredIndex - 1 == sourceIndex) || - (!this.allowSplitApps && isLeft && hoveredIndex - 1 >= 0 && source.app != prevIcon.app && + (!this.allowSplitApps && isLeft && hoveredIndex - 1 >= 0 && source.app != prevIcon.app && prevIcon.app == currentAppIcons[hoveredIndex].app) || (!isLeft && hoveredIndex + 1 == sourceIndex) || - (!this.allowSplitApps && !isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != nextIcon.app && + (!this.allowSplitApps && !isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != nextIcon.app && nextIcon.app == currentAppIcons[hoveredIndex].app))) { this._box.set_child_at_index(source._dashItemContainer, hoveredIndex); - + // Ensure the next and previous icon are visible when moving the icon // (I assume there's room for both of them) if (hoveredIndex > 1) @@ -1160,14 +1160,14 @@ export const Taskbar = class extends EventEmitter { Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex+1], this._scrollView._dtpFadeSize); } } - + return this._dragInfo[0] !== sourceIndex ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.CONTINUE; } // Draggable target interface acceptDrop (source, actor, x, y, time) { // Don't allow favoriting of transient apps - if (!this._dragInfo || !source.app || source.app.is_window_backed() || + if (!this._dragInfo || !source.app || source.app.is_window_backed() || !this._settings.is_writable('favorite-apps')) { return false; } @@ -1198,9 +1198,9 @@ export const Taskbar = class extends EventEmitter { let appWindows = interestingWindows[app]; //prevents "reference to undefined property Symbol.toPrimitive" warning return appWindows; }; - - if (sameApps.length && - ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && + + if (sameApps.length && + ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && (!appIcons[sourceIndex + 1] || appIcons[sourceIndex + 1].app !== source.app))) { appIcons.splice(appIcons.indexOf(sameApps[0]), sameApps.length); Array.prototype.splice.apply(appIcons, [sourceIndex + 1, 0].concat(sameApps)); @@ -1208,15 +1208,15 @@ export const Taskbar = class extends EventEmitter { for (let i = 0, l = appIcons.length; i < l; ++i) { let windows = []; - + if (!usingLaunchers || (!source.isLauncher && !appIcons[i].isLauncher)) { windows = appIcons[i].window ? [appIcons[i].window] : getAppWindows(appIcons[i].app); } windows.forEach(w => w._dtpPosition = position++); - if (this.showFavorites && - ((usingLaunchers && appIcons[i].isLauncher) || + if (this.showFavorites && + ((usingLaunchers && appIcons[i].isLauncher) || (!usingLaunchers && appFavorites.isFavorite(appIcons[i].app.get_id())))) { ++favoritesCount; } @@ -1255,10 +1255,10 @@ export const Taskbar = class extends EventEmitter { SearchController._onStageKeyPress = function(actor, event) { if (Main.modalCount == 1 && event.get_key_symbol() === Clutter.KEY_Escape) { this._searchActive ? this.reset() : Main.overview.hide(); - + return Clutter.EVENT_STOP; } - + return Object.getPrototypeOf(this)._onStageKeyPress.call(this, actor, event); }; @@ -1293,13 +1293,13 @@ export const Taskbar = class extends EventEmitter { } } } - + _syncShowAppsButtonToggled() { let status = SearchController._showAppsButton.checked; if (this.showAppsButton.checked !== status) this.showAppsButton.checked = status; } - + showShowAppsButton() { this.showAppsButton.visible = true; this.showAppsButton.set_width(-1); @@ -1374,7 +1374,7 @@ export const TaskbarItemContainer = GObject.registerClass({ let travel = iconAnimationSettings.travel; let zoom = iconAnimationSettings.zoom; - return this._dtpPanel.dtpSize * (travel + (zoom - 1) / 2); + return this._dtpPanel.dtpSize * Math.max(0, travel + (zoom - 1) / 2); } _updateCloneContainerPosition(cloneContainer) { @@ -1470,10 +1470,10 @@ export const TaskbarItemContainer = GObject.registerClass({ let translationMax = (vertical ? width : height) * (travel + (zoom - 1) / 2); let translationEnd = translationMax * level; let translationDone = vertical ? this._raisedClone.translation_x : this._raisedClone.translation_y; - let translationTodo = Math.abs(translationEnd - translationDone); + let translationTodo = Math.sign(travel)*Math.abs(translationEnd - translationDone); let scale = 1 + (zoom - 1) * level; let rotationAngleZ = rotationDirection * rotation * level; - let time = duration * translationTodo / translationMax; + let time = Math.abs(duration * translationTodo / translationMax); let options = { scale_x: scale, scale_y: scale, @@ -1524,7 +1524,7 @@ const DragPlaceholderItem = GObject.registerClass({ this.child = { _delegate: appIcon }; - this._clone = new Clutter.Clone({ + this._clone = new Clutter.Clone({ source: appIcon.icon._iconBin, width: iconSize, height: iconSize @@ -1541,7 +1541,7 @@ const DragPlaceholderItem = GObject.registerClass({ export function getAppStableSequence(app, monitor) { let windows = AppIcons.getInterestingWindows(app, monitor); - + return windows.reduce((prevWindow, window) => { return Math.min(prevWindow, getWindowStableSequence(window)); }, Infinity); @@ -1552,5 +1552,5 @@ export function sortWindowsCompareFunction(windowA, windowB) { } export function getWindowStableSequence(window) { - return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); + return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); } diff --git a/ui/BoxAnimateAppIconHoverOptions.ui b/ui/BoxAnimateAppIconHoverOptions.ui index f49e2d7..f0ab669 100644 --- a/ui/BoxAnimateAppIconHoverOptions.ui +++ b/ui/BoxAnimateAppIconHoverOptions.ui @@ -18,14 +18,14 @@ - 0 + -100 100 1 5 - 100 + 10 250 1 5 diff --git a/ui/BoxHighlightAppIconHoverOptions.ui b/ui/BoxHighlightAppIconHoverOptions.ui new file mode 100644 index 0000000..5b99fcf --- /dev/null +++ b/ui/BoxHighlightAppIconHoverOptions.ui @@ -0,0 +1,70 @@ + + + + + + + 0 + 10 + 1 + 2 + + + + vertical + 600 + 24 + 32 + 32 + 32 + 32 + + + + + + Highlight AppIcon color + + + True + center + True + + + + + + + Pressed AppIcon color + + + True + center + True + + + + + + + Highlight AppIcon border radius + (default is 0) + + + 300 + highlight_appicon_borderradius_adjustment + 0 + 0 + right + True + + + + + + + + + + + \ No newline at end of file diff --git a/ui/BoxShowDesktopOptions.ui b/ui/BoxShowDesktopOptions.ui index be5d21c..e068126 100644 --- a/ui/BoxShowDesktopOptions.ui +++ b/ui/BoxShowDesktopOptions.ui @@ -52,7 +52,7 @@ Override Show Desktop line color - > + True center True diff --git a/ui/SettingsStyle.ui b/ui/SettingsStyle.ui index abe5c34..b76c96c 100644 --- a/ui/SettingsStyle.ui +++ b/ui/SettingsStyle.ui @@ -9,6 +9,20 @@ 0.1 + + 0.33 + 1 + 0.01 + 0.1 + + + + 0.33 + 1 + 0.01 + 0.1 + + 0.33 1 @@ -42,7 +56,7 @@ AppIcon style - + App Icon Margin @@ -61,6 +75,42 @@ + + + App Icon Margin Towards Desktop + (default is 0) + + + 300 + appicon_margin_todesktop_adjustment + 0 + 0 + right + True + + + + + + + + + App Icon Margin Towards Screen Border + (default is 0) + + + 300 + appicon_margin_toscreenborder_adjustment + 0 + 0 + right + True + + + + + + App Icon Padding @@ -104,6 +154,31 @@ + + + Highlight hovering app icons + + + True + center + + + emblem-system-symbolic + + + + + + + + center + + + + + Icon style From 52bbc9870944014372622a52b38388172955757c Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Fri, 13 Sep 2024 08:07:03 +0200 Subject: [PATCH 04/18] Beautify DTP - Fix ugly icon animation when using ungroup applications option --- appIcons.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/appIcons.js b/appIcons.js index 517cc5c..f767dd5 100644 --- a/appIcons.js +++ b/appIcons.js @@ -292,10 +292,11 @@ export const TaskbarAppIcon = GObject.registerClass({ // The source of the clone is this._dtpIconContainer, // which contains the icon but no highlighting elements // using this.actor directly would break DnD style. + let cloneSource = this._dtpIconContainer; let clone = new Clutter.Clone({ - source: this._dtpIconContainer, + source: cloneSource, x: this.child.x, y: this.child.y, - width: this.child.width, height: this.child.height, + width: cloneSource.width, height: cloneSource.height, pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }), opacity: 255, reactive: false, From 56e1cfb542b244cb66a2f1db3354f77471b730ea Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Mon, 28 Oct 2024 07:53:12 +0100 Subject: [PATCH 05/18] Beautify DTP - Update missing file reference in Makefile --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 52bbefa..145ada5 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ UUID = dash-to-panel@jderose9.github.com BASE_MODULES = extension.js stylesheet.css metadata.json COPYING README.md EXTRA_MODULES = appIcons.js panel.js panelManager.js proximity.js intellihide.js progress.js panelPositions.js panelSettings.js panelStyle.js overview.js taskbar.js transparency.js windowPreview.js prefs.js utils.js desktopIconsIntegration.js -UI_MODULES = ui/BoxAdvancedOptions.ui ui/BoxAnimateAppIconHoverOptions.ui ui/BoxDotOptions.ui ui/BoxDynamicOpacityOptions.ui ui/BoxGroupAppsOptions.ui ui/BoxIntellihideOptions.ui ui/BoxMiddleClickOptions.ui ui/BoxOverlayShortcut.ui ui/BoxScrollIconOptions.ui ui/BoxScrollPanelOptions.ui ui/BoxSecondaryMenuOptions.ui ui/BoxShowApplicationsOptions.ui ui/BoxShowDesktopOptions.ui ui/BoxWindowPreviewOptions.ui ui/SettingsAbout.ui ui/SettingsAction.ui ui/SettingsBehavior.ui ui/SettingsFineTune.ui ui/SettingsPosition.ui ui/SettingsStyle.ui +UI_MODULES = ui/BoxAdvancedOptions.ui ui/BoxAnimateAppIconHoverOptions.ui ui/BoxDotOptions.ui ui/BoxDynamicOpacityOptions.ui ui/BoxGroupAppsOptions.ui ui/BoxIntellihideOptions.ui ui/BoxMiddleClickOptions.ui ui/BoxOverlayShortcut.ui ui/BoxScrollIconOptions.ui ui/BoxScrollPanelOptions.ui ui/BoxSecondaryMenuOptions.ui ui/BoxShowApplicationsOptions.ui ui/BoxShowDesktopOptions.ui ui/BoxWindowPreviewOptions.ui ui/SettingsAbout.ui ui/SettingsAction.ui ui/SettingsBehavior.ui ui/SettingsFineTune.ui ui/SettingsPosition.ui ui/SettingsStyle.ui ui/BoxHighlightAppIconHoverOptions.ui EXTRA_IMAGES = highlight_stacked_bg.svg highlight_stacked_bg_2.svg highlight_stacked_bg_3.svg @@ -18,7 +18,7 @@ INSTALLNAME = dash-to-panel@jderose9.github.com # The command line passed variable VERSION is used to set the version string # in the metadata and in the generated zip-file. If no VERSION is passed, the -# version is pulled from the latest git tag and the current commit SHA1 is +# version is pulled from the latest git tag and the current commit SHA1 is # added to the metadata ifdef VERSION ifdef TARGET @@ -53,7 +53,7 @@ mergepo: potfile ./po/dash-to-panel.pot: $(TOLOCALIZE) mkdir -p po xgettext -k_ -kN_ -o po/dash-to-panel.pot --package-name "Dash To Panel" $(TOLOCALIZE) --from-code=UTF-8 - + for l in $(UI_MODULES) ; do \ intltool-extract --type=gettext/glade $$l; \ xgettext -k_ -kN_ -o po/dash-to-panel.pot $$l.h --join-existing --from-code=UTF-8; \ From 49c461d263f02885fe706441e884b238e7551610 Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Fri, 27 Dec 2024 16:21:52 +0100 Subject: [PATCH 06/18] Beautify DTP - Enable workaround for GTK < 4.16 even in newer versions of GTK due to restrictions for GNOME extensions --- appIcons.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/appIcons.js b/appIcons.js index 4750fbb..36c9c2f 100644 --- a/appIcons.js +++ b/appIcons.js @@ -491,7 +491,9 @@ export const TaskbarAppIcon = GObject.registerClass({ } _checkGtkVersion_cssVariables() { - // Support for CSS variables will be added in GTK 4.16 + // Support for CSS variables was added in GTK 4.16 + // However, using them is still impossible within an extension [Gnome version 47] + return false; return Gtk.get_major_version() >= 5 || (Gtk.get_major_version() == 4 && Gtk.get_minor_version() >= 16); } @@ -509,6 +511,8 @@ export const TaskbarAppIcon = GObject.registerClass({ _onAppIconPressedChanged_GtkWorkaround() { if (this.pressed && this._appicon_pressedstyle) { this._container.set_style(this._appicon_pressedstyle); + } else if (this.hover && this._appicon_hoverstyle) { + this._container.set_style(this._appicon_hoverstyle); } else if(this._appicon_normalstyle) { this._container.set_style(this._appicon_normalstyle); } else { From 2b6e93fbcead9625bacfc01326802aafdd45472b Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Thu, 9 Jan 2025 08:19:08 +0100 Subject: [PATCH 07/18] Beautify DTP - Fix unintended implicit array to string conversion --- appIcons.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appIcons.js b/appIcons.js index 36c9c2f..66c43d3 100644 --- a/appIcons.js +++ b/appIcons.js @@ -273,9 +273,9 @@ export const TaskbarAppIcon = GObject.registerClass({ ]; if (!this._checkGtkVersion_cssVariables()) { - this._dtpSettingsSignalIds += [ + this._dtpSettingsSignalIds = this._dtpSettingsSignalIds.concat([ SETTINGS.connect('changed::highlight-appicon-hover-border-radius', () => this._setIconStyle(this._isFocusedWindow())), - ]; + ]); } this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); From 7553a5e8540871161b26d1d9bdee5d8f9575690b Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Thu, 16 Jan 2025 23:34:53 -0500 Subject: [PATCH 08/18] Stop shaking #2228 --- taskbar.js | 1 + 1 file changed, 1 insertion(+) diff --git a/taskbar.js b/taskbar.js index 05c71b0..0f86e73 100644 --- a/taskbar.js +++ b/taskbar.js @@ -1331,6 +1331,7 @@ export const TaskbarItemContainer = GObject.registerClass({ _init() { super._init() + this.x_expand = this.y_expand = false } vfunc_allocate(box) { From a899ca30e74a76c3308598c477bed1b5b6444867 Mon Sep 17 00:00:00 2001 From: Jhonatan Seminario Date: Thu, 2 Jan 2025 11:49:00 -0500 Subject: [PATCH 09/18] Add Spanish translations for "Quit Window" and "Quit Windows" --- po/es.po | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/po/es.po b/po/es.po index 8f606c9..dfeb029 100644 --- a/po/es.po +++ b/po/es.po @@ -255,6 +255,12 @@ msgstr "Importar configuraciones" msgid "Quit" msgstr "Salir" +#: appIcons.js:1497 +msgid "Quit %d Window" +msgid_plural "Quit %d Windows" +msgstr[0] "Cerrar %d ventana" +msgstr[1] "Cerrar %d ventanas" + #: appIcons.js:1515 msgid "Windows" msgstr "Ventanas" From e88f294acafa238da313493f375503b8e6d27b25 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Sat, 7 Dec 2024 02:11:51 +0100 Subject: [PATCH 10/18] Update Slovak translation New strings translated and fixed some old translations --- po/sk.po | 252 ++++++++++++++++++++----------------------------------- 1 file changed, 93 insertions(+), 159 deletions(-) diff --git a/po/sk.po b/po/sk.po index 85f157a..6e9235f 100644 --- a/po/sk.po +++ b/po/sk.po @@ -2,29 +2,30 @@ # Copyright (C) 2018 # This file is distributed under the same license as the dash-to-panel package. # Jose Riha , 2021. +# Jozef Gaal , 2024. # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: Dash to Panel v67\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-08 08:31-0500\n" -"PO-Revision-Date: 2021-08-05 14:16+0200\n" -"Last-Translator: Jose Riha \n" -"Language-Team: \n" +"PO-Revision-Date: 2024-12-07 02:10+0100\n" +"Last-Translator: Jozef Gaal \n" +"Language-Team: Jozef Gaal \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n" +"X-Generator: Poedit 3.4.2\n" #: prefs.js:247 msgid "Show Desktop button height (px)" -msgstr "Výška tlačidla plochy (px)" +msgstr "Výška tlačidla zobrazenia plochy (px)" #: prefs.js:247 msgid "Show Desktop button width (px)" -msgstr "Šírka tlačidla plochy (px)" +msgstr "Šírka tlačidla zobrazenia plochy (px)" #: prefs.js:259 msgid "Unavailable when gnome-shell top panel is present" @@ -78,11 +79,11 @@ msgstr "Zoznam úloh" #: prefs.js:416 msgid "Date menu" -msgstr "Menu hodín" +msgstr "Ponuka dátumu" #: prefs.js:417 msgid "System menu" -msgstr "Systémové menu" +msgstr "Ponuka systému" #: prefs.js:418 msgid "Left box" @@ -118,19 +119,19 @@ msgstr "Vyberte umiestnenie prvku" #: prefs.js:443 msgid "Stacked to top" -msgstr "Zvrchu" +msgstr "Hore" #: prefs.js:443 msgid "Stacked to left" -msgstr "Zľava" +msgstr "Vľavo" #: prefs.js:444 msgid "Stacked to bottom" -msgstr "Zdola" +msgstr "Dole" #: prefs.js:444 msgid "Stacked to right" -msgstr "Sprava" +msgstr "Vpravo" #: prefs.js:445 msgid "Centered" @@ -158,7 +159,7 @@ msgstr "Otvoriť ikonu" #: prefs.js:577 msgid "Show Desktop options" -msgstr "Nastavenia plochy" +msgstr "Nastavenia tlačidla zobrazenia plochy" #: prefs.js:661 #, javascript-format @@ -168,7 +169,7 @@ msgstr "%d ms" #: prefs.js:666 #, javascript-format msgid "%d °" -msgstr "" +msgstr "%d °" #: prefs.js:671 prefs.js:676 #, javascript-format @@ -190,7 +191,7 @@ msgstr[2] "%d ikon" #: prefs.js:782 msgid "Running Indicator Options" -msgstr "Možnosti indikátora bežiacich aplikácií" +msgstr "Možnosti indikátora činnosti" #: prefs.js:928 msgid "Primary monitor" @@ -234,7 +235,7 @@ msgstr "Nastavenie ďalších klávesových skratiek" #: prefs.js:1898 msgid "Secondary Menu Options" -msgstr "Nastavenie sekundárneho menu" +msgstr "Možnosti sekundárnej ponuky" #: prefs.js:1924 ui/SettingsFineTune.ui.h:22 msgid "Advanced Options" @@ -327,7 +328,7 @@ msgstr "Zatiaľ nedostupné!" #: ui/BoxAdvancedOptions.ui.h:2 msgid "For real..." -msgstr "" +msgstr "Naozaj..." #: ui/BoxAnimateAppIconHoverOptions.ui.h:1 msgid "Animation type" @@ -343,7 +344,7 @@ msgstr "Vlnenie" #: ui/BoxAnimateAppIconHoverOptions.ui.h:4 msgid "Plank" -msgstr "Prekrytie" +msgstr "Doska" #: ui/BoxAnimateAppIconHoverOptions.ui.h:5 msgid "Duration" @@ -351,7 +352,7 @@ msgstr "Trvanie" #: ui/BoxAnimateAppIconHoverOptions.ui.h:6 msgid "Rotation" -msgstr "Otočenie" +msgstr "Otáčanie" #: ui/BoxAnimateAppIconHoverOptions.ui.h:7 msgid "Travel" @@ -363,11 +364,11 @@ msgstr "Priblíženie" #: ui/BoxAnimateAppIconHoverOptions.ui.h:9 msgid "Convexity" -msgstr "Vypuklina" +msgstr "Vypuklosť" #: ui/BoxAnimateAppIconHoverOptions.ui.h:10 msgid "Extent" -msgstr "Rozšírenie" +msgstr "Rozsah" #: ui/BoxDotOptions.ui.h:1 msgid "Highlight focused application" @@ -453,7 +454,7 @@ msgstr "0" #: ui/BoxDynamicOpacityOptions.ui.h:9 msgid "Opacity change animation duration (ms)" -msgstr "Rýchlosť animácie zobrazenia/skrytia panela" +msgstr "Dĺžka animácie zmeny priehľadnosti (ms)" #: ui/BoxGroupAppsOptions.ui.h:1 msgid "Font size (px) of the application titles (default is 14)" @@ -492,16 +493,12 @@ msgid "Font color of the minimized application titles" msgstr "Farba písma názvu minimalizovanej aplikácie" #: ui/BoxGroupAppsOptions.ui.h:10 -#, fuzzy msgid "Maximum width (px) of the application titles" -msgstr "Maximálna šírka (px) pre názov aplikácie (predvolená: 160)" +msgstr "Maximálna šírka (px) pre názov aplikácie" #: ui/BoxGroupAppsOptions.ui.h:11 -#, fuzzy msgid "(default is 160)" -msgstr "" -"Dĺžka panela (%)\n" -"(predvolená: 100)" +msgstr "(predvolená je 160)" #: ui/BoxGroupAppsOptions.ui.h:12 msgid "Use a fixed width for the application titles" @@ -525,9 +522,8 @@ msgid "Use the favorite icons as application launchers" msgstr "Použiť ikony obľúbených aplikácií ako spúšťače" #: ui/BoxIntellihideOptions.ui.h:1 -#, fuzzy msgid "Only hide the panel when it is obstructed by windows" -msgstr "Skryť panel iba pri prekrytí oknami aplikácií " +msgstr "Skryť panel len vtedy, keď je prekrytý oknami" #: ui/BoxIntellihideOptions.ui.h:2 msgid "The panel hides from" @@ -550,14 +546,12 @@ msgid "Allow the panel to be revealed while in fullscreen mode" msgstr "Povoliť zobrazenie panela v režime celej obrazovky" #: ui/BoxIntellihideOptions.ui.h:10 -#, fuzzy msgid "Only hide secondary panels" -msgstr "Skryť iba sekundárne panely (pre viac monitorov)" +msgstr "Skryť iba sekundárne panely" #: ui/BoxIntellihideOptions.ui.h:11 -#, fuzzy msgid "(requires multi-monitors option)" -msgstr "Skryť iba sekundárne panely (pre viac monitorov)" +msgstr "(vyžaduje možnosť viacerých monitorov)" #: ui/BoxIntellihideOptions.ui.h:12 msgid "Keyboard shortcut to reveal and hold the panel" @@ -585,7 +579,7 @@ msgstr "Oneskorenie pred skrytím pri štarte (ms)" #: ui/BoxMiddleClickOptions.ui.h:1 msgid "Shift+Click action" -msgstr "Akcia pri Shift+Click" +msgstr "Akcia pri Shift+Kliknutie" #: ui/BoxMiddleClickOptions.ui.h:2 msgid "" @@ -640,7 +634,7 @@ msgstr "Shift + prostredné tlačidlo myši." #: ui/BoxOverlayShortcut.ui.h:1 msgid "Hotkeys prefix" -msgstr "Skratka" +msgstr "Predpona klávesových skratiek" #: ui/BoxOverlayShortcut.ui.h:2 msgid "Hotkeys will either be Super+Number or Super+Alt+Num" @@ -686,7 +680,7 @@ msgstr "Skratka pre zobrazenie prehľadu na 2 sekundy" #: ui/BoxOverlayShortcut.ui.h:13 msgid "e.g. q" -msgstr "napr: q" +msgstr "napr. q" #: ui/BoxOverlayShortcut.ui.h:14 msgid "Show window previews on hotkey" @@ -735,16 +729,15 @@ msgstr "" #: ui/BoxSecondaryMenuOptions.ui.h:1 msgid "Integrate AppMenu items" -msgstr "Zobraziť položky menu aplikácie" +msgstr "Integrovať položky ponuky aplikácií" #: ui/BoxSecondaryMenuOptions.ui.h:2 msgid "Show Details menu item" -msgstr "Zobraziť menu Detail" +msgstr "Položka ponuky Zobraziť podrobnosti" #: ui/BoxShowApplicationsOptions.ui.h:1 -#, fuzzy msgid "Show Applications icon" -msgstr "Zobraziť ikonu aplikácií" +msgstr "Zobraziť ikonu aplikácií" #: ui/BoxShowApplicationsOptions.ui.h:2 msgid "Show Applications icon side padding (px)" @@ -756,7 +749,7 @@ msgstr "Zmeniť správanie klávesu Esc a vrátiť sa na plochu" #: ui/BoxShowDesktopOptions.ui.h:1 msgid "Override Show Desktop line color" -msgstr "Vlastná farba deliacej čiary plochy" +msgstr "Prepísať farbu čiary tlačidla zobrazenia plochy" #: ui/BoxShowDesktopOptions.ui.h:2 msgid "Reveal the desktop when hovering the Show Desktop button" @@ -771,22 +764,20 @@ msgid "Fade duration (ms)" msgstr "Skryť po (ms)" #: ui/BoxWindowPreviewOptions.ui.h:1 -#, fuzzy msgid "Time (ms) before showing" -msgstr "Pauza (ms) pred zobrazením náhľadu (predvolená: 400)" +msgstr "Čas (ms) pred zobrazením" #: ui/BoxWindowPreviewOptions.ui.h:2 msgid "(400 is default)" -msgstr "" +msgstr "(400 is predvolené)" #: ui/BoxWindowPreviewOptions.ui.h:3 -#, fuzzy msgid "Time (ms) before hiding" -msgstr "Pauza (ms) pred skrytím náhľadu (predvolená: 100)" +msgstr "Čas (ms) pred skrytím" #: ui/BoxWindowPreviewOptions.ui.h:4 msgid "(100 is default)" -msgstr "" +msgstr "(100 is predvolené)" #: ui/BoxWindowPreviewOptions.ui.h:5 msgid "Immediate on application icon click" @@ -909,10 +900,10 @@ msgid "Use custom opacity for the previews background" msgstr "Použiť vlastné nastavenie priehľadnosti náhľadov" #: ui/BoxWindowPreviewOptions.ui.h:35 -#, fuzzy msgid "" "If disabled, the previews background have the same opacity as the panel." -msgstr "Pri vypnutí sa použije hodnota priehľadnosti panela" +msgstr "" +"Ak je vypnuté, pozadie náhľadov bude mať rovnakú nepriehľadnosť ako panel." #: ui/BoxWindowPreviewOptions.ui.h:36 msgid "Close button and header position" @@ -979,25 +970,23 @@ msgstr "Všetky okna, okrem aktívneho, majú rovnaké nastavenie priehľadnosti #: ui/SettingsAbout.ui.h:1 msgid "Info" -msgstr "" +msgstr "Informácie" #: ui/SettingsAbout.ui.h:2 -#, fuzzy msgid "Version" -msgstr "verzia: " +msgstr "Verzia" #: ui/SettingsAbout.ui.h:3 msgid "Source" -msgstr "" +msgstr "Zdroj" #: ui/SettingsAbout.ui.h:4 msgid "GitHub" msgstr "GitHub" #: ui/SettingsAbout.ui.h:5 -#, fuzzy msgid "Export and Import" -msgstr "Export a import nastavení" +msgstr "Export a import" #: ui/SettingsAbout.ui.h:6 msgid "Export and import settings" @@ -1042,13 +1031,12 @@ msgid "Toggle windows" msgstr "Prepínanie okien" #: ui/SettingsAction.ui.h:10 -#, fuzzy msgid "Scroll action" msgstr "Akcia kolieska myši" #: ui/SettingsAction.ui.h:11 msgid "Scroll panel action" -msgstr "Akcia panelu pri skrolovaní" +msgstr "Akcia kolieska myši na paneli" #: ui/SettingsAction.ui.h:12 msgid "Behavior when mouse scrolling over the panel." @@ -1072,7 +1060,7 @@ msgstr "Upraviť hlasitosť" #: ui/SettingsAction.ui.h:17 msgid "Scroll icon action" -msgstr "Akcia kolieska myši" +msgstr "Akcia kolieska myši na ikone" #: ui/SettingsAction.ui.h:18 msgid "Behavior when mouse scrolling over an application icon." @@ -1083,9 +1071,8 @@ msgid "Same as panel" msgstr "Rovnaké ako panel" #: ui/SettingsAction.ui.h:20 -#, fuzzy msgid "Hotkey overlay" -msgstr "Zobraziť číslo" +msgstr "Klávesové skratky" #: ui/SettingsAction.ui.h:21 msgid "Use hotkeys to activate apps" @@ -1100,9 +1087,8 @@ msgstr "" "použiť v kombinácií s Shift a Ctrl." #: ui/SettingsBehavior.ui.h:1 -#, fuzzy msgid "Applications" -msgstr "Nezoskupené aplikácie" +msgstr "Aplikácie" #: ui/SettingsBehavior.ui.h:2 msgid "Show favorite applications" @@ -1118,7 +1104,7 @@ msgstr "Zobraziť bežiace aplikácie" #: ui/SettingsBehavior.ui.h:5 msgid "Show AppMenu button" -msgstr "Zobraziť tlačidlo aplikácií" +msgstr "Zobraziť tlačidlo ponuky aplikácií" #: ui/SettingsBehavior.ui.h:6 msgid "Ungroup applications" @@ -1126,7 +1112,7 @@ msgstr "Nezoskupené aplikácie" #: ui/SettingsBehavior.ui.h:7 msgid "Show notification counter badge" -msgstr "" +msgstr "Zobraziť znak počítadla oznámení" #: ui/SettingsBehavior.ui.h:8 msgid "Show window previews on hover" @@ -1137,9 +1123,8 @@ msgid "Show tooltip on hover" msgstr "Zobraziť tip okna pri podržaní myši" #: ui/SettingsBehavior.ui.h:10 -#, fuzzy msgid "Isolate" -msgstr "Oddeliť monitory" +msgstr "Oddeliť" #: ui/SettingsBehavior.ui.h:11 msgid "Isolate Workspaces" @@ -1151,7 +1136,7 @@ msgstr "Oddeliť monitory" #: ui/SettingsBehavior.ui.h:13 msgid "Overview" -msgstr "" +msgstr "Prehľad" #: ui/SettingsBehavior.ui.h:14 msgid "Click empty space to close overview" @@ -1163,59 +1148,43 @@ msgstr "Vypnúť zobrazenie prehľadu po štarte" #: ui/SettingsFineTune.ui.h:1 msgid "Font size" -msgstr "" +msgstr "Veľkosť písma" #: ui/SettingsFineTune.ui.h:2 msgid "Tray Font Size" -msgstr "" +msgstr "Veľkosť písma systémového bloku" #: ui/SettingsFineTune.ui.h:3 -#, fuzzy msgid "(0 = theme default)" -msgstr "" -"Veľkosť písma stavovej oblasti\n" -"(0 = určená motívom)" +msgstr "(0 = predvolené témou)" #: ui/SettingsFineTune.ui.h:4 -#, fuzzy msgid "LeftBox Font Size" -msgstr "" -"Veľkosť písma ľavého bloku\n" -"(0 = určená motívom)" +msgstr "Veľkosť písma ľavého bloku" #: ui/SettingsFineTune.ui.h:5 msgid "Padding" -msgstr "" +msgstr "Odsadenie" #: ui/SettingsFineTune.ui.h:6 -#, fuzzy msgid "Tray Item Padding" -msgstr "" -"Odsadenie položiek v systémovej oblasti\n" -"(-1 = určené motívom)" +msgstr "Odsadenie položky v systémovom bloku" #: ui/SettingsFineTune.ui.h:7 -#, fuzzy msgid "(-1 = theme default)" -msgstr "" -"Odsadenie v ľavom bloku\n" -"(-1 = určené motívom)" +msgstr "(-1 = predvolené témou)" #: ui/SettingsFineTune.ui.h:8 -#, fuzzy msgid "Status Icon Padding" -msgstr "" -"Odsadenie medzi stavovými ikonami\n" -"(-1 = určené motívom)" +msgstr "Odsadenie stavových ikon" #: ui/SettingsFineTune.ui.h:9 msgid "LeftBox Padding" -msgstr "" +msgstr "Odsadenie ľavého bloku" #: ui/SettingsFineTune.ui.h:10 -#, fuzzy msgid "Animate" -msgstr "Typ animácie" +msgstr "Animovať" #: ui/SettingsFineTune.ui.h:11 msgid "Animate switching applications" @@ -1227,48 +1196,43 @@ msgstr "Animovať vytváranie nových okien" #: ui/SettingsFineTune.ui.h:13 msgid "Gnome functionality" -msgstr "" +msgstr "Funkcionalita Gnome" #: ui/SettingsFineTune.ui.h:14 -#, fuzzy msgid "Keep original gnome-shell dash" -msgstr "Ponechať pôvodný 'gnome-shell dash' (prehľad úloh)" +msgstr "Ponechať pôvodný gnome-shell dash" #: ui/SettingsFineTune.ui.h:15 msgid "(overview)" -msgstr "" +msgstr "(prehľad)" #: ui/SettingsFineTune.ui.h:16 msgid "Keep original gnome-shell top panel" msgstr "Ponechať pôvodný horný panel gnome-shell" #: ui/SettingsFineTune.ui.h:17 -#, fuzzy msgid "Activate panel menu buttons on click only" -msgstr "Aktivovať tlačidlá na paneli iba po stlačení (napr. menu hodín)" +msgstr "Aktivovať tlačidlá ponuky na paneli iba pri kliknutí" #: ui/SettingsFineTune.ui.h:18 -#, fuzzy msgid "(e.g. date menu)" -msgstr "Menu hodín" +msgstr "(napr. ponuka s dátumom)" #: ui/SettingsFineTune.ui.h:19 msgid "Force Activities hot corner on primary monitor" msgstr "Vynútiť aktívny roh na primárnom monitore" #: ui/SettingsFineTune.ui.h:20 -#, fuzzy msgid "App icon secondary menu" -msgstr "Nastavenie pravého kliknutia na ikonu aplikácie" +msgstr "Sekundárna ponuka ikony aplikácie" #: ui/SettingsFineTune.ui.h:21 -#, fuzzy msgid "(right-click menu)" -msgstr "Nastavenie pravého kliknutia na ikonu aplikácie" +msgstr "(ponuka pravého tlačidla myši)" #: ui/SettingsPosition.ui.h:1 msgid "Panel" -msgstr "" +msgstr "Panel" #: ui/SettingsPosition.ui.h:2 msgid "Display the main panel on" @@ -1287,14 +1251,12 @@ msgid "Hide and reveal the panel according to preferences" msgstr "Zobraziť/skryť panel podľa nastavení" #: ui/SettingsPosition.ui.h:6 -#, fuzzy msgid "Order and Position on monitors" -msgstr "Poradie a pozícia na monitore" +msgstr "Poradie a pozícia na monitoroch" #: ui/SettingsPosition.ui.h:7 -#, fuzzy msgid "Monitor" -msgstr "Monitor " +msgstr "Monitor" #: ui/SettingsPosition.ui.h:8 msgid "Apply changes to all monitors" @@ -1305,90 +1267,65 @@ msgid "Panel screen position" msgstr "Pozícia panela na obrazovke" #: ui/SettingsPosition.ui.h:14 -#, fuzzy msgid "Panel thickness" -msgstr "" -"Šírka panela\n" -"(predvolená: 48)" +msgstr "Šírka panela" #: ui/SettingsPosition.ui.h:15 -#, fuzzy msgid "(default is 48)" -msgstr "" -"Šírka panela\n" -"(predvolená: 48)" +msgstr "(predvolená je 48)" #: ui/SettingsPosition.ui.h:17 -#, fuzzy, no-c-format +#, no-c-format msgid "Panel length (%)" -msgstr "" -"Dĺžka panela (%)\n" -"(predvolená: 100)" +msgstr "Dĺžka panela (%)" #: ui/SettingsPosition.ui.h:18 -#, fuzzy msgid "(default is 100)" -msgstr "" -"Dĺžka panela (%)\n" -"(predvolená: 100)" +msgstr "(predvolená je 100)" #: ui/SettingsPosition.ui.h:19 msgid "Anchor" msgstr "Ukotvenie" #: ui/SettingsPosition.ui.h:23 -#, fuzzy msgid "Taskbar Display" -msgstr "Zoznam úloh" +msgstr "Zobrazenie panela úloh" #: ui/SettingsStyle.ui.h:1 msgid "AppIcon style" -msgstr "" +msgstr "Štýl ikony aplikácií" #: ui/SettingsStyle.ui.h:2 -#, fuzzy msgid "App Icon Margin" -msgstr "" -"Rozostup ikon aplikácií\n" -"(predvolený: 8)" +msgstr "Rozostup ikon aplikácií" #: ui/SettingsStyle.ui.h:3 -#, fuzzy msgid "(default is 8)" -msgstr "" -"Rozostup ikon aplikácií\n" -"(predvolený: 8)" +msgstr "(predvolené je 8)" #: ui/SettingsStyle.ui.h:4 -#, fuzzy msgid "App Icon Padding" -msgstr "" -"Odsadenie ikon aplikácií\n" -"(predvolené: 4)" +msgstr "Odsadenie ikon aplikácií" #: ui/SettingsStyle.ui.h:5 -#, fuzzy msgid "(default is 4)" -msgstr "" -"Odsadenie ikon aplikácií\n" -"(predvolené: 4)" +msgstr "(predvolené je 4)" #: ui/SettingsStyle.ui.h:6 msgid "Animate hovering app icons" msgstr "Animovať prepínanie medzi ikonami aplikácií" #: ui/SettingsStyle.ui.h:7 -#, fuzzy msgid "Running indicator" -msgstr "Pozícia indikátora" +msgstr "Indikátor činnosti" #: ui/SettingsStyle.ui.h:8 msgid "Running indicator position" -msgstr "Pozícia indikátora" +msgstr "Pozícia indikátora činnosti" #: ui/SettingsStyle.ui.h:13 msgid "Running indicator style (Focused app)" -msgstr "Štýl indikátora bežiacich aplikácií (na popredí)" +msgstr "Štýl indikátora bežiacich aplikácií (na popredí)činnosti" #: ui/SettingsStyle.ui.h:14 msgid "Dots" @@ -1404,7 +1341,7 @@ msgstr "Čiarky" #: ui/SettingsStyle.ui.h:17 msgid "Segmented" -msgstr "Segmenty" +msgstr "Segmentované" #: ui/SettingsStyle.ui.h:18 msgid "Solid" @@ -1423,18 +1360,16 @@ msgid "Running indicator style (Unfocused apps)" msgstr "Štýl indikátora bežiacich aplikácií (na pozadí)" #: ui/SettingsStyle.ui.h:22 -#, fuzzy msgid "Panel style" -msgstr "Inteligentné skrývanie (Intellihide)" +msgstr "Štýl panelu" #: ui/SettingsStyle.ui.h:23 -#, fuzzy msgid "Override panel theme background color" -msgstr "Vlastná farba pozadia panela (ignorovať motív) " +msgstr "Prepísať farbu pozadia témy panela" #: ui/SettingsStyle.ui.h:24 msgid "Override panel theme background opacity" -msgstr "Vlastná priehľadnosť panela (ignorovať motív)" +msgstr "Prepísať nepriehľadnosť pozadia témy panela" #: ui/SettingsStyle.ui.h:26 #, no-c-format @@ -1450,9 +1385,8 @@ msgid "Change opacity when a window gets close to the panel" msgstr "Zmeniť priehľadnosť pri priblížení okna" #: ui/SettingsStyle.ui.h:30 -#, fuzzy msgid "Override panel theme gradient" -msgstr "Vlastné nastavenie farebného prechodu panela (ignorovať motív) " +msgstr "Prepísať gradient témy panela" #: ui/SettingsStyle.ui.h:32 #, no-c-format From 402ff93febac16120a229b9df457bda21d182e47 Mon Sep 17 00:00:00 2001 From: alewicki95 <160427461+alewicki95@users.noreply.github.com> Date: Wed, 16 Oct 2024 17:59:11 +0200 Subject: [PATCH 11/18] Add files via upload --- po/pl.po | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/po/pl.po b/po/pl.po index 905c61c..656895c 100644 --- a/po/pl.po +++ b/po/pl.po @@ -20,11 +20,11 @@ msgstr "" #: prefs.js:247 msgid "Show Desktop button height (px)" -msgstr "Wysokość przycisku Pokaż pulpit (px)" +msgstr "Wysokość przycisku Pokaż pulpit (px)" +msgstr "Szerokość przycisku Pokaż pulpit (px)" #: prefs.js:259 msgid "Unavailable when gnome-shell top panel is present" @@ -70,7 +70,7 @@ msgstr "Opcje wyświetlania programów" #: prefs.js:414 msgid "Activities button" -msgstr "Pokaż przycisk Podgląd" +msgstr "Przycisk Podgląd" #: prefs.js:415 msgid "Taskbar" @@ -98,7 +98,7 @@ msgstr "Po prawej" #: prefs.js:421 msgid "Desktop button" -msgstr "Pokaż przycisk Pulpit" +msgstr "Przycisk Pulpit" #: prefs.js:427 msgid "Move up" @@ -731,7 +731,7 @@ msgstr "Ma wpływ na wyskakujące okno w przestrzeni roboczej tylko na panelu" #: ui/BoxSecondaryMenuOptions.ui.h:1 msgid "Integrate AppMenu items" -msgstr "Zintegruj elementy menu programów" +msgstr "Zintegruj elementy Menu programów" #: ui/BoxSecondaryMenuOptions.ui.h:2 msgid "Show Details menu item" @@ -743,7 +743,7 @@ msgstr "Opcje wyświetlania programów" #: ui/BoxShowApplicationsOptions.ui.h:2 msgid "Show Applications icon side padding (px)" -msgstr "Wewnętrzny margines przycisku Pokaż programy (px)" +msgstr "Wewnętrzny margines przycisku Pokaż programy (px)" #: ui/BoxShowApplicationsOptions.ui.h:4 msgid "Override escape key and return to desktop" @@ -755,7 +755,7 @@ msgstr "Nadpisz kolor przycisku Pokaż pulpit" #: ui/BoxShowDesktopOptions.ui.h:2 msgid "Reveal the desktop when hovering the Show Desktop button" -msgstr "Pokaż pulpit po najechaniu na przycisk Pokaż pulpit" +msgstr "Pokaż pulpit po najechaniu na przycisk Pokaż pulpit" #: ui/BoxShowDesktopOptions.ui.h:3 msgid "Delay before revealing the desktop (ms)" @@ -1549,6 +1549,18 @@ msgstr "Gradient dolnego koloru i przeźroczystość (%)" #~ msgid "Fine-Tune" #~ msgstr "Dostrajanie" +#~ msgid "Position" +#~ msgstr "Pozycja" + +#~ msgid "Icon style" +#~ msgstr "Styl ikony" + +#~ msgid "Normal" +#~ msgstr "Normalna" + +#~ msgid "Symbolic" +#~ msgstr "Symboliczna" + #~ msgid "" #~ "This allows you to update the extension directly from the GitHub " #~ "repository." From 8b427693cfd0849ae2e2457b91a7147cffb05e21 Mon Sep 17 00:00:00 2001 From: Delphin PETER Date: Sun, 29 Sep 2024 16:05:30 +0200 Subject: [PATCH 12/18] Update french translation --- po/fr.po | 889 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 474 insertions(+), 415 deletions(-) diff --git a/po/fr.po b/po/fr.po index ca62da1..a783e91 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,205 +7,300 @@ # msgid "" msgstr "" -"Project-Id-Version: unnamed project\n" +"Project-Id-Version: DAsh To PAnel\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-08 08:31-0500\n" -"PO-Revision-Date: 2023-02-08 12:15-0500\n" -"Last-Translator: Charles Gagnon \n" -"Language-Team: French - Canada <>\n" -"Language: fr_CA\n" +"POT-Creation-Date: 2024-09-29 15:58+0200\n" +"PO-Revision-Date: 2024-09-29 16:02+0200\n" +"Last-Translator: Delphin PETER\n" +"Language-Team: French\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Gtranslator 42.0\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.4.2\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SearchPath-0: ui\n" +"X-Poedit-SearchPath-1: windowPreview.js\n" +"X-Poedit-SearchPath-2: utils.js\n" +"X-Poedit-SearchPath-3: transparency.js\n" +"X-Poedit-SearchPath-4: taskbar.js\n" +"X-Poedit-SearchPath-5: proximity.js\n" +"X-Poedit-SearchPath-6: progress.js\n" +"X-Poedit-SearchPath-7: prefs.js\n" +"X-Poedit-SearchPath-8: panelStyle.js\n" +"X-Poedit-SearchPath-9: panelSettings.js\n" +"X-Poedit-SearchPath-10: panelPositions.js\n" +"X-Poedit-SearchPath-11: panelManager.js\n" +"X-Poedit-SearchPath-12: panel.js\n" +"X-Poedit-SearchPath-13: overview.js\n" +"X-Poedit-SearchPath-14: intellihide.js\n" +"X-Poedit-SearchPath-15: extension.js\n" +"X-Poedit-SearchPath-16: desktopIconsIntegration.js\n" +"X-Poedit-SearchPath-17: appIcons.js\n" -#: prefs.js:247 +#: appIcons.js:1485 appIcons.js:1495 ui/BoxMiddleClickOptions.ui:32 +#: ui/BoxMiddleClickOptions.ui:60 ui/BoxMiddleClickOptions.ui:88 +msgid "Quit" +msgstr "Quitter" + +#: appIcons.js:1497 +#, javascript-format +msgid "Quit %d Window" +msgid_plural "Quit %d Windows" +msgstr[0] "Fermer %d fenêtre" +msgstr[1] "Fermer %d fenêtres" + +#: appIcons.js:1772 +msgid "Power options" +msgstr "Options d'alimentation" + +#: appIcons.js:1777 +msgid "Event logs" +msgstr "Journaux d'évènements" + +#: appIcons.js:1782 +msgid "System" +msgstr "Système" + +#: appIcons.js:1787 +msgid "Device Management" +msgstr "Gestionnaire de périphériques" + +#: appIcons.js:1792 +msgid "Disk Management" +msgstr "Gestionnaire de disques" + +#: appIcons.js:1805 +msgid "Terminal" +msgstr "Terminal" + +#: appIcons.js:1810 +msgid "System monitor" +msgstr "Moniteur système" + +#: appIcons.js:1815 +msgid "Files" +msgstr "Fichiers" + +#: appIcons.js:1820 +msgid "Extensions" +msgstr "Extensions" + +#: appIcons.js:1825 +msgid "Settings" +msgstr "Paramètres" + +#: appIcons.js:1836 +msgid "Unlock taskbar" +msgstr "Déverrouiller la barre des tâches" + +#: appIcons.js:1836 +msgid "Lock taskbar" +msgstr "Verrouiller la barre des tâches" + +#: appIcons.js:1841 +msgid "Dash to Panel Settings" +msgstr "Paramètres Dash to Panel" + +#: appIcons.js:1846 +msgid "Restore Windows" +msgstr "Restaurer les fenêtres" + +#: appIcons.js:1846 +msgid "Show Desktop" +msgstr "Afficher le bureau" + +#: panel.js:171 +msgid "Top Bar" +msgstr "Panneau du haut" + +#: prefs.js:246 msgid "Show Desktop button height (px)" msgstr "Hauteur du bouton Afficher le Bureau (px)" -#: prefs.js:247 +#: prefs.js:246 msgid "Show Desktop button width (px)" msgstr "Longueur du bouton Afficher le Bureau (px)" -#: prefs.js:259 +#: prefs.js:258 msgid "Unavailable when gnome-shell top panel is present" msgstr "Indisponible quand le panneau de gnome-shell est présent" -#: prefs.js:317 ui/SettingsPosition.ui.h:12 ui/SettingsStyle.ui.h:11 +#: prefs.js:316 ui/SettingsPosition.ui:148 ui/SettingsStyle.ui:149 msgid "Left" msgstr "Gauche" -#: prefs.js:318 +#: prefs.js:317 msgid "Center" msgstr "Centre" -#: prefs.js:319 ui/SettingsPosition.ui.h:13 ui/SettingsStyle.ui.h:12 +#: prefs.js:318 ui/SettingsPosition.ui:157 ui/SettingsStyle.ui:157 msgid "Right" msgstr "Droit" -#: prefs.js:321 ui/BoxWindowPreviewOptions.ui.h:38 ui/SettingsPosition.ui.h:11 -#: ui/SettingsStyle.ui.h:10 +#: prefs.js:320 ui/BoxWindowPreviewOptions.ui:330 ui/SettingsPosition.ui:139 +#: ui/SettingsStyle.ui:141 msgid "Top" msgstr "Haut" -#: prefs.js:322 prefs.js:327 ui/SettingsPosition.ui.h:21 +#: prefs.js:321 prefs.js:326 ui/SettingsPosition.ui:210 msgid "Middle" msgstr "Milieu" -#: prefs.js:323 ui/BoxWindowPreviewOptions.ui.h:37 ui/SettingsPosition.ui.h:10 -#: ui/SettingsStyle.ui.h:9 +#: prefs.js:322 ui/BoxWindowPreviewOptions.ui:321 ui/SettingsPosition.ui:130 +#: ui/SettingsStyle.ui:134 msgid "Bottom" msgstr "Bas" -#: prefs.js:326 ui/SettingsPosition.ui.h:20 +#: prefs.js:325 ui/SettingsPosition.ui:209 msgid "Start" msgstr "Début" -#: prefs.js:328 ui/SettingsPosition.ui.h:22 +#: prefs.js:327 ui/SettingsPosition.ui:211 msgid "End" msgstr "Fin" -#: prefs.js:413 +#: prefs.js:412 msgid "Show Applications button" msgstr "Bouton Afficher les Applications" -#: prefs.js:414 +#: prefs.js:413 msgid "Activities button" msgstr "Bouton Activités" -#: prefs.js:415 +#: prefs.js:414 msgid "Taskbar" msgstr "Barre des tâches" -#: prefs.js:416 +#: prefs.js:415 msgid "Date menu" msgstr "Horloge" -#: prefs.js:417 +#: prefs.js:416 msgid "System menu" msgstr "Menu système" -#: prefs.js:418 +#: prefs.js:417 msgid "Left box" msgstr "Zone gauche" -#: prefs.js:419 +#: prefs.js:418 msgid "Center box" msgstr "Zone centre" -#: prefs.js:420 +#: prefs.js:419 msgid "Right box" msgstr "Zone droite" -#: prefs.js:421 +#: prefs.js:420 msgid "Desktop button" msgstr "Bouton Afficher le Bureau" -#: prefs.js:427 +#: prefs.js:426 msgid "Move up" msgstr "Déplacer vers le haut" -#: prefs.js:429 +#: prefs.js:428 msgid "Move down" msgstr "Déplacer vers le bas" -#: prefs.js:431 +#: prefs.js:430 msgid "Visible" msgstr "Visible" -#: prefs.js:432 +#: prefs.js:431 msgid "Select element position" msgstr "Sélectionner la position de l'élément" -#: prefs.js:443 +#: prefs.js:442 msgid "Stacked to top" msgstr "Empilé en haut" -#: prefs.js:443 +#: prefs.js:442 msgid "Stacked to left" msgstr "Empilé à gauche" -#: prefs.js:444 +#: prefs.js:443 msgid "Stacked to bottom" msgstr "Empilé en bas" -#: prefs.js:444 +#: prefs.js:443 msgid "Stacked to right" msgstr "Empilé à droite" -#: prefs.js:445 +#: prefs.js:444 msgid "Centered" msgstr "Centré" -#: prefs.js:446 +#: prefs.js:445 msgid "Monitor Center" msgstr "Centre de l'écran " -#: prefs.js:465 +#: prefs.js:464 msgid "More options" msgstr "Plus d'options" -#: prefs.js:497 +#: prefs.js:496 msgid "Reset to defaults" msgstr "Restaurer paramètres" -#: prefs.js:520 +#: prefs.js:519 msgid "Show Applications options" msgstr "Options du bouton Afficher les Applications" -#: prefs.js:530 +#: prefs.js:529 msgid "Open icon" msgstr "Choisir l'icône" -#: prefs.js:577 +#: prefs.js:576 msgid "Show Desktop options" msgstr "Options du bouton Afficher le Bureau" -#: prefs.js:661 +#: prefs.js:660 #, javascript-format msgid "%d ms" msgstr "%d ms" -#: prefs.js:666 +#: prefs.js:665 #, javascript-format msgid "%d °" msgstr "%d °" -#: prefs.js:671 prefs.js:676 +#: prefs.js:670 prefs.js:675 #, javascript-format msgid "%d %%" msgstr "%d %%" -#: prefs.js:681 +#: prefs.js:680 #, javascript-format msgid "%.1f" msgstr "%.1f" -#: prefs.js:686 +#: prefs.js:685 #, javascript-format msgid "%d icon" msgid_plural "%d icons" msgstr[0] "%d icône" msgstr[1] "%d icônes" -#: prefs.js:782 +#: prefs.js:787 msgid "Running Indicator Options" msgstr "Options de l'indicateur d'activité" -#: prefs.js:928 +#: prefs.js:933 msgid "Primary monitor" msgstr "Écran principal" -#: prefs.js:928 +#: prefs.js:933 msgid "Monitor " msgstr "Écran " -#: prefs.js:1122 +#: prefs.js:1127 msgid "Dynamic opacity options" msgstr "Options d'opacité dynamique" -#: prefs.js:1255 +#: prefs.js:1260 msgid "Intellihide options" msgstr "Options du masquage intelligent" @@ -237,274 +332,205 @@ msgstr "Raccourcis avancés" msgid "Secondary Menu Options" msgstr "Options du menu secondaire" -#: prefs.js:1924 ui/SettingsFineTune.ui.h:22 +#: prefs.js:1925 ui/SettingsFineTune.ui:268 msgid "Advanced Options" msgstr "Options avancées" -#: prefs.js:2040 +#: prefs.js:2041 msgid "App icon animation options" msgstr "Options d'animation des icônes d'application" -#: prefs.js:2088 +#: prefs.js:2089 msgid "Export settings" msgstr "Exporter les paramètres" -#: prefs.js:2104 +#: prefs.js:2105 msgid "Import settings" msgstr "Importer des paramètres" -#: appIcons.js:1503 appIcons.js:1513 appIcons.js:1515 -#: ui/BoxMiddleClickOptions.ui.h:10 -msgid "Quit" -msgstr "Quitter" - -#: appIcons.js:1515 -msgid "Windows" -msgstr "Fenêtres" - -#: appIcons.js:1786 -msgid "Power options" -msgstr "Options d'alimentation" - -#: appIcons.js:1791 -msgid "Event logs" -msgstr "Journaux d'évènements" - -#: appIcons.js:1796 -msgid "System" -msgstr "Système" - -#: appIcons.js:1801 -msgid "Device Management" -msgstr "Gestionnaire de périphériques" - -#: appIcons.js:1806 -msgid "Disk Management" -msgstr "Gestionnaire de disques" - -#: appIcons.js:1819 -msgid "Terminal" -msgstr "Terminal" - -#: appIcons.js:1824 -msgid "System monitor" -msgstr "Moniteur système" - -#: appIcons.js:1829 -msgid "Files" -msgstr "Fichiers" - -#: appIcons.js:1834 -msgid "Extensions" -msgstr "Extensions" - -#: appIcons.js:1839 -msgid "Settings" -msgstr "Paramètres" - -#: appIcons.js:1850 -msgid "Unlock taskbar" -msgstr "Déverrouiller la barre des tâches" - -#: appIcons.js:1850 -msgid "Lock taskbar" -msgstr "Verrouiller la barre des tâches" - -#: appIcons.js:1855 -msgid "Dash to Panel Settings" -msgstr "Paramètres Dash to Panel" - -#: appIcons.js:1860 -msgid "Restore Windows" -msgstr "Restaurer les fenêtres" - -#: appIcons.js:1860 -msgid "Show Desktop" -msgstr "Afficher le bureau" - -#: ui/BoxAdvancedOptions.ui.h:1 +#: ui/BoxAdvancedOptions.ui:19 msgid "Nothing yet!" msgstr "Rien pour l'instant !" -#: ui/BoxAdvancedOptions.ui.h:2 +#: ui/BoxAdvancedOptions.ui:20 msgid "For real..." msgstr "Pour vrai..." -#: ui/BoxAnimateAppIconHoverOptions.ui.h:1 +#: ui/BoxAnimateAppIconHoverOptions.ui:62 msgid "Animation type" msgstr "Type d'animation" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:2 +#: ui/BoxAnimateAppIconHoverOptions.ui:67 msgid "Simple" msgstr "Simple" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:3 +#: ui/BoxAnimateAppIconHoverOptions.ui:68 msgid "Ripple" msgstr "Ondulation" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:4 +#: ui/BoxAnimateAppIconHoverOptions.ui:69 msgid "Plank" msgstr "Planche" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:5 +#: ui/BoxAnimateAppIconHoverOptions.ui:84 msgid "Duration" msgstr "Durée" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:6 +#: ui/BoxAnimateAppIconHoverOptions.ui:101 msgid "Rotation" msgstr "Rotation" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:7 +#: ui/BoxAnimateAppIconHoverOptions.ui:118 msgid "Travel" msgstr "Déplacement" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:8 +#: ui/BoxAnimateAppIconHoverOptions.ui:135 msgid "Zoom" msgstr "Zoom" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:9 +#: ui/BoxAnimateAppIconHoverOptions.ui:152 msgid "Convexity" msgstr "Convexité" -#: ui/BoxAnimateAppIconHoverOptions.ui.h:10 +#: ui/BoxAnimateAppIconHoverOptions.ui:169 msgid "Extent" msgstr "Étendue" -#: ui/BoxDotOptions.ui.h:1 +#: ui/BoxDotOptions.ui:37 msgid "Highlight focused application" msgstr "Surligner l'application active" -#: ui/BoxDotOptions.ui.h:2 +#: ui/BoxDotOptions.ui:54 msgid "Icon dominant color" msgstr "Couleur d'icône dominante" -#: ui/BoxDotOptions.ui.h:3 +#: ui/BoxDotOptions.ui:65 msgid "Custom color" msgstr "Couleur personnalisée" -#: ui/BoxDotOptions.ui.h:4 +#: ui/BoxDotOptions.ui:76 msgid "Highlight opacity" msgstr "Opacité du surlignement" -#: ui/BoxDotOptions.ui.h:5 +#: ui/BoxDotOptions.ui:96 msgid "Indicator size (px)" msgstr "Taille de l'indicateur (px)" -#: ui/BoxDotOptions.ui.h:6 +#: ui/BoxDotOptions.ui:109 msgid "Indicator color - Icon Dominant" msgstr "Couleur de l'indicateur - Icône dominante" -#: ui/BoxDotOptions.ui.h:7 +#: ui/BoxDotOptions.ui:126 msgid "Indicator color - Override Theme" msgstr "Couleur de l'indicateur - Remplacer le thème" -#: ui/BoxDotOptions.ui.h:8 +#: ui/BoxDotOptions.ui:142 ui/BoxDotOptions.ui:215 msgid "1 window open (or ungrouped)" msgstr "1 fenêtre ouverte (ou dégroupée)" -#: ui/BoxDotOptions.ui.h:9 +#: ui/BoxDotOptions.ui:146 ui/BoxDotOptions.ui:219 msgid "Apply to all" msgstr "Appliquer à tout" -#: ui/BoxDotOptions.ui.h:10 +#: ui/BoxDotOptions.ui:159 ui/BoxDotOptions.ui:232 msgid "2 windows open" msgstr "2 fenêtres ouvertes" -#: ui/BoxDotOptions.ui.h:11 +#: ui/BoxDotOptions.ui:170 ui/BoxDotOptions.ui:243 msgid "3 windows open" msgstr "3 fenêtres ouvertes" -#: ui/BoxDotOptions.ui.h:12 +#: ui/BoxDotOptions.ui:181 ui/BoxDotOptions.ui:254 msgid "4+ windows open" msgstr "4+ fenêtres ouvertes" -#: ui/BoxDotOptions.ui.h:13 +#: ui/BoxDotOptions.ui:198 msgid "Use different for unfocused" msgstr "Style différent pour les applications inactives" -#: ui/BoxDynamicOpacityOptions.ui.h:1 +#: ui/BoxDynamicOpacityOptions.ui:37 msgid "The panel background opacity is affected by" msgstr "L'opacité de l'arrière-plan du panneau est affectée par" -#: ui/BoxDynamicOpacityOptions.ui.h:2 ui/BoxIntellihideOptions.ui.h:3 +#: ui/BoxDynamicOpacityOptions.ui:42 ui/BoxIntellihideOptions.ui:69 msgid "All windows" msgstr "Toutes les fenêtres" -#: ui/BoxDynamicOpacityOptions.ui.h:3 ui/BoxIntellihideOptions.ui.h:4 +#: ui/BoxDynamicOpacityOptions.ui:43 ui/BoxIntellihideOptions.ui:70 msgid "Focused windows" msgstr "Fenêtres au premier plan" -#: ui/BoxDynamicOpacityOptions.ui.h:4 ui/BoxIntellihideOptions.ui.h:5 +#: ui/BoxDynamicOpacityOptions.ui:44 ui/BoxIntellihideOptions.ui:71 msgid "Maximized windows" msgstr "Fenêtres maximisées" -#: ui/BoxDynamicOpacityOptions.ui.h:5 +#: ui/BoxDynamicOpacityOptions.ui:53 msgid "Change opacity when a window gets closer than (px)" msgstr "Changer l'opacité lorsqu'une fenêtre est plus proche que (px)" -#: ui/BoxDynamicOpacityOptions.ui.h:7 -#, no-c-format +#: ui/BoxDynamicOpacityOptions.ui:69 msgid "Change opacity to (%)" msgstr "Changer l'opacité à (%)" -#: ui/BoxDynamicOpacityOptions.ui.h:8 ui/BoxShowApplicationsOptions.ui.h:3 -#: ui/BoxWindowPreviewOptions.ui.h:57 ui/SettingsStyle.ui.h:27 +#: ui/BoxDynamicOpacityOptions.ui:72 ui/BoxShowApplicationsOptions.ui:64 +#: ui/BoxWindowPreviewOptions.ui:468 ui/SettingsStyle.ui:266 +#: ui/SettingsStyle.ui:329 ui/SettingsStyle.ui:348 msgid "0" msgstr "0" -#: ui/BoxDynamicOpacityOptions.ui.h:9 +#: ui/BoxDynamicOpacityOptions.ui:82 msgid "Opacity change animation duration (ms)" msgstr "Durée de l'animation de changement d'opacité (ms)" -#: ui/BoxGroupAppsOptions.ui.h:1 +#: ui/BoxGroupAppsOptions.ui:32 msgid "Font size (px) of the application titles (default is 14)" msgstr "Taille (px) du texte des titres d'application (défaut: 14)" -#: ui/BoxGroupAppsOptions.ui.h:2 +#: ui/BoxGroupAppsOptions.ui:47 msgid "Font weight of application titles" msgstr "Épaisseur de la police du texte des titres d'application" -#: ui/BoxGroupAppsOptions.ui.h:3 ui/BoxWindowPreviewOptions.ui.h:44 +#: ui/BoxGroupAppsOptions.ui:52 ui/BoxWindowPreviewOptions.ui:402 msgid "inherit from theme" msgstr "hériter du thème" -#: ui/BoxGroupAppsOptions.ui.h:4 ui/BoxWindowPreviewOptions.ui.h:45 +#: ui/BoxGroupAppsOptions.ui:53 ui/BoxWindowPreviewOptions.ui:403 msgid "normal" msgstr "normale" -#: ui/BoxGroupAppsOptions.ui.h:5 ui/BoxWindowPreviewOptions.ui.h:46 +#: ui/BoxGroupAppsOptions.ui:54 ui/BoxWindowPreviewOptions.ui:404 msgid "lighter" msgstr "plus légere" -#: ui/BoxGroupAppsOptions.ui.h:6 ui/BoxWindowPreviewOptions.ui.h:47 +#: ui/BoxGroupAppsOptions.ui:55 ui/BoxWindowPreviewOptions.ui:405 msgid "bold" msgstr "grasse" -#: ui/BoxGroupAppsOptions.ui.h:7 ui/BoxWindowPreviewOptions.ui.h:48 +#: ui/BoxGroupAppsOptions.ui:56 ui/BoxWindowPreviewOptions.ui:406 msgid "bolder" msgstr "plus grasse" -#: ui/BoxGroupAppsOptions.ui.h:8 +#: ui/BoxGroupAppsOptions.ui:65 msgid "Font color of the application titles" msgstr "Couleur du texte des titres d'application" -#: ui/BoxGroupAppsOptions.ui.h:9 +#: ui/BoxGroupAppsOptions.ui:77 msgid "Font color of the minimized application titles" msgstr "Couleur du texte des titres d'application de fenêtres minimisées" -#: ui/BoxGroupAppsOptions.ui.h:10 +#: ui/BoxGroupAppsOptions.ui:95 msgid "Maximum width (px) of the application titles" msgstr "Longueur maximum (px) des titres d'application" -#: ui/BoxGroupAppsOptions.ui.h:11 +#: ui/BoxGroupAppsOptions.ui:96 msgid "(default is 160)" msgstr "(la valeur par défaut est 160)" -#: ui/BoxGroupAppsOptions.ui.h:12 +#: ui/BoxGroupAppsOptions.ui:111 msgid "Use a fixed width for the application titles" msgstr "Utiliser une largeur fixe pour les titres d'application" -#: ui/BoxGroupAppsOptions.ui.h:13 +#: ui/BoxGroupAppsOptions.ui:112 msgid "" "The application titles all have the same width, even if their texts are " "shorter than the maximum width. The maximum width value is used as the fixed " @@ -514,75 +540,75 @@ msgstr "" "plus petit que la taille maximum. La valeur maximale de longueur est " "utilisée comme longueur fixe." -#: ui/BoxGroupAppsOptions.ui.h:14 +#: ui/BoxGroupAppsOptions.ui:129 msgid "Display running indicators on unfocused applications" msgstr "Afficher des indicateurs sur les applications an arrière-plan" -#: ui/BoxGroupAppsOptions.ui.h:15 +#: ui/BoxGroupAppsOptions.ui:140 msgid "Use the favorite icons as application launchers" msgstr "Utiliser les applications favorites comme lanceurs" -#: ui/BoxIntellihideOptions.ui.h:1 +#: ui/BoxIntellihideOptions.ui:53 msgid "Only hide the panel when it is obstructed by windows" msgstr "Ne cacher le panneau que lorsqu'il est au-dessus d'une fenêtre" -#: ui/BoxIntellihideOptions.ui.h:2 +#: ui/BoxIntellihideOptions.ui:64 msgid "The panel hides from" msgstr "Le panneau se cache de" -#: ui/BoxIntellihideOptions.ui.h:6 +#: ui/BoxIntellihideOptions.ui:86 msgid "Require pressure at the edge of the screen to reveal the panel" msgstr "Requérir une pression sur le bord de l'écran pour afficher le panneau" -#: ui/BoxIntellihideOptions.ui.h:7 +#: ui/BoxIntellihideOptions.ui:97 msgid "Required pressure threshold (px)" msgstr "Seuil d'activation (px)" -#: ui/BoxIntellihideOptions.ui.h:8 +#: ui/BoxIntellihideOptions.ui:112 msgid "Required pressure timeout (ms)" msgstr "Délai d'activation (ms)" -#: ui/BoxIntellihideOptions.ui.h:9 +#: ui/BoxIntellihideOptions.ui:133 msgid "Allow the panel to be revealed while in fullscreen mode" msgstr "Permettre au panneau d'être affiché en mode plein écran" -#: ui/BoxIntellihideOptions.ui.h:10 +#: ui/BoxIntellihideOptions.ui:144 msgid "Only hide secondary panels" msgstr "Ne cacher que les panneaux secondaires" -#: ui/BoxIntellihideOptions.ui.h:11 +#: ui/BoxIntellihideOptions.ui:145 msgid "(requires multi-monitors option)" msgstr "(requiert l'option multi-écran)" -#: ui/BoxIntellihideOptions.ui.h:12 +#: ui/BoxIntellihideOptions.ui:156 msgid "Keyboard shortcut to reveal and hold the panel" msgstr "Raccourci clavier pour révéler et maintenir le panneau" -#: ui/BoxIntellihideOptions.ui.h:13 ui/BoxOverlayShortcut.ui.h:12 -msgid "Syntax: , , , " -msgstr "Syntaxe: , , , " +#: ui/BoxIntellihideOptions.ui:157 ui/BoxOverlayShortcut.ui:71 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Syntaxe: <Shift>, <Ctrl>, <Alt>, <Super>" -#: ui/BoxIntellihideOptions.ui.h:14 +#: ui/BoxIntellihideOptions.ui:162 msgid "e.g. i" msgstr "e.g. i" -#: ui/BoxIntellihideOptions.ui.h:15 +#: ui/BoxIntellihideOptions.ui:176 msgid "Hide and reveal animation duration (ms)" msgstr "Durée des animations d'affichage (ms)" -#: ui/BoxIntellihideOptions.ui.h:16 +#: ui/BoxIntellihideOptions.ui:191 msgid "Delay before hiding the panel (ms)" msgstr "Délai avant le masquage du panneau (ms)" -#: ui/BoxIntellihideOptions.ui.h:17 +#: ui/BoxIntellihideOptions.ui:207 msgid "Delay before enabling intellihide on start (ms)" msgstr "Délai avant l'activation du masquage intelligent (ms)" -#: ui/BoxMiddleClickOptions.ui.h:1 +#: ui/BoxMiddleClickOptions.ui:19 msgid "Shift+Click action" msgstr "Action Maj+Clic" -#: ui/BoxMiddleClickOptions.ui.h:2 +#: ui/BoxMiddleClickOptions.ui:20 msgid "" "When set to minimize, double clicking minimizes all the windows of the " "application." @@ -590,71 +616,78 @@ msgstr "" "Quand minimiser est sélectionné, un double-clic réduit toutes les fenêtres " "de l'application." -#: ui/BoxMiddleClickOptions.ui.h:3 ui/SettingsAction.ui.h:8 +#: ui/BoxMiddleClickOptions.ui:25 ui/BoxMiddleClickOptions.ui:53 +#: ui/BoxMiddleClickOptions.ui:81 ui/SettingsAction.ui:41 msgid "Raise windows" msgstr "Montrer les fenêtres" -#: ui/BoxMiddleClickOptions.ui.h:4 +#: ui/BoxMiddleClickOptions.ui:26 ui/BoxMiddleClickOptions.ui:54 +#: ui/BoxMiddleClickOptions.ui:82 msgid "Minimize window" msgstr "Réduire la fenêtre" -#: ui/BoxMiddleClickOptions.ui.h:5 ui/SettingsAction.ui.h:9 +#: ui/BoxMiddleClickOptions.ui:27 ui/BoxMiddleClickOptions.ui:55 +#: ui/BoxMiddleClickOptions.ui:83 ui/SettingsAction.ui:42 msgid "Launch new instance" msgstr "Lancer une nouvelle instance" -#: ui/BoxMiddleClickOptions.ui.h:6 ui/SettingsAction.ui.h:4 +#: ui/BoxMiddleClickOptions.ui:28 ui/BoxMiddleClickOptions.ui:56 +#: ui/BoxMiddleClickOptions.ui:84 ui/SettingsAction.ui:37 msgid "Cycle through windows" msgstr "Cycler sur les fenêtres" -#: ui/BoxMiddleClickOptions.ui.h:7 ui/SettingsAction.ui.h:3 +#: ui/BoxMiddleClickOptions.ui:29 ui/BoxMiddleClickOptions.ui:57 +#: ui/BoxMiddleClickOptions.ui:85 ui/SettingsAction.ui:36 msgid "Cycle windows + minimize" msgstr "Cycler sur les fenêtres + réduire" -#: ui/BoxMiddleClickOptions.ui.h:8 ui/SettingsAction.ui.h:5 +#: ui/BoxMiddleClickOptions.ui:30 ui/BoxMiddleClickOptions.ui:58 +#: ui/BoxMiddleClickOptions.ui:86 ui/SettingsAction.ui:38 msgid "Toggle single / Preview multiple" msgstr "Prévisualisation simple / multiple" -#: ui/BoxMiddleClickOptions.ui.h:9 ui/SettingsAction.ui.h:6 +#: ui/BoxMiddleClickOptions.ui:31 ui/BoxMiddleClickOptions.ui:59 +#: ui/BoxMiddleClickOptions.ui:87 ui/SettingsAction.ui:39 msgid "Toggle single / Cycle multiple" msgstr "Prévisualisation simple / cycle multiple" -#: ui/BoxMiddleClickOptions.ui.h:11 +#: ui/BoxMiddleClickOptions.ui:47 msgid "Middle-Click action" msgstr "Action clic molette" -#: ui/BoxMiddleClickOptions.ui.h:12 +#: ui/BoxMiddleClickOptions.ui:48 msgid "Behavior for Middle-Click." msgstr "Comportement du clic molette." -#: ui/BoxMiddleClickOptions.ui.h:13 +#: ui/BoxMiddleClickOptions.ui:75 msgid "Shift+Middle-Click action" msgstr "Action de Maj+Clic molette" -#: ui/BoxMiddleClickOptions.ui.h:14 +#: ui/BoxMiddleClickOptions.ui:76 msgid "Behavior for Shift+Middle-Click." msgstr "Comportement pour Maj+Clic molette." -#: ui/BoxOverlayShortcut.ui.h:1 +#: ui/BoxOverlayShortcut.ui:25 msgid "Hotkeys prefix" msgstr "Préfixe raccourcis" -#: ui/BoxOverlayShortcut.ui.h:2 +#: ui/BoxOverlayShortcut.ui:26 msgid "Hotkeys will either be Super+Number or Super+Alt+Num" msgstr "Les raccourcis seront soit Super+Numéro soit Super+Alt+Numéro" -#: ui/BoxOverlayShortcut.ui.h:3 +#: ui/BoxOverlayShortcut.ui:31 msgid "Super" msgstr "Super" -#: ui/BoxOverlayShortcut.ui.h:4 +#: ui/BoxOverlayShortcut.ui:32 msgid "Super + Alt" msgstr "Super + Alt" -#: ui/BoxOverlayShortcut.ui.h:5 +#: ui/BoxOverlayShortcut.ui:41 msgid "Number overlay" msgstr "Superposition des nombres" -#: ui/BoxOverlayShortcut.ui.h:6 +#: ui/BoxOverlayShortcut.ui:42 msgid "" "Temporarily show the application numbers over the icons when using the " "hotkeys." @@ -662,293 +695,294 @@ msgstr "" "Afficher temporairement les numéros des applications par dessus les icônes " "lors de l'utilisation des raccourcis." -#: ui/BoxOverlayShortcut.ui.h:7 +#: ui/BoxOverlayShortcut.ui:47 msgid "Never" msgstr "Jamais" -#: ui/BoxOverlayShortcut.ui.h:8 +#: ui/BoxOverlayShortcut.ui:48 msgid "Show temporarily" msgstr "Afficher temporairement" -#: ui/BoxOverlayShortcut.ui.h:9 +#: ui/BoxOverlayShortcut.ui:49 msgid "Always visible" msgstr "Toujours visible" -#: ui/BoxOverlayShortcut.ui.h:10 +#: ui/BoxOverlayShortcut.ui:58 msgid "Hide timeout (ms)" msgstr "Délai avant de cacher (ms)" -#: ui/BoxOverlayShortcut.ui.h:11 +#: ui/BoxOverlayShortcut.ui:70 msgid "Shortcut to show the overlay for 2 seconds" msgstr "Raccourci pour afficher la superposition pendant 2 secondes" -#: ui/BoxOverlayShortcut.ui.h:13 +#: ui/BoxOverlayShortcut.ui:76 msgid "e.g. q" msgstr "e.g. q" -#: ui/BoxOverlayShortcut.ui.h:14 +#: ui/BoxOverlayShortcut.ui:84 msgid "Show window previews on hotkey" msgstr "Afficher les aperçus des fenêtres lors de l'utilisation d'un raccourci" -#: ui/BoxOverlayShortcut.ui.h:15 +#: ui/BoxOverlayShortcut.ui:85 msgid "Show previews when the application have multiple instances" msgstr "" "Afficher les aperçus lorsque les applications possèdent plusieurs fenêtres" -#: ui/BoxOverlayShortcut.ui.h:16 +#: ui/BoxOverlayShortcut.ui:96 msgid "Hotkeys are activated with" msgstr "Les raccourcis sont activés par" -#: ui/BoxOverlayShortcut.ui.h:17 +#: ui/BoxOverlayShortcut.ui:97 msgid "Select which keyboard number keys are used to activate the hotkeys" msgstr "" "Sélectionner quelles touches numériques sont utilisées pour activer les " "raccourcis" -#: ui/BoxOverlayShortcut.ui.h:18 +#: ui/BoxOverlayShortcut.ui:102 msgid "Number row" msgstr "Rangée des chiffres" -#: ui/BoxOverlayShortcut.ui.h:19 +#: ui/BoxOverlayShortcut.ui:103 msgid "Numeric keypad" msgstr "Pavé numérique" -#: ui/BoxOverlayShortcut.ui.h:20 +#: ui/BoxOverlayShortcut.ui:104 msgid "Both" msgstr "Les deux" -#: ui/BoxScrollIconOptions.ui.h:1 ui/BoxScrollPanelOptions.ui.h:1 +#: ui/BoxScrollIconOptions.ui:25 ui/BoxScrollPanelOptions.ui:25 msgid "Delay between mouse scroll events (ms)" msgstr "Délai entre les évènements de défilement de la souris (ms)" -#: ui/BoxScrollIconOptions.ui.h:2 ui/BoxScrollPanelOptions.ui.h:2 +#: ui/BoxScrollIconOptions.ui:26 ui/BoxScrollPanelOptions.ui:26 msgid "Use this value to limit the number of captured mouse scroll events." msgstr "" "Utiliser cette valeur pour limiter le nombre d'évènements de défilement de " "la souris (ms)" -#: ui/BoxScrollPanelOptions.ui.h:3 +#: ui/BoxScrollPanelOptions.ui:42 msgid "Show popup when changing workspace" msgstr "Afficher l'indicateur de changement d'espace de travail" -#: ui/BoxScrollPanelOptions.ui.h:4 +#: ui/BoxScrollPanelOptions.ui:43 msgid "This affects workspace popup when scrolling on the panel only." msgstr "" "Affecte uniquement l'indicateur de changement d'espace de travail au " "défilement de la souris sur le panneau." -#: ui/BoxSecondaryMenuOptions.ui.h:1 +#: ui/BoxSecondaryMenuOptions.ui:19 msgid "Integrate AppMenu items" msgstr "Intégrer les actions du Menu d'applications" -#: ui/BoxSecondaryMenuOptions.ui.h:2 +#: ui/BoxSecondaryMenuOptions.ui:30 msgid "Show Details menu item" msgstr "Menu Afficher les détails" -#: ui/BoxShowApplicationsOptions.ui.h:1 +#: ui/BoxShowApplicationsOptions.ui:25 msgid "Show Applications icon" msgstr "Bouton Afficher les Applications" -#: ui/BoxShowApplicationsOptions.ui.h:2 +#: ui/BoxShowApplicationsOptions.ui:60 msgid "Show Applications icon side padding (px)" msgstr "Marge interne du bouton \"Afficher les Applications\"" -#: ui/BoxShowApplicationsOptions.ui.h:4 +#: ui/BoxShowApplicationsOptions.ui:73 msgid "Override escape key and return to desktop" msgstr "" "Remplacer l'action de la touche d'échappement et retourner sur le bureau" -#: ui/BoxShowDesktopOptions.ui.h:1 +#: ui/BoxShowDesktopOptions.ui:53 msgid "Override Show Desktop line color" msgstr "Remplacer la couleur de la ligne du bouton Afficher le Bureau" -#: ui/BoxShowDesktopOptions.ui.h:2 +#: ui/BoxShowDesktopOptions.ui:77 msgid "Reveal the desktop when hovering the Show Desktop button" msgstr "Révéler le bureau lors du survol du bouton Afficher le Bureau" -#: ui/BoxShowDesktopOptions.ui.h:3 +#: ui/BoxShowDesktopOptions.ui:90 msgid "Delay before revealing the desktop (ms)" msgstr "Délai avant affichage du bureau (ms)" -#: ui/BoxShowDesktopOptions.ui.h:4 +#: ui/BoxShowDesktopOptions.ui:106 msgid "Fade duration (ms)" msgstr "Durée du fondu (ms)" -#: ui/BoxWindowPreviewOptions.ui.h:1 +#: ui/BoxWindowPreviewOptions.ui:89 msgid "Time (ms) before showing" msgstr "Temps (ms) avant d'afficher" -#: ui/BoxWindowPreviewOptions.ui.h:2 +#: ui/BoxWindowPreviewOptions.ui:90 msgid "(400 is default)" msgstr "(400 par défaut)" -#: ui/BoxWindowPreviewOptions.ui.h:3 +#: ui/BoxWindowPreviewOptions.ui:105 msgid "Time (ms) before hiding" msgstr "Temps (ms) avant de cacher" -#: ui/BoxWindowPreviewOptions.ui.h:4 +#: ui/BoxWindowPreviewOptions.ui:106 msgid "(100 is default)" msgstr "(100 par défaut)" -#: ui/BoxWindowPreviewOptions.ui.h:5 +#: ui/BoxWindowPreviewOptions.ui:113 msgid "Immediate on application icon click" msgstr "Immédiat au clic d'application" -#: ui/BoxWindowPreviewOptions.ui.h:6 +#: ui/BoxWindowPreviewOptions.ui:134 msgid "Animation time (ms)" msgstr "Durée d'animation (ms)" -#: ui/BoxWindowPreviewOptions.ui.h:7 +#: ui/BoxWindowPreviewOptions.ui:155 msgid "Middle click on the preview to close the window" msgstr "Cliquez avec la molette sur la prévisualisation pour fermer la fenêtre" -#: ui/BoxWindowPreviewOptions.ui.h:8 +#: ui/BoxWindowPreviewOptions.ui:172 msgid "Window previews preferred size (px)" msgstr "Taille des prévisualisations de fenêtres (px)" -#: ui/BoxWindowPreviewOptions.ui.h:9 +#: ui/BoxWindowPreviewOptions.ui:188 msgid "Window previews aspect ratio X (width)" msgstr "Ratio d'aspect des prévisualisations (largeur)" -#: ui/BoxWindowPreviewOptions.ui.h:10 +#: ui/BoxWindowPreviewOptions.ui:193 ui/BoxWindowPreviewOptions.ui:234 msgid "1" msgstr "1" -#: ui/BoxWindowPreviewOptions.ui.h:11 +#: ui/BoxWindowPreviewOptions.ui:194 ui/BoxWindowPreviewOptions.ui:235 msgid "2" msgstr "2" -#: ui/BoxWindowPreviewOptions.ui.h:12 +#: ui/BoxWindowPreviewOptions.ui:195 ui/BoxWindowPreviewOptions.ui:236 msgid "3" msgstr "3" -#: ui/BoxWindowPreviewOptions.ui.h:13 +#: ui/BoxWindowPreviewOptions.ui:196 ui/BoxWindowPreviewOptions.ui:237 msgid "4" msgstr "4" -#: ui/BoxWindowPreviewOptions.ui.h:14 +#: ui/BoxWindowPreviewOptions.ui:197 ui/BoxWindowPreviewOptions.ui:238 +#: ui/BoxWindowPreviewOptions.ui:302 msgid "5" msgstr "5" -#: ui/BoxWindowPreviewOptions.ui.h:15 +#: ui/BoxWindowPreviewOptions.ui:198 ui/BoxWindowPreviewOptions.ui:239 msgid "6" msgstr "6" -#: ui/BoxWindowPreviewOptions.ui.h:16 +#: ui/BoxWindowPreviewOptions.ui:199 ui/BoxWindowPreviewOptions.ui:240 msgid "7" msgstr "7" -#: ui/BoxWindowPreviewOptions.ui.h:17 +#: ui/BoxWindowPreviewOptions.ui:200 ui/BoxWindowPreviewOptions.ui:241 msgid "8" msgstr "8" -#: ui/BoxWindowPreviewOptions.ui.h:18 +#: ui/BoxWindowPreviewOptions.ui:201 ui/BoxWindowPreviewOptions.ui:242 msgid "9" msgstr "9" -#: ui/BoxWindowPreviewOptions.ui.h:19 +#: ui/BoxWindowPreviewOptions.ui:202 ui/BoxWindowPreviewOptions.ui:243 msgid "10" msgstr "10" -#: ui/BoxWindowPreviewOptions.ui.h:20 +#: ui/BoxWindowPreviewOptions.ui:203 ui/BoxWindowPreviewOptions.ui:244 msgid "11" msgstr "11" -#: ui/BoxWindowPreviewOptions.ui.h:21 +#: ui/BoxWindowPreviewOptions.ui:204 ui/BoxWindowPreviewOptions.ui:245 msgid "12" msgstr "12" -#: ui/BoxWindowPreviewOptions.ui.h:22 +#: ui/BoxWindowPreviewOptions.ui:205 ui/BoxWindowPreviewOptions.ui:246 msgid "13" msgstr "13" -#: ui/BoxWindowPreviewOptions.ui.h:23 +#: ui/BoxWindowPreviewOptions.ui:206 ui/BoxWindowPreviewOptions.ui:247 msgid "14" msgstr "14" -#: ui/BoxWindowPreviewOptions.ui.h:24 +#: ui/BoxWindowPreviewOptions.ui:207 ui/BoxWindowPreviewOptions.ui:248 msgid "15" msgstr "15" -#: ui/BoxWindowPreviewOptions.ui.h:25 +#: ui/BoxWindowPreviewOptions.ui:208 ui/BoxWindowPreviewOptions.ui:249 msgid "16" msgstr "16" -#: ui/BoxWindowPreviewOptions.ui.h:26 +#: ui/BoxWindowPreviewOptions.ui:209 ui/BoxWindowPreviewOptions.ui:250 msgid "17" msgstr "17" -#: ui/BoxWindowPreviewOptions.ui.h:27 +#: ui/BoxWindowPreviewOptions.ui:210 ui/BoxWindowPreviewOptions.ui:251 msgid "18" msgstr "18" -#: ui/BoxWindowPreviewOptions.ui.h:28 +#: ui/BoxWindowPreviewOptions.ui:211 ui/BoxWindowPreviewOptions.ui:252 msgid "19" msgstr "19" -#: ui/BoxWindowPreviewOptions.ui.h:29 +#: ui/BoxWindowPreviewOptions.ui:212 ui/BoxWindowPreviewOptions.ui:253 msgid "20" msgstr "200" -#: ui/BoxWindowPreviewOptions.ui.h:30 +#: ui/BoxWindowPreviewOptions.ui:213 ui/BoxWindowPreviewOptions.ui:254 msgid "21" msgstr "21" -#: ui/BoxWindowPreviewOptions.ui.h:31 +#: ui/BoxWindowPreviewOptions.ui:219 ui/BoxWindowPreviewOptions.ui:260 msgid "Fixed" msgstr "Fixé" -#: ui/BoxWindowPreviewOptions.ui.h:32 +#: ui/BoxWindowPreviewOptions.ui:229 msgid "Window previews aspect ratio Y (height)" msgstr "Ratio d'aspect des prévisualisations (hauteur)" -#: ui/BoxWindowPreviewOptions.ui.h:33 +#: ui/BoxWindowPreviewOptions.ui:270 msgid "Window previews padding (px)" msgstr "Marge intérieure des prévisualisations (px)" -#: ui/BoxWindowPreviewOptions.ui.h:34 +#: ui/BoxWindowPreviewOptions.ui:292 msgid "Use custom opacity for the previews background" msgstr "Opacité personnalisée pour l'arrière plan des prévisualisations" -#: ui/BoxWindowPreviewOptions.ui.h:35 +#: ui/BoxWindowPreviewOptions.ui:293 msgid "" "If disabled, the previews background have the same opacity as the panel." msgstr "" "Si désactivé, les prévisualisations ont la même opacité que le panneau." -#: ui/BoxWindowPreviewOptions.ui.h:36 +#: ui/BoxWindowPreviewOptions.ui:318 msgid "Close button and header position" msgstr "Bouton de fermeture et position de l'en-tête" -#: ui/BoxWindowPreviewOptions.ui.h:39 +#: ui/BoxWindowPreviewOptions.ui:348 msgid "Display window preview headers" msgstr "Afficher le titre de la fenêtre dans la prévis." -#: ui/BoxWindowPreviewOptions.ui.h:40 +#: ui/BoxWindowPreviewOptions.ui:359 msgid "Icon size (px) of the window preview" msgstr "Taille (px) de l'icône des prévisualisations" -#: ui/BoxWindowPreviewOptions.ui.h:41 +#: ui/BoxWindowPreviewOptions.ui:360 msgid "If disabled, the previews icon size will be based on headerbar size" msgstr "Si désactivé, la taille de l'icône est basée sur celle de l'en-tête" -#: ui/BoxWindowPreviewOptions.ui.h:42 +#: ui/BoxWindowPreviewOptions.ui:381 msgid "Font size (px) of the preview titles" msgstr "Taille (px) du texte des prévisualisations" -#: ui/BoxWindowPreviewOptions.ui.h:43 +#: ui/BoxWindowPreviewOptions.ui:397 msgid "Font weight of the preview titles" msgstr "Épaisseur du texte des titres de prévisualisation" -#: ui/BoxWindowPreviewOptions.ui.h:49 +#: ui/BoxWindowPreviewOptions.ui:415 msgid "Font color of the preview titles" msgstr "Couleur du texte des titres de prévisualisation" -#: ui/BoxWindowPreviewOptions.ui.h:50 +#: ui/BoxWindowPreviewOptions.ui:433 msgid "Enable window peeking" msgstr "Activer la vue de fenêtre" -#: ui/BoxWindowPreviewOptions.ui.h:51 +#: ui/BoxWindowPreviewOptions.ui:434 msgid "" "When hovering over a window preview for some time, the window gets " "distinguished." @@ -956,11 +990,11 @@ msgstr "" "Le survol sur la prévisualisation de la fenêtre, pendant un certain temps, " "la met en avant." -#: ui/BoxWindowPreviewOptions.ui.h:52 +#: ui/BoxWindowPreviewOptions.ui:445 msgid "Enter window peeking mode timeout (ms)" msgstr "Temps d'attente avant activation de la vue fenêtre" -#: ui/BoxWindowPreviewOptions.ui.h:53 +#: ui/BoxWindowPreviewOptions.ui:446 msgid "" "Time of inactivity while hovering over a window preview needed to enter the " "window peeking mode." @@ -968,15 +1002,15 @@ msgstr "" "Temps d'inactivité pendant le survol de la prévisualisation d'une fenêtre " "nécessaire pour activer la vue de la fenêtre." -#: ui/BoxWindowPreviewOptions.ui.h:54 +#: ui/BoxWindowPreviewOptions.ui:451 msgid "50" msgstr "50" -#: ui/BoxWindowPreviewOptions.ui.h:55 +#: ui/BoxWindowPreviewOptions.ui:462 msgid "Window peeking mode opacity" msgstr "Opacité de la vue de fenêtre" -#: ui/BoxWindowPreviewOptions.ui.h:56 +#: ui/BoxWindowPreviewOptions.ui:463 msgid "" "All windows except for the peeked one have their opacity set to the same " "value." @@ -984,31 +1018,35 @@ msgstr "" "Toutes les fenêtres, mis à part celle prévisualisée, ont leur opacité mise à " "la même valeur." -#: ui/SettingsAbout.ui.h:1 +#: ui/SettingsAbout.ui:6 +msgid "About" +msgstr "À propos" + +#: ui/SettingsAbout.ui:12 msgid "Info" msgstr "Information" -#: ui/SettingsAbout.ui.h:2 +#: ui/SettingsAbout.ui:16 msgid "Version" msgstr "Version" -#: ui/SettingsAbout.ui.h:3 +#: ui/SettingsAbout.ui:27 msgid "Source" msgstr "Source" -#: ui/SettingsAbout.ui.h:4 +#: ui/SettingsAbout.ui:30 msgid "GitHub" msgstr "GitHub" -#: ui/SettingsAbout.ui.h:5 +#: ui/SettingsAbout.ui:45 msgid "Export and Import" msgstr "Import et export" -#: ui/SettingsAbout.ui.h:6 +#: ui/SettingsAbout.ui:49 msgid "Export and import settings" msgstr "Import et export de paramètres" -#: ui/SettingsAbout.ui.h:7 +#: ui/SettingsAbout.ui:50 msgid "" "Use the buttons below to create a settings file from your current " "preferences that can be imported on a different machine." @@ -1016,15 +1054,15 @@ msgstr "" "Utiliser les boutons ci-dessous pour créer un fichier de paramètres à partir " "de vos préférences actuelles qui pourra être importé sur une autre machine." -#: ui/SettingsAbout.ui.h:8 +#: ui/SettingsAbout.ui:66 msgid "Export to file" msgstr "Exporter vers un fichier" -#: ui/SettingsAbout.ui.h:9 +#: ui/SettingsAbout.ui:72 msgid "Import from file" msgstr "Importer à partir d'un fichier" -#: ui/SettingsAbout.ui.h:10 +#: ui/SettingsAbout.ui:89 msgid "" "This program comes with ABSOLUTELY NO WARRANTY.\n" "See the Licence publique générale GNU, version 2 ou " "ultérieure" -#: ui/SettingsAction.ui.h:1 +#: ui/SettingsAction.ui:6 +msgid "Action" +msgstr "Action" + +#: ui/SettingsAction.ui:12 ui/SettingsAction.ui:16 msgid "Click action" msgstr "Action du clic" -#: ui/SettingsAction.ui.h:2 +#: ui/SettingsAction.ui:17 msgid "Behaviour when clicking on the icon of a running application." msgstr "Comportement lors du clic sur l'icône d'une application lancée." -#: ui/SettingsAction.ui.h:7 +#: ui/SettingsAction.ui:40 msgid "Toggle windows" msgstr "Basculer les fenêtres" -#: ui/SettingsAction.ui.h:10 +#: ui/SettingsAction.ui:55 msgid "Scroll action" msgstr "Action du défilement de la souris" -#: ui/SettingsAction.ui.h:11 +#: ui/SettingsAction.ui:59 msgid "Scroll panel action" msgstr "Action du défilement de la souris sur le panneau" -#: ui/SettingsAction.ui.h:12 +#: ui/SettingsAction.ui:60 msgid "Behavior when mouse scrolling over the panel." msgstr "Comportement lors du défilement de la souris sur le panneau" -#: ui/SettingsAction.ui.h:13 +#: ui/SettingsAction.ui:84 ui/SettingsAction.ui:118 msgid "Do nothing" msgstr "Ne rien faire" -#: ui/SettingsAction.ui.h:14 +#: ui/SettingsAction.ui:85 msgid "Switch workspace" msgstr "Défiler les espaces de travail" -#: ui/SettingsAction.ui.h:15 +#: ui/SettingsAction.ui:86 ui/SettingsAction.ui:119 msgid "Cycle windows" msgstr "Défiler les fenêtres" -#: ui/SettingsAction.ui.h:16 +#: ui/SettingsAction.ui:87 msgid "Change volume" msgstr "Changer le volume" -#: ui/SettingsAction.ui.h:17 +#: ui/SettingsAction.ui:96 msgid "Scroll icon action" msgstr "Action du défilement de la souris sur une application" -#: ui/SettingsAction.ui.h:18 +#: ui/SettingsAction.ui:97 msgid "Behavior when mouse scrolling over an application icon." msgstr "Comportement lors du défilement de la souris sur une application" -#: ui/SettingsAction.ui.h:19 +#: ui/SettingsAction.ui:120 msgid "Same as panel" msgstr "Comme le panneau" -#: ui/SettingsAction.ui.h:20 +#: ui/SettingsAction.ui:133 msgid "Hotkey overlay" msgstr "Superposition des nombres" -#: ui/SettingsAction.ui.h:21 +#: ui/SettingsAction.ui:137 msgid "Use hotkeys to activate apps" msgstr "Utiliser des raccourcis pour lancer les applications" -#: ui/SettingsAction.ui.h:22 +#: ui/SettingsAction.ui:138 msgid "" "Enable Super+(0-9) as shortcuts to activate apps. It can also be used " "together with Shift and Ctrl." @@ -1103,347 +1145,364 @@ msgstr "" "Activer Super+(0-9) comme raccourcis pour lancer les applications. Maj et " "Ctrl peuvent aussi être utilisés." -#: ui/SettingsBehavior.ui.h:1 +#: ui/SettingsBehavior.ui:5 +msgid "Behavior" +msgstr "Comportement" + +#: ui/SettingsBehavior.ui:11 msgid "Applications" msgstr "Applications" -#: ui/SettingsBehavior.ui.h:2 +#: ui/SettingsBehavior.ui:15 msgid "Show favorite applications" msgstr "Afficher les applications favorites" -#: ui/SettingsBehavior.ui.h:3 +#: ui/SettingsBehavior.ui:26 msgid "Show favorite applications on secondary panels" msgstr "Afficher les applications favorites sur les panneaux secondaires" -#: ui/SettingsBehavior.ui.h:4 +#: ui/SettingsBehavior.ui:37 msgid "Show running applications" msgstr "Afficher les applications ouvertes" -#: ui/SettingsBehavior.ui.h:5 -msgid "Show AppMenu button" -msgstr "Afficher le bouton Menu d'Applications" - -#: ui/SettingsBehavior.ui.h:6 +#: ui/SettingsBehavior.ui:48 msgid "Ungroup applications" msgstr "Dégrouper les applications" -#: ui/SettingsBehavior.ui.h:7 +#: ui/SettingsBehavior.ui:73 msgid "Show notification counter badge" msgstr "Afficher le nombre de notifications" -#: ui/SettingsBehavior.ui.h:8 +#: ui/SettingsBehavior.ui:90 +msgid "Hover" +msgstr "Survol" + +#: ui/SettingsBehavior.ui:94 msgid "Show window previews on hover" msgstr "Afficher les aperçus des fenêtres lors du survol" -#: ui/SettingsBehavior.ui.h:9 +#: ui/SettingsBehavior.ui:119 msgid "Show tooltip on hover" msgstr "Afficher les bulles d'info. lors du survol" -#: ui/SettingsBehavior.ui.h:10 +#: ui/SettingsBehavior.ui:134 msgid "Isolate" msgstr "Isolation" -#: ui/SettingsBehavior.ui.h:11 +#: ui/SettingsBehavior.ui:138 msgid "Isolate Workspaces" msgstr "Isoler les espaces de travail" -#: ui/SettingsBehavior.ui.h:12 +#: ui/SettingsBehavior.ui:149 msgid "Isolate monitors" msgstr "Isoler les écrans" -#: ui/SettingsBehavior.ui.h:13 +#: ui/SettingsBehavior.ui:164 msgid "Overview" msgstr "Activités" -#: ui/SettingsBehavior.ui.h:14 +#: ui/SettingsBehavior.ui:168 msgid "Click empty space to close overview" msgstr "Clic région vide pour fermer Activités" -#: ui/SettingsBehavior.ui.h:15 +#: ui/SettingsBehavior.ui:179 msgid "Disable show overview on startup" msgstr "Désactiver le démarrage en mode Activités" -#: ui/SettingsFineTune.ui.h:1 +#: ui/SettingsFineTune.ui:41 +msgid "Fine-Tune" +msgstr "Personnalisation" + +#: ui/SettingsFineTune.ui:47 msgid "Font size" msgstr "Taille de la police" -#: ui/SettingsFineTune.ui.h:2 +#: ui/SettingsFineTune.ui:51 msgid "Tray Font Size" msgstr "Taille de la police des éléments de la barre d'état" -#: ui/SettingsFineTune.ui.h:3 +#: ui/SettingsFineTune.ui:52 ui/SettingsFineTune.ui:70 msgid "(0 = theme default)" msgstr "(0 = par défaut)" -#: ui/SettingsFineTune.ui.h:4 +#: ui/SettingsFineTune.ui:69 msgid "LeftBox Font Size" msgstr "Taille de la police de la zone de gauche" -#: ui/SettingsFineTune.ui.h:5 +#: ui/SettingsFineTune.ui:91 msgid "Padding" msgstr "Marge" -#: ui/SettingsFineTune.ui.h:6 +#: ui/SettingsFineTune.ui:95 msgid "Tray Item Padding" msgstr "Marge des éléments de la barre d'état" -#: ui/SettingsFineTune.ui.h:7 +#: ui/SettingsFineTune.ui:96 ui/SettingsFineTune.ui:114 +#: ui/SettingsFineTune.ui:132 msgid "(-1 = theme default)" msgstr "(-1 = par défaut)" -#: ui/SettingsFineTune.ui.h:8 +#: ui/SettingsFineTune.ui:113 msgid "Status Icon Padding" msgstr "Marge des icônes de statut" -#: ui/SettingsFineTune.ui.h:9 +#: ui/SettingsFineTune.ui:131 msgid "LeftBox Padding" msgstr "Marge de la zone de gauche" -#: ui/SettingsFineTune.ui.h:10 +#: ui/SettingsFineTune.ui:153 msgid "Animate" msgstr "Animation" -#: ui/SettingsFineTune.ui.h:11 +#: ui/SettingsFineTune.ui:157 msgid "Animate switching applications" msgstr "Animer le changement d'application" -#: ui/SettingsFineTune.ui.h:12 +#: ui/SettingsFineTune.ui:168 msgid "Animate launching new windows" msgstr "Animer le lancement de nouvelles fenêtres" -#: ui/SettingsFineTune.ui.h:13 +#: ui/SettingsFineTune.ui:183 msgid "Gnome functionality" msgstr "Fonctionnalités Gnome" -#: ui/SettingsFineTune.ui.h:14 +#: ui/SettingsFineTune.ui:187 msgid "Keep original gnome-shell dash" msgstr "Garder le lanceur d'origine de gnome-shell (Activités)" -#: ui/SettingsFineTune.ui.h:15 +#: ui/SettingsFineTune.ui:188 msgid "(overview)" msgstr "(activités)" -#: ui/SettingsFineTune.ui.h:16 +#: ui/SettingsFineTune.ui:199 msgid "Keep original gnome-shell top panel" msgstr "Garder le panneau d'origine de gnome-shell" -#: ui/SettingsFineTune.ui.h:17 +#: ui/SettingsFineTune.ui:210 msgid "Activate panel menu buttons on click only" msgstr "Activer les menus du panneau seulement au clic" -#: ui/SettingsFineTune.ui.h:18 +#: ui/SettingsFineTune.ui:211 msgid "(e.g. date menu)" msgstr "(exemple: horloge)" -#: ui/SettingsFineTune.ui.h:19 +#: ui/SettingsFineTune.ui:222 msgid "Force Activities hot corner on primary monitor" msgstr "Forcer le coin actif des Activités sur l'écran principal" -#: ui/SettingsFineTune.ui.h:20 +#: ui/SettingsFineTune.ui:240 msgid "App icon secondary menu" msgstr "Menu secondaire de l'application" -#: ui/SettingsFineTune.ui.h:21 +#: ui/SettingsFineTune.ui:241 msgid "(right-click menu)" msgstr "(clic droit)" -#: ui/SettingsPosition.ui.h:1 +#: ui/SettingsPosition.ui:19 +msgid "Position" +msgstr "Position" + +#: ui/SettingsPosition.ui:25 msgid "Panel" msgstr "Panneau" -#: ui/SettingsPosition.ui.h:2 +#: ui/SettingsPosition.ui:29 msgid "Display the main panel on" msgstr "Afficher le panneau principal sur" -#: ui/SettingsPosition.ui.h:3 +#: ui/SettingsPosition.ui:40 msgid "Display panels on all monitors" msgstr "Afficher le panneau principal sur tous les écrans" -#: ui/SettingsPosition.ui.h:4 +#: ui/SettingsPosition.ui:56 msgid "Panel Intellihide" msgstr "Masquage intelligent du panneau" -#: ui/SettingsPosition.ui.h:5 +#: ui/SettingsPosition.ui:57 msgid "Hide and reveal the panel according to preferences" msgstr "Afficher/Cacher le panneau selon les préférences" -#: ui/SettingsPosition.ui.h:6 +#: ui/SettingsPosition.ui:86 msgid "Order and Position on monitors" msgstr "Ordre et positions de l'écran" -#: ui/SettingsPosition.ui.h:7 +#: ui/SettingsPosition.ui:91 msgid "Monitor" msgstr "Écran" -#: ui/SettingsPosition.ui.h:8 +#: ui/SettingsPosition.ui:100 msgid "Apply changes to all monitors" msgstr "Appliquer les changements sur tous les écrans" -#: ui/SettingsPosition.ui.h:9 +#: ui/SettingsPosition.ui:127 msgid "Panel screen position" msgstr "Position du panneau" -#: ui/SettingsPosition.ui.h:14 +#: ui/SettingsPosition.ui:169 msgid "Panel thickness" msgstr "Taille du panneau" -#: ui/SettingsPosition.ui.h:15 +#: ui/SettingsPosition.ui:170 msgid "(default is 48)" msgstr "(la valeur par défaut est 48)" -#: ui/SettingsPosition.ui.h:17 -#, no-c-format +#: ui/SettingsPosition.ui:187 msgid "Panel length (%)" msgstr "Longueur du panneau (%)" -#: ui/SettingsPosition.ui.h:18 +#: ui/SettingsPosition.ui:188 msgid "(default is 100)" msgstr "(la valeur par défaut est 100)" -#: ui/SettingsPosition.ui.h:19 +#: ui/SettingsPosition.ui:204 msgid "Anchor" msgstr "Ancrage" -#: ui/SettingsPosition.ui.h:23 +#: ui/SettingsPosition.ui:227 msgid "Taskbar Display" msgstr "Affichage de la barre des tâches" -#: ui/SettingsStyle.ui.h:1 +#: ui/SettingsStyle.ui:38 +msgid "Style" +msgstr "Style" + +#: ui/SettingsStyle.ui:44 msgid "AppIcon style" msgstr "Style des icônes d'application" -#: ui/SettingsStyle.ui.h:2 +#: ui/SettingsStyle.ui:48 msgid "App Icon Margin" msgstr "Marge ext. de l'icône d'application" -#: ui/SettingsStyle.ui.h:3 +#: ui/SettingsStyle.ui:49 msgid "(default is 8)" msgstr "(la valeur par défaut est 8)" -#: ui/SettingsStyle.ui.h:4 +#: ui/SettingsStyle.ui:66 msgid "App Icon Padding" msgstr "Marge int. de l'icône d'application" -#: ui/SettingsStyle.ui.h:5 +#: ui/SettingsStyle.ui:67 msgid "(default is 4)" msgstr "(la valeur par défaut est 4)" -#: ui/SettingsStyle.ui.h:6 +#: ui/SettingsStyle.ui:84 msgid "Animate hovering app icons" msgstr "Animer le survol des icônes d'application" -#: ui/SettingsStyle.ui.h:7 +#: ui/SettingsStyle.ui:109 +msgid "Icon style" +msgstr "Style d'icône" + +#: ui/SettingsStyle.ui:114 +msgid "Normal" +msgstr "Normal" + +#: ui/SettingsStyle.ui:115 +msgid "Symbolic" +msgstr "Symbolique" + +#: ui/SettingsStyle.ui:127 msgid "Running indicator" msgstr "Position de l'indicateur d'activité" -#: ui/SettingsStyle.ui.h:8 +#: ui/SettingsStyle.ui:131 msgid "Running indicator position" msgstr "Position de l'indicateur d'activité" -#: ui/SettingsStyle.ui.h:13 +#: ui/SettingsStyle.ui:168 msgid "Running indicator style (Focused app)" msgstr "Style de l'indicateur d'activité (Application active)" -#: ui/SettingsStyle.ui.h:14 +#: ui/SettingsStyle.ui:186 ui/SettingsStyle.ui:206 msgid "Dots" msgstr "Points" -#: ui/SettingsStyle.ui.h:15 +#: ui/SettingsStyle.ui:187 ui/SettingsStyle.ui:207 msgid "Squares" msgstr "Carrés" -#: ui/SettingsStyle.ui.h:16 +#: ui/SettingsStyle.ui:188 ui/SettingsStyle.ui:208 msgid "Dashes" msgstr "Traits" -#: ui/SettingsStyle.ui.h:17 +#: ui/SettingsStyle.ui:189 ui/SettingsStyle.ui:209 msgid "Segmented" msgstr "Segmenté" -#: ui/SettingsStyle.ui.h:18 +#: ui/SettingsStyle.ui:190 ui/SettingsStyle.ui:210 msgid "Solid" msgstr "Solide" -#: ui/SettingsStyle.ui.h:19 +#: ui/SettingsStyle.ui:191 ui/SettingsStyle.ui:211 msgid "Ciliora" msgstr "Ciliora" -#: ui/SettingsStyle.ui.h:20 +#: ui/SettingsStyle.ui:192 ui/SettingsStyle.ui:212 msgid "Metro" msgstr "Metro" -#: ui/SettingsStyle.ui.h:21 +#: ui/SettingsStyle.ui:201 msgid "Running indicator style (Unfocused apps)" msgstr "Style de l'indicateur d'activité (Applications inactives)" -#: ui/SettingsStyle.ui.h:22 +#: ui/SettingsStyle.ui:225 msgid "Panel style" msgstr "Style du panneau" -#: ui/SettingsStyle.ui.h:23 +#: ui/SettingsStyle.ui:229 msgid "Override panel theme background color" msgstr "Remplacer la couleur de fond du thème du panneau" -#: ui/SettingsStyle.ui.h:24 +#: ui/SettingsStyle.ui:251 msgid "Override panel theme background opacity" msgstr "Remplacer l'opacité du thème du panneau" -#: ui/SettingsStyle.ui.h:26 -#, no-c-format +#: ui/SettingsStyle.ui:262 msgid "Panel background opacity (%)" msgstr "Opacité du fond du panneau" -#: ui/SettingsStyle.ui.h:28 +#: ui/SettingsStyle.ui:275 msgid "Dynamic background opacity" msgstr "Opacité de fond dynamique" -#: ui/SettingsStyle.ui.h:29 +#: ui/SettingsStyle.ui:276 msgid "Change opacity when a window gets close to the panel" msgstr "Changer l'opacité lorsqu'une fenêtre s'approche du panneau" -#: ui/SettingsStyle.ui.h:30 +#: ui/SettingsStyle.ui:308 msgid "Override panel theme gradient" msgstr "Remplacer le gradient du thème du panneau" -#: ui/SettingsStyle.ui.h:32 -#, no-c-format +#: ui/SettingsStyle.ui:319 msgid "Gradient top color and opacity (%)" msgstr "Couleur et opacité (%) du haut du gradient" -#: ui/SettingsStyle.ui.h:34 -#, no-c-format +#: ui/SettingsStyle.ui:338 msgid "Gradient bottom color and opacity (%)" msgstr "Couleur et opacité (%) du bas du gradient" +#: windowPreview.js:938 +msgid "Move to current Workspace" +msgstr "Déplacer vers l'espace de travail courrant" + +#~ msgid "Windows" +#~ msgstr "Fenêtres" + +#~ msgid "Show AppMenu button" +#~ msgstr "Afficher le bouton Menu d'Applications" + #~ msgid "Current Show Applications icon" #~ msgstr "Icône Afficher les Applications actuelle" #~ msgid "Custom Show Applications image icon" #~ msgstr "Icône d'affichage des applications personnalisée" -#~ msgid "Position" -#~ msgstr "Position" - -#~ msgid "Style" -#~ msgstr "Style" - #~ msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" #~ msgstr "" #~ "Barre supérieure > Afficher le menu de l'application doit être activé " #~ "dans Ajustements" -#~ msgid "Behavior" -#~ msgstr "Comportement" - -#~ msgid "Action" -#~ msgstr "Action" - -#~ msgid "Fine-Tune" -#~ msgstr "Personnalisation" - -#~ msgid "About" -#~ msgstr "À propos" - #~ msgid "Show Details" #~ msgstr "Afficher les détails" From 4958d928c1c32594e6db95c618f068ff425a7d39 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Sat, 18 Jan 2025 19:54:30 -0500 Subject: [PATCH 13/18] Reset appicon container size cache on fullscreen exit #2129 --- appIcons.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/appIcons.js b/appIcons.js index 66c43d3..d026af8 100644 --- a/appIcons.js +++ b/appIcons.js @@ -215,6 +215,16 @@ export const TaskbarAppIcon = GObject.registerClass({ this._titleWindowChangeId = 0; this._minimizedWindowChangeId = 0; + + this._fullscreenId = Utils.DisplayWrapper.getScreen().connect('in-fullscreen-changed', () => { + if ( + global.display.focus_window?.get_monitor() == this.dtpPanel.monitor.index && + !this.dtpPanel.monitor.inFullscreen + ) { + this._resetDots(true); + this._displayProperIndicator(); + } + }) } else { this._titleWindowChangeId = this.window.connect('notify::title', this._updateWindowTitle.bind(this)); @@ -358,6 +368,9 @@ export const TaskbarAppIcon = GObject.registerClass({ if(this._focusWindowChangedId) global.display.disconnect(this._focusWindowChangedId); + if (this._fullscreenId) + Utils.DisplayWrapper.getScreen().disconnect(this._fullscreenId); + if(this._titleWindowChangeId) this.window.disconnect(this._titleWindowChangeId); @@ -588,7 +601,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._dotsContainer.add_child(this._focusedDots); } - _resetDots() { + _resetDots(ignoreSizeReset) { let position = SETTINGS.get_string('dot-position'); let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; let sizeProp = isHorizontalDots ? 'width' : 'height'; @@ -600,13 +613,15 @@ export const TaskbarAppIcon = GObject.registerClass({ [, this._containerSize] = this._container[`get_preferred_${sizeProp}`](-1); - [this._focusedDots, this._unfocusedDots].forEach(d => { - d.set_size(-1, -1); - d.x_expand = d.y_expand = false; + if (!ignoreSizeReset) { + [this._focusedDots, this._unfocusedDots].forEach(d => { + d.set_size(-1, -1); + d.x_expand = d.y_expand = false; - d[sizeProp] = 1; - d[(isHorizontalDots ? 'y' : 'x') + '_expand'] = true; - }); + d[sizeProp] = 1; + d[(isHorizontalDots ? 'y' : 'x') + '_expand'] = true; + }); + } } _settingsChangeRefresh() { From 63af1816d825206630b44dd653f6722f126fb305 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Sun, 19 Jan 2025 11:42:34 -0500 Subject: [PATCH 14/18] Hide preview menu container #2183 --- windowPreview.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windowPreview.js b/windowPreview.js index f0a2741..cbbdf1a 100644 --- a/windowPreview.js +++ b/windowPreview.js @@ -188,7 +188,7 @@ export const PreviewMenu = GObject.registerClass({ this._refreshGlobals(); this.set_height(this.clipHeight); - this.menu.show(); + this.show(); setStyle(this.menu, 'background: ' + Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, alphaBg)); } @@ -298,7 +298,7 @@ export const PreviewMenu = GObject.registerClass({ } _resetHiddenState() { - this.menu.hide(); + this.hide(); this.set_height(0); this._setOpenedState(false); this.menu.opacity = 0; From 38da0cac973b0e6a297fe951e2a6dfb3d4b8ac95 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Sun, 19 Jan 2025 13:40:05 -0500 Subject: [PATCH 15/18] Update overview workarea on monitor focus change #2183 --- overview.js | 2 +- panelManager.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/overview.js b/overview.js index 7df5d6f..79b7ba9 100644 --- a/overview.js +++ b/overview.js @@ -128,7 +128,7 @@ export const Overview = class { else box[focusedPanel.fixedCoord.c1] += size } else if (isBottom) - // The default overview allocation is very good and takes into account external + // The default overview allocation takes into account external // struts, everywhere but the bottom where the dash is usually fixed anyway. // If there is a bottom panel under the dash location, give it some space here box.y2 -= focusedPanel.geom.h diff --git a/panelManager.js b/panelManager.js index 51c0774..43e93b4 100755 --- a/panelManager.js +++ b/panelManager.js @@ -328,6 +328,14 @@ export const PanelManager = class { Main.overview._overview.add_constraint(new Layout.MonitorConstraint({ index: monitor.index })); Main.overview._overview._controls._workspacesDisplay._primaryIndex = monitor.index; + + // https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2395 + // The overview allocation used to calculate its workarea based on the monitor where the overview + // was displayed, but it got changed back to always use the primary monitor. So now, temporarily assign + // the primary monitor to dtp focused monitor while recalculating the overview workarea + Main.layoutManager.primaryMonitor = monitor + Main.overview._overview._controls.layout_manager._updateWorkAreaBox() + Main.layoutManager.primaryMonitor = Main.layoutManager.monitors[Main.layoutManager.primaryIndex] } } From c3fc8fa4ee00845fcd8c1c6219ed37cd358a5363 Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:59:16 +0200 Subject: [PATCH 16/18] Beautify DTP - Allow hover animation travel below 0% - Allow hover animation zoom below 100% - Hover highlighting independent of hover animation - Custom color for hover highlighting - Custom color for mouse down highlighting - Icon background with rounded corners - Customize margin for app icons towards screen border and desktop --- appIcons.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appIcons.js b/appIcons.js index d026af8..16c5b64 100644 --- a/appIcons.js +++ b/appIcons.js @@ -218,7 +218,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._fullscreenId = Utils.DisplayWrapper.getScreen().connect('in-fullscreen-changed', () => { if ( - global.display.focus_window?.get_monitor() == this.dtpPanel.monitor.index && + global.display.focus_window?.get_monitor() == this.dtpPanel.monitor.index && !this.dtpPanel.monitor.inFullscreen ) { this._resetDots(true); From e64f3b437e7217947fa1f18146d944563e8c4fd9 Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:21:12 +0100 Subject: [PATCH 17/18] Beautify DTP - Remove dead/future code in order to re-add it when support for GTK variables arrives - This fixes the "Ignoring length property that isn't a number" warnings --- appIcons.js | 279 ++++++++++++++++++++++++------------------------- stylesheet.css | 4 - 2 files changed, 135 insertions(+), 148 deletions(-) diff --git a/appIcons.js b/appIcons.js index 16c5b64..0fb66d1 100644 --- a/appIcons.js +++ b/appIcons.js @@ -40,14 +40,14 @@ import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; import * as Util from 'resource:///org/gnome/shell/misc/util.js'; import * as BoxPointer from 'resource:///org/gnome/shell/ui/boxpointer.js'; -import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js'; +import { EventEmitter } from 'resource:///org/gnome/shell/misc/signals.js'; import * as Utils from './utils.js'; import * as PanelSettings from './panelSettings.js'; import * as Taskbar from './taskbar.js'; import * as Progress from './progress.js'; -import {DTP_EXTENSION, SETTINGS, DESKTOPSETTINGS, TERMINALSETTINGS, EXTENSION_PATH} from './extension.js'; -import {gettext as _, ngettext} from 'resource:///org/gnome/shell/extensions/extension.js'; +import { DTP_EXTENSION, SETTINGS, DESKTOPSETTINGS, TERMINALSETTINGS, EXTENSION_PATH } from './extension.js'; +import { gettext as _, ngettext } from 'resource:///org/gnome/shell/extensions/extension.js'; //timeout names const T2 = 'mouseScrollTimeout'; @@ -127,7 +127,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._timeoutsHandler = new Utils.TimeoutsHandler(); // Fix touchscreen issues before the listener is added by the parent constructor. - this._onTouchEvent = function(actor, event) { + this._onTouchEvent = function (actor, event) { if (event.type() == Clutter.EventType.TOUCH_BEGIN) { // Open the popup menu on long press. this._setPopupTimeout(); @@ -141,7 +141,7 @@ export const TaskbarAppIcon = GObject.registerClass({ return Clutter.EVENT_STOP; }; // Hack for missing TOUCH_END event. - this._onLeaveEvent = function(actor, event) { + this._onLeaveEvent = function (actor, event) { this.fake_release(); if (this._menuTimeoutId != 0) this.activate(1); // Activate/launch the application if TOUCH_END didn't fire. this._removeMenuTimeout(); @@ -190,7 +190,7 @@ export const TaskbarAppIcon = GObject.registerClass({ // Monitor windows-changes instead of app state. // Keep using the same Id and function callback (that is extended) - if(this._stateChangedId > 0) { + if (this._stateChangedId > 0) { this.app.disconnect(this._stateChangedId); this._stateChangedId = 0; } @@ -202,7 +202,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._showDots(); this._focusWindowChangedId = global.display.connect('notify::focus-window', - this._onFocusAppChanged.bind(this)); + this._onFocusAppChanged.bind(this)); this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; this._stateChangedId = this.app.connect('windows-changed', this.onWindowsChanged.bind(this)); @@ -227,25 +227,25 @@ export const TaskbarAppIcon = GObject.registerClass({ }) } else { this._titleWindowChangeId = this.window.connect('notify::title', - this._updateWindowTitle.bind(this)); + this._updateWindowTitle.bind(this)); this._minimizedWindowChangeId = this.window.connect('notify::minimized', - this._updateWindowTitleStyle.bind(this)); + this._updateWindowTitleStyle.bind(this)); } this._scrollEventId = this.connect('scroll-event', this._onMouseScroll.bind(this)); this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', - this._onOverviewWindowDragEnd.bind(this)); + this._onOverviewWindowDragEnd.bind(this)); this._switchWorkspaceId = global.window_manager.connect('switch-workspace', - this._onSwitchWorkspace.bind(this)); + this._onSwitchWorkspace.bind(this)); this._hoverChangeId = this.connect('notify::hover', () => this._onAppIconHoverChanged()); - if (!this._checkGtkVersion_cssVariables()) { - this._hoverChangeId2 = this.connect('notify::hover', () => this._onAppIconHoverChanged_GtkWorkaround()); - this._pressedChangedId = this.connect('notify::pressed', () => this._onAppIconPressedChanged_GtkWorkaround()); - } + + this._hoverChangeId2 = this.connect('notify::hover', () => this._onAppIconHoverChanged_GtkWorkaround()); + this._pressedChangedId = this.connect('notify::pressed', () => this._onAppIconPressedChanged_GtkWorkaround()); + this._dtpSettingsSignalIds = [ SETTINGS.connect('changed::animate-appicon-hover', this._onAnimateAppiconHoverChanged.bind(this)), @@ -282,11 +282,10 @@ export const TaskbarAppIcon = GObject.registerClass({ SETTINGS.connect('changed::group-apps-underline-unfocused', this._settingsChangeRefresh.bind(this)), ]; - if (!this._checkGtkVersion_cssVariables()) { - this._dtpSettingsSignalIds = this._dtpSettingsSignalIds.concat([ - SETTINGS.connect('changed::highlight-appicon-hover-border-radius', () => this._setIconStyle(this._isFocusedWindow())), - ]); - } + this._dtpSettingsSignalIds = this._dtpSettingsSignalIds.concat([ + SETTINGS.connect('changed::highlight-appicon-hover-border-radius', () => this._setIconStyle(this._isFocusedWindow())), + ]); + this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); @@ -327,12 +326,12 @@ export const TaskbarAppIcon = GObject.registerClass({ shouldShowTooltip() { if (!SETTINGS.get_boolean('show-tooltip') || (!this.isLauncher && SETTINGS.get_boolean("show-window-previews") && - this.getAppIconInterestingWindows().length > 0)) { + this.getAppIconInterestingWindows().length > 0)) { return false; } else { return this.hover && !this.window && - (!this._menu || !this._menu.isOpen) && - (this._previewMenu.getCurrentAppIcon() !== this); + (!this._menu || !this._menu.isOpen) && + (this._previewMenu.getCurrentAppIcon() !== this); } } @@ -362,19 +361,19 @@ export const TaskbarAppIcon = GObject.registerClass({ this._stateChangedId = 0; } - if(this._overviewWindowDragEndId) + if (this._overviewWindowDragEndId) Main.overview.disconnect(this._overviewWindowDragEndId); - if(this._focusWindowChangedId) + if (this._focusWindowChangedId) global.display.disconnect(this._focusWindowChangedId); if (this._fullscreenId) Utils.DisplayWrapper.getScreen().disconnect(this._fullscreenId); - if(this._titleWindowChangeId) + if (this._titleWindowChangeId) this.window.disconnect(this._titleWindowChangeId); - if(this._minimizedWindowChangeId) + if (this._minimizedWindowChangeId) this.window.disconnect(this._minimizedWindowChangeId); if (this._windowEnteredMonitorId) { @@ -382,10 +381,10 @@ export const TaskbarAppIcon = GObject.registerClass({ Utils.DisplayWrapper.getScreen().disconnect(this._windowLeftMonitorId); } - if(this._switchWorkspaceId) + if (this._switchWorkspaceId) global.window_manager.disconnect(this._switchWorkspaceId); - if(this._scaleFactorChangedId) + if (this._scaleFactorChangedId) Utils.getStageTheme().disconnect(this._scaleFactorChangedId); if (this._hoverChangeId) { @@ -442,7 +441,7 @@ export const TaskbarAppIcon = GObject.registerClass({ [rect.width, rect.height] = this.get_transformed_size(); let windows = this.window ? [this.window] : this.getAppIconInterestingWindows(true); - windows.forEach(function(w) { + windows.forEach(function (w) { w.set_icon_geometry(rect); }); } @@ -483,16 +482,14 @@ export const TaskbarAppIcon = GObject.registerClass({ const background_color = SETTINGS.get_string('highlight-appicon-hover-background-color'); const pressed_color = SETTINGS.get_string('highlight-appicon-pressed-background-color'); const border_radius = SETTINGS.get_int('highlight-appicon-hover-border-radius'); - if (this._checkGtkVersion_cssVariables()) { - this._container.set_style(`--dtp-hover-background-color: ${background_color}; --dtp-hover-border-radius: ${border_radius}px; --dtp-pressed-background-color: ${pressed_color};`); - } else { - // Some trickery needed to get the same effect - const br = `border-radius: ${border_radius}px;`; - this._appicon_normalstyle = br; - this._container.set_style(this._appicon_normalstyle); - this._appicon_hoverstyle = `background-color: ${background_color}; ${br}`; - this._appicon_pressedstyle = `background-color: ${pressed_color}; ${br}`; - } + + // Some trickery needed to get the effect + const br = `border-radius: ${border_radius}px;`; + this._appicon_normalstyle = br; + this._container.set_style(this._appicon_normalstyle); + this._appicon_hoverstyle = `background-color: ${background_color}; ${br}`; + this._appicon_pressedstyle = `background-color: ${pressed_color}; ${br}`; + if (SETTINGS.get_boolean('highlight-appicon-hover')) { this._container.remove_style_class_name('no-highlight'); } else { @@ -503,18 +500,10 @@ export const TaskbarAppIcon = GObject.registerClass({ } } - _checkGtkVersion_cssVariables() { - // Support for CSS variables was added in GTK 4.16 - // However, using them is still impossible within an extension [Gnome version 47] - return false; - return Gtk.get_major_version() >= 5 || - (Gtk.get_major_version() == 4 && Gtk.get_minor_version() >= 16); - } - _onAppIconHoverChanged_GtkWorkaround() { if (this.hover && this._appicon_hoverstyle) { this._container.set_style(this._appicon_hoverstyle); - } else if(this._appicon_normalstyle) { + } else if (this._appicon_normalstyle) { this._container.set_style(this._appicon_normalstyle); } else { this._container.set_style(''); @@ -526,7 +515,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._container.set_style(this._appicon_pressedstyle); } else if (this.hover && this._appicon_hoverstyle) { this._container.set_style(this._appicon_hoverstyle); - } else if(this._appicon_normalstyle) { + } else if (this._appicon_normalstyle) { this._container.set_style(this._appicon_normalstyle); } else { this._container.set_style(''); @@ -545,7 +534,7 @@ export const TaskbarAppIcon = GObject.registerClass({ let direction = Utils.getMouseScrollDirection(event); if (direction && !this._timeoutsHandler.getId(T2)) { - this._timeoutsHandler.add([T2, SETTINGS.get_int('scroll-icon-delay'), () => {}]); + this._timeoutsHandler.add([T2, SETTINGS.get_int('scroll-icon-delay'), () => { }]); let windows = this.getAppIconInterestingWindows(); @@ -574,7 +563,7 @@ export const TaskbarAppIcon = GObject.registerClass({ }); } else { this._focusedDots = new St.DrawingArea(), - this._unfocusedDots = new St.DrawingArea(); + this._unfocusedDots = new St.DrawingArea(); this._focusedDots.connect('repaint', () => { if (!this._dashItemContainer.animatingOut) @@ -641,8 +630,8 @@ export const TaskbarAppIcon = GObject.registerClass({ let fontWeight = SETTINGS.get_string('group-apps-label-font-weight'); let fontScale = DESKTOPSETTINGS.get_double('text-scaling-factor'); let fontColor = this.window.minimized ? - SETTINGS.get_string('group-apps-label-font-color-minimized') : - SETTINGS.get_string('group-apps-label-font-color'); + SETTINGS.get_string('group-apps-label-font-color-minimized') : + SETTINGS.get_string('group-apps-label-font-color'); let scaleFactor = Utils.getScaleFactor(); let maxLabelWidth = SETTINGS.get_int('group-apps-label-max-width') * scaleFactor; let variableWidth = !useFixedWidth || this.dtpPanel.checkIfVertical() || this.dtpPanel.taskbar.fullScrollView; @@ -654,9 +643,9 @@ export const TaskbarAppIcon = GObject.registerClass({ this._windowTitle.clutter_text.natural_width_set = useFixedWidth; this._windowTitle.set_style('font-size: ' + SETTINGS.get_int('group-apps-label-font-size') * fontScale + 'px;' + - 'font-weight: ' + fontWeight + ';' + - (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + - 'color: ' + fontColor); + 'font-weight: ' + fontWeight + ';' + + (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + + 'color: ' + fontColor); } } @@ -673,17 +662,17 @@ export const TaskbarAppIcon = GObject.registerClass({ _setIconStyle(isFocused) { let inlineStyle = 'margin: 0;'; - if(SETTINGS.get_boolean('focus-highlight') && - this._checkIfFocusedApp() && !this.isLauncher && - (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { + if (SETTINGS.get_boolean('focus-highlight') && + this._checkIfFocusedApp() && !this.isLauncher && + (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { let focusedDotStyle = SETTINGS.get_string('dot-style-focused'); let pos = SETTINGS.get_string('dot-position'); let highlightMargin = this._focusedIsWide ? SETTINGS.get_int('dot-size') : 0; - if(!this.window) { + if (!this.window) { let containerWidth = this._dtpIconContainer.get_width() / Utils.getScaleFactor(); let backgroundSize = containerWidth + "px " + - (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; + (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; if (focusedDotStyle == DOT_STYLE.CILIORA || focusedDotStyle == DOT_STYLE.SEGMENTED) highlightMargin += 1; @@ -696,8 +685,8 @@ export const TaskbarAppIcon = GObject.registerClass({ } inlineStyle += "background-image: url('" + EXTENSION_PATH + bgSvg + ".svg');" + - "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + - "background-size: " + backgroundSize; + "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + + "background-size: " + backgroundSize; } } @@ -708,7 +697,7 @@ export const TaskbarAppIcon = GObject.registerClass({ } } - if(this._dotsContainer.get_style() != inlineStyle) { + if (this._dotsContainer.get_style() != inlineStyle) { this._dotsContainer.set_style(inlineStyle); } } @@ -719,7 +708,7 @@ export const TaskbarAppIcon = GObject.registerClass({ _checkIfMonitorHasFocus() { return global.display.focus_window && - (!SETTINGS.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. + (!SETTINGS.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. !SETTINGS.get_boolean('isolate-monitors') || global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); } @@ -820,7 +809,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this._setIconStyle(isFocused); - if(!this._isGroupApps) { + if (!this._isGroupApps) { if (this.window && (SETTINGS.get_boolean('group-apps-underline-unfocused') || isFocused)) { let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; @@ -844,13 +833,13 @@ export const TaskbarAppIcon = GObject.registerClass({ isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); this._timeoutsHandler.add([T6, 0, () => { - if(isFocused) + if (isFocused) this.add_style_class_name('focused'); else this.remove_style_class_name('focused'); }]); - if(this._focusedIsWide) { + if (this._focusedIsWide) { newFocusedDotsSize = (isFocused && this._nWindows > 0) ? this._containerSize : 0; newFocusedDotsOpacity = 255; } else { @@ -858,7 +847,7 @@ export const TaskbarAppIcon = GObject.registerClass({ newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; } - if(this._unfocusedIsWide) { + if (this._unfocusedIsWide) { newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? this._containerSize : 0; newUnfocusedDotsOpacity = 255; } else { @@ -871,8 +860,8 @@ export const TaskbarAppIcon = GObject.registerClass({ // AND (going from a wide style to a narrow style indicator or vice-versa // OR going from an open app to a closed app or vice versa) let animate = SETTINGS.get_boolean('animate-app-switch') && - ((this._focusedIsWide != this._unfocusedIsWide) || - (this._focusedDots[sizeProp] != newUnfocusedDotsSize || this._unfocusedDots[sizeProp] != newFocusedDotsSize)) + ((this._focusedIsWide != this._unfocusedIsWide) || + (this._focusedDots[sizeProp] != newUnfocusedDotsSize || this._unfocusedDots[sizeProp] != newFocusedDotsSize)) let duration = animate ? Taskbar.DASH_ANIMATION_TIME : 0.001; this._animateDotDisplay(this._focusedDots, newFocusedDotsSize, this._unfocusedDots, newUnfocusedDotsOpacity, sizeProp, duration); @@ -887,12 +876,12 @@ export const TaskbarAppIcon = GObject.registerClass({ time: duration, transition: 'easeInOutCubic', onComplete: () => { - if(newOtherOpacity > 0) + if (newOtherOpacity > 0) otherDots.opacity = newOtherOpacity; } }; - if(newOtherOpacity == 0) + if (newOtherOpacity == 0) otherDots.opacity = newOtherOpacity; tweenOpts[sizeProp] = newSize; @@ -926,7 +915,7 @@ export const TaskbarAppIcon = GObject.registerClass({ // running indicator by way of a border image on the icon, for example in // the theme Ciliora return (this.icon.get_stage() && - this.icon.get_theme_node().get_border_image()); + this.icon.get_theme_node().get_border_image()); } activate(button, modifiers, handleAsGrouped) { @@ -950,7 +939,7 @@ export const TaskbarAppIcon = GObject.registerClass({ let buttonAction = 0; let doubleClick; - if (button && button == 2 ) { + if (button && button == 2) { if (modifiers & Clutter.ModifierType.SHIFT_MASK) buttonAction = SETTINGS.get_string('shift-middle-click-action'); else @@ -991,7 +980,7 @@ export const TaskbarAppIcon = GObject.registerClass({ if (!Main.overview._shown && (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { - this.window.minimize(); + this.window.minimize(); } else { Main.activateWindow(this.window); } @@ -1023,13 +1012,13 @@ export const TaskbarAppIcon = GObject.registerClass({ case "MINIMIZE": // In overview just activate the app, unless the acion is explicitely // requested with a keyboard modifier - if (!Main.overview._shown || modifiers){ + if (!Main.overview._shown || modifiers) { // If we have button=2 or a modifier, allow minimization even if // the app is not focused if (appHasFocus || button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK) { // minimize all windows on double click and always in the case of primary click without // additional modifiers - let all_windows = (button == 1 && ! modifiers) || doubleClick; + let all_windows = (button == 1 && !modifiers) || doubleClick; minimizeWindow(this.app, all_windows, monitor); } else @@ -1040,7 +1029,7 @@ export const TaskbarAppIcon = GObject.registerClass({ break; case "CYCLE": - if (!Main.overview._shown){ + if (!Main.overview._shown) { if (appHasFocus) cycleThroughWindows(this.app, false, false, monitor); else { @@ -1051,7 +1040,7 @@ export const TaskbarAppIcon = GObject.registerClass({ this.app.activate(); break; case "CYCLE-MIN": - if (!Main.overview._shown){ + if (!Main.overview._shown) { if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) cycleThroughWindows(this.app, false, true, monitor); else { @@ -1140,9 +1129,9 @@ export const TaskbarAppIcon = GObject.registerClass({ this._nWindows = windows.length; - for (let i = 1; i <= MAX_INDICATORS; i++){ - let className = 'running'+i; - if(i != this._nWindows) + for (let i = 1; i <= MAX_INDICATORS; i++) { + let className = 'running' + i; + if (i != this._nWindows) this.remove_style_class_name(className); else this.add_style_class_name(className); @@ -1174,15 +1163,15 @@ export const TaskbarAppIcon = GObject.registerClass({ color = themeNode.get_background_color(); // theme didn't provide one, use a default - if(color.alpha == 0) color = fallbackColor; + if (color.alpha == 0) color = fallbackColor; } - } else if(SETTINGS.get_boolean('dot-color-override')) { + } else if (SETTINGS.get_boolean('dot-color-override')) { let dotColorSettingPrefix = 'dot-color-'; - if(!isFocused && SETTINGS.get_boolean('dot-color-unfocused-different')) + if (!isFocused && SETTINGS.get_boolean('dot-color-unfocused-different')) dotColorSettingPrefix = 'dot-color-unfocused-'; - color = Utils.ColorUtils.color_from_string(SETTINGS.get_string(dotColorSettingPrefix + (this._getRunningIndicatorCount() || 1) ))[1]; + color = Utils.ColorUtils.color_from_string(SETTINGS.get_string(dotColorSettingPrefix + (this._getRunningIndicatorCount() || 1)))[1]; } else { // Re-use the style - background color, and border width and color - // of the default dot @@ -1190,7 +1179,7 @@ export const TaskbarAppIcon = GObject.registerClass({ color = themeNode.get_background_color(); // theme didn't provide one, use a default - if(color.alpha == 0) color = fallbackColor; + if (color.alpha == 0) color = fallbackColor; } return color; @@ -1271,7 +1260,7 @@ export const TaskbarAppIcon = GObject.registerClass({ let dist; let indicatorSize; let translate; - let preDraw = () => {}; + let preDraw = () => { }; let draw; let drawDash = (i, dashLength) => { dist = i * dashLength + i * spacing; @@ -1367,12 +1356,12 @@ export const TaskbarAppIcon = GObject.registerClass({ // Set the font size to something smaller than the whole icon so it is // still visible. The border radius is large to make the shape circular let [minWidth, natWidth] = this._dtpIconContainer.get_preferred_width(-1); - let font_size = Math.round(Math.max(12, 0.3 * natWidth) / Utils.getScaleFactor()); + let font_size = Math.round(Math.max(12, 0.3 * natWidth) / Utils.getScaleFactor()); let size = Math.round(font_size * 1.3); let label = bin.child; let style = 'font-size: ' + font_size + 'px;' + - 'border-radius: ' + this.icon.iconSize + 'px;' + - 'height: ' + size +'px;'; + 'border-radius: ' + this.icon.iconSize + 'px;' + + 'height: ' + size + 'px;'; if (fixedSize || label.get_text().length == 1) { style += 'width: ' + size + 'px;'; @@ -1391,9 +1380,9 @@ export const TaskbarAppIcon = GObject.registerClass({ toggleNumberOverlay(activate) { if (activate && this._numberOverlayOrder > -1) - this._numberOverlayBin.show(); + this._numberOverlayBin.show(); else - this._numberOverlayBin.hide(); + this._numberOverlayBin.hide(); } handleDragOver(source, actor, x, y, time) { @@ -1408,19 +1397,19 @@ export const TaskbarAppIcon = GObject.registerClass({ return getInterestingWindows(this.app, this.dtpPanel.monitor, isolateMonitors); } }); -TaskbarAppIcon.prototype.scaleAndFade = TaskbarAppIcon.prototype.undoScaleAndFade = () => {}; +TaskbarAppIcon.prototype.scaleAndFade = TaskbarAppIcon.prototype.undoScaleAndFade = () => { }; -export function minimizeWindow(app, param, monitor){ +export function minimizeWindow(app, param, monitor) { // Param true make all app windows minimize let windows = getInterestingWindows(app, monitor); let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); for (let i = 0; i < windows.length; i++) { let w = windows[i]; - if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()){ + if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()) { w.minimize(); // Just minimize one window. By specification it should be the // focused window on the current workspace. - if(!param) + if (!param) break; } } @@ -1430,7 +1419,7 @@ export function minimizeWindow(app, param, monitor){ * By default only non minimized windows are activated. * This activates all windows in the current workspace. */ -export function activateAllWindows(app, monitor){ +export function activateAllWindows(app, monitor) { // First activate first window so workspace is switched if needed, // then activate all other app windows in the current workspace. @@ -1442,14 +1431,14 @@ export function activateAllWindows(app, monitor){ if (windows.length <= 0) return; - for (let i = windows.length - 1; i >= 0; i--){ - if (windows[i].get_workspace().index() == activeWorkspace){ + for (let i = windows.length - 1; i >= 0; i--) { + if (windows[i].get_workspace().index() == activeWorkspace) { Main.activateWindow(windows[i]); } } } -export function activateFirstWindow(app, monitor){ +export function activateFirstWindow(app, monitor) { let windows = getInterestingWindows(app, monitor); Main.activateWindow(windows[0]); @@ -1458,11 +1447,11 @@ export function activateFirstWindow(app, monitor){ export function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { // Store for a little amount of time last clicked app and its windows // since the order changes upon window interaction - let MEMORY_TIME=3000; + let MEMORY_TIME = 3000; let app_windows = getInterestingWindows(app, monitor); - if(shouldMinimize) + if (shouldMinimize) app_windows.push("MINIMIZE"); if (recentlyClickedAppLoopId > 0) @@ -1491,7 +1480,7 @@ export function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { } let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; - if(recentlyClickedAppWindows[index] === "MINIMIZE") + if (recentlyClickedAppWindows[index] === "MINIMIZE") minimizeWindow(app, true, monitor); else Main.activateWindow(recentlyClickedAppWindows[index]); @@ -1501,8 +1490,8 @@ export function resetRecentlyClickedApp() { if (recentlyClickedAppLoopId > 0) GLib.Source.remove(recentlyClickedAppLoopId); - recentlyClickedAppLoopId=0; - recentlyClickedApp =null; + recentlyClickedAppLoopId = 0; + recentlyClickedApp = null; recentlyClickedAppWindows = null; recentlyClickedAppIndex = 0; recentlyClickedAppMonitorIndex = null; @@ -1520,21 +1509,21 @@ export function closeAllWindows(app, monitor) { // nautilus desktop window. export function getInterestingWindows(app, monitor, isolateMonitors) { let windows = ( - app ? + app ? app.get_windows() : global.get_window_actors().map(wa => wa.get_meta_window()) - ).filter(w => !w.skip_taskbar); + ).filter(w => !w.skip_taskbar); // When using workspace or monitor isolation, we filter out windows // that are not in the current workspace or on the same monitor as the appicon if (SETTINGS.get_boolean('isolate-workspaces')) - windows = windows.filter(function(w) { + windows = windows.filter(function (w) { return w.get_workspace() && - w.get_workspace() == Utils.getCurrentWorkspace(); + w.get_workspace() == Utils.getCurrentWorkspace(); }); if (monitor && SETTINGS.get_boolean('multi-monitors') && (isolateMonitors || SETTINGS.get_boolean('isolate-monitors'))) { - windows = windows.filter(function(w) { + windows = windows.filter(function (w) { return w.get_monitor() == monitor.index; }); } @@ -1581,7 +1570,7 @@ export class TaskbarSecondaryMenu extends AppMenu.AppMenu { this._showSingleWindows = true; // Remove "Show Details" menu item - if(!SETTINGS.get_boolean('secondarymenu-contains-showdetails')) { + if (!SETTINGS.get_boolean('secondarymenu-contains-showdetails')) { let existingMenuItems = this._getMenuItems(); for (let i = 0; i < existingMenuItems.length; i++) { let item = existingMenuItems[i]; @@ -1602,7 +1591,7 @@ export class TaskbarSecondaryMenu extends AppMenu.AppMenu { let count = this.sourceActor.window ? 1 : getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor).length; - if ( count > 0) { + if (count > 0) { let quitFromTaskbarMenuText = ""; if (count == 1) quitFromTaskbarMenuText = _("Quit"); @@ -1617,8 +1606,8 @@ export class TaskbarSecondaryMenu extends AppMenu.AppMenu { let time = global.get_current_time() let windows = this.sourceActor.window ? // ungrouped applications - [this.sourceActor.window] : - getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor) + [this.sourceActor.window] : + getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor) if (windows.length == this._app.get_windows().length) this._app.request_quit() @@ -1645,7 +1634,7 @@ export function ItemShowLabel() { let [stageX, stageY] = this.get_transformed_position(); let node = this.label.get_theme_node(); - let itemWidth = this.allocation.x2 - this.allocation.x1; + let itemWidth = this.allocation.x2 - this.allocation.x1; let itemHeight = this.allocation.y2 - this.allocation.y1; let labelWidth = this.label.get_width(); @@ -1662,19 +1651,19 @@ export function ItemShowLabel() { let x = stageX + xOffset let y = stageY + (itemHeight - labelHeight) * .5; - switch(position) { - case St.Side.TOP: - y = stageY + labelOffset + itemHeight; - break; - case St.Side.BOTTOM: - y = stageY - labelHeight - labelOffset; - break; - case St.Side.LEFT: - x = stageX + labelOffset + itemWidth; - break; - case St.Side.RIGHT: - x = stageX - labelWidth - labelOffset; - break; + switch (position) { + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + break; + case St.Side.BOTTOM: + y = stageY - labelHeight - labelOffset; + break; + case St.Side.LEFT: + x = stageX + labelOffset + itemWidth; + break; + case St.Side.RIGHT: + x = stageX - labelWidth - labelOffset; + break; } // keep the label inside the screen border @@ -1683,10 +1672,10 @@ export function ItemShowLabel() { // Leave a few pixel gap let gap = LABEL_GAP; let monitor = Main.layoutManager.findMonitorForActor(this); - if ( x - monitor.x < gap) + if (x - monitor.x < gap) x += monitor.x - x + labelOffset; - else if ( x + labelWidth > monitor.x + monitor.width - gap) - x -= x + labelWidth -( monitor.x + monitor.width) + gap; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; this.label.set_position(Math.round(x), Math.round(y)); @@ -1750,11 +1739,13 @@ export const ShowAppsIconWrapper = class extends EventEmitter { let customIconPath = SETTINGS.get_string('show-apps-icon-file'); - this.realShowAppsIcon.icon.createIcon = function(size) { - this._iconActor = new St.Icon({ icon_name: 'view-app-grid-symbolic', - icon_size: size, - style_class: 'show-apps-icon', - track_hover: true }); + this.realShowAppsIcon.icon.createIcon = function (size) { + this._iconActor = new St.Icon({ + icon_name: 'view-app-grid-symbolic', + icon_size: size, + style_class: 'show-apps-icon', + track_hover: true + }); if (customIconPath) { this._iconActor.gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(customIconPath) }); @@ -1792,7 +1783,7 @@ export const ShowAppsIconWrapper = class extends EventEmitter { _onTouchEvent(actor, event) { if (event.type() == Clutter.EventType.TOUCH_BEGIN) - this._setPopupTimeout(); + this._setPopupTimeout(); return Clutter.EVENT_PROPAGATE; } @@ -1850,7 +1841,7 @@ export const ShowAppsIconWrapper = class extends EventEmitter { shouldShowTooltip() { return SETTINGS.get_boolean('show-tooltip') && - (this.actor.hover && (!this._menu || !this._menu.isOpen)); + (this.actor.hover && (!this._menu || !this._menu.isOpen)); } destroy() { @@ -1954,7 +1945,7 @@ export const MyShowAppsIconMenu = class extends PopupMenu.PopupMenu { let settingsMenuItem = this._appendMenuItem(_('Dash to Panel Settings')); settingsMenuItem.connect('activate', () => DTP_EXTENSION.openPreferences()) - if(this.sourceActor == Main.layoutManager.dummyCursor) { + if (this.sourceActor == Main.layoutManager.dummyCursor) { this._appendSeparator(); let item = this._appendMenuItem(this._dtpPanel._restoreWindowList ? _('Restore Windows') : _('Show Desktop')); item.connect('activate', this._dtpPanel._onShowDesktopButtonPress.bind(this._dtpPanel)); @@ -1967,7 +1958,7 @@ export const MyShowAppsIconMenu = class extends PopupMenu.PopupMenu { if (GLib.find_program_in_path(info.cmd[0])) { let item = this._appendMenuItem(_(info.title)); - item.connect('activate', function() { + item.connect('activate', function () { print("activated: " + info.title); Util.spawn(info.cmd); }); @@ -2004,7 +1995,7 @@ export const MyShowAppsIconMenu = class extends PopupMenu.PopupMenu { }; -export const getIconContainerStyle = function(isVertical) { +export const getIconContainerStyle = function (isVertical) { let style = 'padding: '; if (SETTINGS.get_boolean('group-apps')) { diff --git a/stylesheet.css b/stylesheet.css index fd05e22..8b951bf 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -42,14 +42,11 @@ #dashtopanelScrollview .overview-tile:focus .dtp-container { background-color: rgba(238, 238, 236, 0.1); border-radius: 0px; - background-color: var(--dtp-hover-background-color); - border-radius: var(--dtp-hover-border-radius); } #dashtopanelScrollview .overview-tile:hover .dtp-container > .dtp-dots-container, #dashtopanelScrollview .overview-tile:focus .dtp-container > .dtp-dots-container { border-radius: 0px; - border-radius: var(--dtp-hover-border-radius); } .dashtopanelMainPanel .dash-item-container .show-apps:hover { @@ -72,7 +69,6 @@ #dashtopanelScrollview .overview-tile:active .dtp-container { background-color: rgba(238, 238, 236, 0.18); - background-color: var(--dtp-pressed-background-color); } #dashtopanelScrollview .overview-tile .favorite { From bfbdca5e6400dbe9a299e9b0bc6d2e29f834e4fe Mon Sep 17 00:00:00 2001 From: Hirnmoder <19573355+Hirnmoder@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:24:19 +0100 Subject: [PATCH 18/18] Beautify DTP - Remove now unused GTK import - Fix previously missed removal of function call to "_checkGtkVersion_cssVariables" --- appIcons.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/appIcons.js b/appIcons.js index 0fb66d1..7806fce 100644 --- a/appIcons.js +++ b/appIcons.js @@ -30,7 +30,6 @@ import GObject from 'gi://GObject'; import Mtk from 'gi://Mtk'; import Shell from 'gi://Shell'; import St from 'gi://St'; -import Gtk from 'gi://Gtk'; import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js'; import * as AppMenu from 'resource:///org/gnome/shell/ui/appMenu.js'; @@ -692,9 +691,7 @@ export const TaskbarAppIcon = GObject.registerClass({ let highlightColor = this._getFocusHighlightColor(); inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, SETTINGS.get_int('focus-highlight-opacity') * 0.01) + ";"; - if (!this._checkGtkVersion_cssVariables()) { - inlineStyle += this._appicon_normalstyle; - } + inlineStyle += this._appicon_normalstyle; } if (this._dotsContainer.get_style() != inlineStyle) {