From eec70b33cf9ce289e6dc0691efcf4602ba97e94a Mon Sep 17 00:00:00 2001 From: Packit Service Date: Dec 09 2020 15:34:33 +0000 Subject: Prepare for a new update Reverting patches so we can apply the latest update and changes can be seen in the spec file and sources. --- diff --git a/data/classic.json.in b/data/classic.json.in index c1c0544..fdb3762 100644 --- a/data/classic.json.in +++ b/data/classic.json.in @@ -1,9 +1,8 @@ { "parentMode": "user", "stylesheetName": "gnome-classic.css", - "hasOverview": false, "enabledExtensions": [@CLASSIC_EXTENSIONS@], - "panel": { "left": ["appMenu"], + "panel": { "left": ["activities", "appMenu"], "center": [], "right": ["a11y", "keyboard", "dateMenu", "aggregateMenu"] } diff --git a/data/gnome-classic.scss b/data/gnome-classic.scss index 9c0e06e..9e23506 100644 --- a/data/gnome-classic.scss +++ b/data/gnome-classic.scss @@ -32,20 +32,18 @@ $variant: 'light'; font-weight: normal; color: $fg_color; text-shadow: none; - &:hover { - color: lighten($fg_color,10%); - text-shadow: none; - & .system-status-icon { icon-shadow: none; } - } &:active, &:overview, &:focus, &:checked { // Trick due to St limitations. It needs a background to draw // a box-shadow - background-color: $selected_bg_color; - color: $selected_fg_color; + background-color: $selected_bg_color !important; + color: $selected_fg_color !important; box-shadow: none; & > .system-status-icon { icon-shadow: none; } } - + &:hover { + text-shadow: none; + & .system-status-icon { icon-shadow: none; } + } .app-menu-icon { width: 0; height: 0; margin: 0; } // shell's display:none; :D .system-status-icon { diff --git a/data/gnome-shell-sass/_common.scss b/data/gnome-shell-sass/_common.scss index 62d9c82..a6357ba 100644 --- a/data/gnome-shell-sass/_common.scss +++ b/data/gnome-shell-sass/_common.scss @@ -571,18 +571,6 @@ StScrollBar { app menu inside the main app window itself rather than the top bar */ -/************* - * App Icons * - *************/ -/* Outline for low res icons */ -.lowres-icon { - icon-shadow: 0 1px 2px rgba(0,0,0,0.3); -} - -/* Drapshadow for large icons */ -.icon-dropshadow { - icon-shadow: 0 1px 2px rgba(0,0,0,0.4); -} /* OSD */ .osd-window { @@ -692,8 +680,7 @@ StScrollBar { spacing: 8px; } - .ws-switcher-active-up, .ws-switcher-active-down, - .ws-switcher-active-left, .ws-switcher-active-right { + .ws-switcher-active-up, .ws-switcher-active-down { height: 50px; background-color: $selected_bg_color; color: $selected_fg_color; @@ -794,11 +781,6 @@ StScrollBar { color: lighten($fg_color,10%); } - .panel-logo-icon { - padding-right: .4em; - icon-size: 1em; - } - .system-status-icon { icon-size: 1.09em; padding: 0 5px; } .unlock-screen &, .login-screen &, @@ -1424,14 +1406,6 @@ StScrollBar { } - .app-well-hover-text { - text-align: center; - color: $osd_fg_color; - background-color: $osd_bg_color; - border-radius: 5px; - padding: 3px; - } - .app-well-app-running-dot { //running apps indicator width: 10px; height: 3px; background-color: $selected_bg_color; @@ -1827,12 +1801,7 @@ StScrollBar { .login-dialog-banner { color: darken($osd_fg_color,10%); } .login-dialog-button-box { spacing: 5px; } .login-dialog-message-warning { color: $warning_color; } - .login-dialog-message-hint, .login-dialog-message { - color: darken($osd_fg_color, 20%); - padding-top: 0; - padding-bottom: 20px; - min-height: 2.75em; - } + .login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; } .login-dialog-user-selection-box { padding: 100px 0px; } .login-dialog-not-listed-label { padding-left: 2px; @@ -1887,10 +1856,6 @@ StScrollBar { padding-bottom: 12px; spacing: 8px; width: 23em; - .login-dialog-timed-login-indicator { - height: 2px; - background-color: darken($fg_color,40%); - } } .login-dialog-prompt-label { diff --git a/extensions/apps-menu/extension.js b/extensions/apps-menu/extension.js index 1de00df..d7ba570 100644 --- a/extensions/apps-menu/extension.js +++ b/extensions/apps-menu/extension.js @@ -25,6 +25,20 @@ const NAVIGATION_REGION_OVERSHOOT = 50; Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish'); Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish'); +class ActivitiesMenuItem extends PopupMenu.PopupBaseMenuItem { + constructor(button) { + super(); + this._button = button; + this.actor.add_child(new St.Label({ text: _('Activities Overview') })); + } + + activate(event) { + this._button.menu.toggle(); + Main.overview.toggle(); + super.activate(event); + } +} + class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(button, app) { super(); @@ -66,8 +80,6 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { this._button.selectCategory(null); this._button.menu.toggle(); super.activate(event); - - Main.overview.hide(); } setActive(active, params) { @@ -89,9 +101,7 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { } _updateIcon() { - let icon = this.getDragActor(); - icon.style_class = 'icon-dropshadow'; - this._iconBin.set_child(icon); + this._iconBin.set_child(this.getDragActor()); } } @@ -110,9 +120,7 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem { else name = _('Favorites'); - let label = new St.Label({ text: name }); - this.actor.add_child(label); - this.actor.label_actor = label; + this.actor.add_child(new St.Label({ text: name })); this.actor.connect('motion-event', this._onMotionEvent.bind(this)); } @@ -221,9 +229,28 @@ class ApplicationsMenu extends PopupMenu.PopupMenu { return false; } + open(animate) { + this._button.hotCorner.setBarrierSize(0); + if (this._button.hotCorner.actor) // fallback corner + this._button.hotCorner.actor.hide(); + super.open(animate); + } + + close(animate) { + let size = Main.layoutManager.panelBox.height; + this._button.hotCorner.setBarrierSize(size); + if (this._button.hotCorner.actor) // fallback corner + this._button.hotCorner.actor.show(); + super.close(animate); + } + toggle() { - if (this.isOpen) + if (this.isOpen) { this._button.selectCategory(null); + } else { + if (Main.overview.visible) + Main.overview.hide(); + } super.toggle(); } } @@ -350,7 +377,7 @@ Signals.addSignalMethods(DesktopTarget.prototype); let ApplicationsButton = GObject.registerClass( class ApplicationsButton extends PanelMenu.Button { - _init(includeIcon) { + _init() { super._init(1.0, null, false); this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this)); @@ -363,15 +390,6 @@ class ApplicationsButton extends PanelMenu.Button { let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); - let iconFile = Gio.File.new_for_path( - '/usr/share/icons/hicolor/scalable/apps/start-here.svg'); - this._icon = new St.Icon({ - gicon: new Gio.FileIcon({ file: iconFile }), - style_class: 'panel-logo-icon', - visible: includeIcon - }); - hbox.add_actor(this._icon); - this._label = new St.Label({ text: _('Applications'), y_expand: true, @@ -384,6 +402,8 @@ class ApplicationsButton extends PanelMenu.Button { this.name = 'panelApplications'; this.label_actor = this._label; + this.connect('captured-event', this._onCapturedEvent.bind(this)); + this._showingId = Main.overview.connect('showing', () => { this.add_accessible_state (Atk.StateType.CHECKED); }); @@ -425,6 +445,10 @@ class ApplicationsButton extends PanelMenu.Button { } } + get hotCorner() { + return Main.layoutManager.hotCorners[Main.layoutManager.primaryIndex]; + } + _createVertSeparator() { let separator = new St.DrawingArea({ style_class: 'calendar-vertical-separator', @@ -435,8 +459,6 @@ class ApplicationsButton extends PanelMenu.Button { } _onDestroy() { - super._onDestroy(); - Main.overview.disconnect(this._showingId); Main.overview.disconnect(this._hidingId); appSys.disconnect(this._installedChangedId); @@ -453,6 +475,14 @@ class ApplicationsButton extends PanelMenu.Button { this._desktopTarget.destroy(); } + _onCapturedEvent(actor, event) { + if (event.type() == Clutter.EventType.BUTTON_PRESS) { + if (!Main.overview.shouldToggleByCornerOrButton()) + return true; + } + return false; + } + _onMenuKeyPress(actor, event) { let symbol = event.get_key_symbol(); if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) { @@ -596,6 +626,14 @@ class ApplicationsButton extends PanelMenu.Button { y_align: St.Align.START }); + let activities = new ActivitiesMenuItem(this); + this.leftBox.add(activities.actor, { + expand: false, + x_fill: true, + y_fill: false, + y_align: St.Align.START + }); + this.applicationsBox = new St.BoxLayout({ vertical: true }); this.applicationsScrollBox.add_actor(this.applicationsBox); this.categoriesBox = new St.BoxLayout({ vertical: true }); @@ -707,16 +745,19 @@ class ApplicationsButton extends PanelMenu.Button { }); let appsMenuButton; +let activitiesButton; function enable() { - let index = Main.sessionMode.panel.left.indexOf('activities') + 1; - appsMenuButton = new ApplicationsButton(index == 0); - Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left'); + activitiesButton = Main.panel.statusArea['activities']; + activitiesButton.container.hide(); + appsMenuButton = new ApplicationsButton(); + Main.panel.addToStatusArea('apps-menu', appsMenuButton, 1, 'left'); } function disable() { Main.panel.menuManager.removeMenu(appsMenuButton.menu); appsMenuButton.destroy(); + activitiesButton.container.show(); } function init() { diff --git a/extensions/dash-to-dock/Settings.ui b/extensions/dash-to-dock/Settings.ui deleted file mode 100644 index c141eff..0000000 --- a/extensions/dash-to-dock/Settings.ui +++ /dev/null @@ -1,3335 +0,0 @@ - - - - - - 1 - 0.050000000000000003 - 0.25 - - - True - False - 12 - 12 - 12 - 12 - vertical - - - True - False - 0 - in - - - True - False - none - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - When set to minimize, double clicking minimizes all the windows of the application. - True - 40 - 0 - - - - 0 - 1 - - - - - True - False - True - Shift+Click action - 0 - - - 0 - 0 - - - - - True - False - center - - Raise window - Minimize window - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - Quit - - - - 1 - 0 - 2 - - - - - - - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Behavior for Middle-Click. - True - 40 - 0 - - - - 0 - 1 - - - - - True - False - True - Middle-Click action - 0 - - - 0 - 0 - - - - - True - False - center - - Raise window - Minimize window - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - Quit - - - - 1 - 0 - 2 - - - - - - - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Behavior for Shift+Middle-Click. - True - 40 - 0 - - - - 0 - 1 - - - - - True - False - True - Shift+Middle-Click action - 0 - - - 0 - 0 - - - - - True - False - center - - Raise window - Minimize window - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - Quit - - - - 1 - 0 - 2 - - - - - - - - - - - - - - False - True - 0 - - - - - 1 - 0.01 - 0.10000000000000001 - - - 0.33000000000000002 - 1 - 0.01 - 0.10000000000000001 - - - 10 - 1 - 5 - - - True - False - 12 - 12 - 12 - 12 - vertical - - - True - False - 0 - in - - - True - False - none - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - vertical - 12 - - - True - False - 32 - - - True - False - center - Enable Unity7 like glossy backlit items - 0 - - - True - True - 0 - - - - - True - True - center - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - - - True - False - start - Use dominant color - - - True - True - 0 - - - - - True - True - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 32 - - - True - True - - - 1 - 0 - - - - - True - False - True - Customize indicator style - fill - 0 - - - 0 - 0 - - - - - False - True - 2 - - - - - True - False - 1 - vertical - 12 - - - True - False - 32 - - - True - False - Color - 0 - - - True - True - 0 - - - - - True - True - True - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 32 - - - True - False - Border color - 0 - - - True - True - 0 - - - - - True - True - True - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 32 - - - True - False - Border width - 0 - - - True - True - 0 - - - - - True - True - dot_border_width_adjustment - - - False - True - 1 - - - - - False - True - 2 - - - - - False - True - 3 - - - - - - - - - - - - - - False - True - 0 - - - - - 1 - 0.050000000000000003 - 0.25 - - - 16 - 128 - 1 - 10 - - - True - True - 6 - 6 - 6 - 6 - - - True - False - 24 - 24 - 24 - 24 - vertical - 24 - - - True - False - 0 - in - - - True - False - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Show the dock on - 0 - - - 0 - 0 - - - - - True - False - center - - - - 1 - 0 - - - - - Show on all monitors. - True - True - False - 12 - 0 - True - - - 0 - 2 - 2 - - - - - - - - - - - - - - - 100 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Position on screen - 0 - - - False - True - 0 - - - - - True - False - 32 - - - Left - True - True - False - end - center - 0 - True - - - - False - True - 0 - - - - - Bottom - True - True - False - center - 0 - True - position_left_button - - - - False - True - 1 - - - - - Top - True - True - False - center - 0 - bottom - True - position_left_button - - - - False - True - 2 - - - - - Right - True - True - False - center - 0 - True - position_left_button - - - - False - True - 3 - - - - - False - True - 1 - - - - - - - - - - - - - - False - True - 0 - - - - - True - False - 0 - in - - - True - False - none - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Hide the dock when it obstructs a window of the current application. More refined settings are available. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Intelligent autohide - 0 - - - 0 - 0 - - - - - True - False - 6 - - - True - True - True - center - center - 0.46000000834465027 - - - True - False - emblem-system-symbolic - - - - - - False - True - 0 - - - - - True - True - end - center - - - False - True - 1 - - - - - 1 - 0 - 2 - - - - - - - - - - - - - - False - True - 1 - - - - - True - False - 0 - in - - - True - False - none - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - Dock size limit - 0 - - - 0 - 0 - - - - - True - True - baseline - True - dock_size_adjustment - 0 - 2 - right - - - - - 1 - 0 - - - - - Panel mode: extend to the screen edge - True - True - False - 12 - 0 - True - - - 0 - 1 - 2 - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - Icon size limit - 0 - - - 0 - 0 - - - - - True - True - baseline - True - icon_size_adjustment - 1 - 0 - right - - - - - 1 - 0 - - - - - Fixed icon size: scroll to reveal other icons - True - True - False - 12 - 0 - True - - - 0 - 1 - 2 - - - - - - - - - - - - - - False - True - 2 - - - - - - - True - False - Position and size - - - False - - - - - True - False - 24 - 24 - 24 - 24 - vertical - 24 - - - True - False - 0 - in - - - True - False - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - True - end - center - - - 1 - 0 - - - - - True - False - True - Show favorite applications - 0 - - - 0 - 0 - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - True - end - center - - - 1 - 0 - - - - - True - False - True - Show running applications - 0 - - - 0 - 0 - - - - - Isolate workspaces. - True - True - False - 12 - 0 - True - - - 0 - 2 - 2 - - - - - Isolate monitors. - True - True - False - 12 - 0 - True - - - 0 - 3 - 2 - - - - - True - True - False - 3 - 0 - True - - - True - False - Show open windows previews. - True - - - - - 0 - 1 - 2 - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - True - end - center - - - 1 - 0 - 2 - - - - - True - False - True - If disabled, these settings are accessible from gnome-tweak-tool or the extension website. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Show <i>Applications</i> icon - True - 0 - - - 0 - 0 - - - - - Move the applications button at the beginning of the dock. - True - True - False - 12 - 0 - True - - - 0 - 2 - 2 - - - - - True - True - False - 3 - 0 - 0.43000000715255737 - True - - - True - False - Animate <i>Show Applications</i>. - True - - - - - 0 - 3 - 2 - - - - - - - - - - - - - - False - True - 0 - - - - - 1 - - - - - True - False - Launchers - - - 1 - False - - - - - True - False - 24 - 24 - 24 - 24 - vertical - 24 - - - True - False - 0 - in - - - True - False - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl. - True - True - 0 - - - - 0 - 1 - - - - - True - False - True - Use keyboard shortcuts to activate apps - 0 - - - 0 - 0 - - - - - True - False - 6 - - - True - True - True - center - center - 0.46000000834465027 - - - True - False - emblem-system-symbolic - - - - - - False - True - 0 - - - - - True - True - end - center - - - False - True - 1 - - - - - 1 - 0 - 2 - - - - - - - - - - - - - - False - True - 1 - - - - - True - False - 0 - in - - - True - False - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Behaviour when clicking on the icon of a running application. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Click action - 0 - - - 0 - 0 - - - - - True - False - 6 - - - True - True - True - center - - - True - False - emblem-system-symbolic - - - - - - False - True - 0 - - - - - True - False - center - - Raise window - Minimize - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - - - - False - True - 1 - - - - - 1 - 0 - 2 - - - - - - - - - - - - - - False - True - 2 - - - - - True - False - 0 - in - - - True - False - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Behaviour when scrolling on the icon of an application. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Scroll action - 0 - - - 0 - 0 - - - - - True - False - 6 - - - True - False - center - - Do nothing - Cycle through windows - Switch workspace - - - - False - True - 1 - - - - - 1 - 0 - 2 - - - - - - - - - - - - - - False - True - 3 - - - - - 2 - - - - - True - False - Behavior - - - 2 - False - - - - - True - False - 24 - 24 - 24 - 24 - vertical - 24 - - - True - False - 0 - in - - - True - True - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Few customizations meant to integrate the dock with the default GNOME theme. Alternatively, specific options can be enabled below. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Use built-in theme - 0 - - - 0 - 0 - - - - - True - True - end - center - - - 1 - 0 - 2 - - - - - - - - - - - - - - False - True - 0 - - - - - True - False - 0 - in - - - True - False - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - True - end - center - - - 1 - 0 - 2 - - - - - True - False - True - Save space reducing padding and border radius. - 0 - - - - 0 - 1 - - - - - True - False - True - Shrink the dash - 0 - - - 0 - 0 - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Customize windows counter indicators - 0 - - - 0 - 0 - - - - - True - False - 6 - - - True - True - True - center - center - 0.46000000834465027 - - - True - False - emblem-system-symbolic - - - - - - False - True - 0 - - - - - True - False - - Default - Dots - Squares - Dashes - Segmented - Solid - Ciliora - Metro - - - - False - True - 1 - - - - - 1 - 0 - 2 - - - - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Set the background color for the dash. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Customize the dash color - 0 - - - 0 - 0 - - - - - True - False - 6 - - - True - True - True - center - center - 0.46000000834465027 - - - False - True - 1 - - - - - True - True - end - center - - - False - True - 1 - - - - - 1 - 0 - 2 - - - - - - - - - True - True - - - True - False - vertical - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Tune the dash background opacity. - 0 - - - - 0 - 1 - - - - - True - False - True - Customize opacity - 0 - - - 0 - 0 - - - - - True - False - 6 - - - True - True - True - center - center - - - True - False - emblem-system-symbolic - - - - - - False - True - 0 - - - - - True - False - center - - Default - Fixed - Dynamic - - - - False - True - 1 - - - - - 1 - 0 - 2 - - - - - False - True - 0 - - - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - Opacity - - - False - True - 0 - - - - - True - True - custom_opacity_adjustement - on - False - 0 - 0 - 2 - right - - - - - True - True - 1 - - - - - False - True - 1 - - - - - - - - - 100 - 80 - True - True - - - True - False - 32 - - - True - False - center - 12 - Force straight corner - - 0 - - - True - True - 0 - - - - - True - True - center - 3 - - - False - True - 12 - 1 - - - - - - - - - - - - - - False - True - 1 - - - - - 3 - - - - - True - False - Appearance - - - 3 - False - - - - - False - 24 - 24 - True - True - vertical - 5 - - - - False - True - 10 - 0 - - - - - True - False - <b>Dash to Dock</b> - True - - - False - True - 1 - - - - - True - False - center - - - True - False - end - version: - - - False - True - 0 - - - - - True - False - start - ... - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - Moves the dash out of the overview transforming it in a dock - center - True - - - False - True - 3 - - - - - True - False - center - 5 - - - True - False - Created by - - - False - True - 0 - - - - - True - True - Michele (<a href="mailto:micxgx@gmail.com">micxgx@gmail.com</a>) - True - - - False - True - 1 - - - - - False - True - 4 - - - - - Webpage - True - True - True - - center - none - https://micheleg.github.io/dash-to-dock/ - - - False - True - 5 - - - - - True - True - end - <span size="small">This program comes with ABSOLUTELY NO WARRANTY. -See the <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2 or later</a> for details.</span> - True - center - True - - - True - True - 6 - - - - - 4 - - - - - True - False - About - - - 4 - False - - - - - 1 - 0.01 - 0.10000000000000001 - - - 1 - 0.01 - 0.10000000000000001 - - - True - False - 12 - 12 - 12 - 12 - vertical - - - True - False - 0 - in - - - True - False - none - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - vertical - 12 - - - True - False - 32 - - - True - True - - - 1 - 0 - - - - - True - False - True - Customize minimum and maximum opacity values - fill - 0 - - - 0 - 0 - - - - - False - True - 0 - - - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - Minimum opacity - - - False - True - 0 - - - - - True - True - min_opacity_adjustement - on - False - 0 - 0 - 2 - right - - - - - True - True - 1 - - - - - False - True - 1 - - - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - Maximum opacity - - - False - True - 0 - - - - - True - True - max_opacity_adjustement - on - False - 0 - 0 - 2 - right - - - - - True - True - 1 - - - - - False - True - 1 - - - - - - - - - - - - - - False - True - 0 - - - - - 1000 - 50 - 250 - - - 10 - 0.25 - 1 - - - True - False - 12 - 12 - 12 - 12 - vertical - - - True - False - 0 - in - - - True - False - none - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - True - end - center - - - 1 - 0 - 2 - - - - - True - False - True - Number overlay - 0 - - - 0 - 0 - - - - - True - False - Temporarily show the application numbers over the icons, corresponding to the shortcut. - True - 40 - 0 - - - - 0 - 1 - - - - - - - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - True - end - center - - - 1 - 0 - 2 - - - - - True - False - True - Show the dock if it is hidden - 0 - - - 0 - 0 - - - - - True - False - If using autohide, the dock will appear for a short time when triggering the shortcut. - True - 40 - 0 - - - - 0 - 1 - - - - - - - - - 100 - 80 - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - center - 12 - - - 1 - 0 - - - - - True - False - True - Shortcut for the options above - 0 - - - 0 - 0 - - - - - True - False - Syntax: <Shift>, <Ctrl>, <Alt>, <Super> - True - 40 - 0 - - - - 0 - 1 - - - - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - True - 6 - 32 - - - True - True - end - shortcut_time_adjustment - 3 - - - 1 - 0 - - - - - True - False - True - Hide timeout (s) - 0 - - - 0 - 0 - - - - - - - - - - - - - - False - True - 0 - - - - - 1 - 0.050000000000000003 - 0.25 - - - True - False - 12 - 12 - 12 - 12 - vertical - - - True - False - 0 - in - - - True - False - none - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Show the dock by mouse hover on the screen edge. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Autohide - 0 - - - 0 - 0 - - - - - True - True - end - center - - - 1 - 0 - 2 - - - - - Push to show: require pressure to show the dock - True - True - False - 0 - True - - - 0 - 3 - 2 - - - - - Enable in fullscreen mode - True - True - False - 12 - 0 - True - - - 0 - 2 - 2 - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - 32 - - - True - False - True - Show the dock when it doesn't obstruct application windows. - True - 0 - - - - 0 - 1 - - - - - True - False - True - Dodge windows - 0 - - - 0 - 0 - - - - - True - True - end - center - - - 1 - 0 - 2 - - - - - True - False - vertical - - - All windows - True - True - False - 12 - 0 - True - True - - - - False - True - 0 - - - - - Only focused application's windows - True - True - False - 0 - True - True - all_windows_radio_button - - - - False - True - 1 - - - - - Only maximized windows - True - True - False - 0 - True - True - all_windows_radio_button - - - - False - True - 2 - - - - - 0 - 2 - 2 - - - - - - - - - True - True - - - True - False - 12 - 12 - 12 - 12 - True - 6 - 32 - - - True - True - end - animation_time_adjustment - 3 - - - 1 - 0 - - - - - True - False - True - Animation duration (s) - 0 - - - 0 - 0 - - - - - True - True - end - hide_timeout_adjustment - 3 - - - 1 - 1 - - - - - True - True - end - show_timeout_adjustment - 3 - - - 1 - 2 - - - - - True - True - 0.000 - pressure_threshold_adjustment - - - 1 - 3 - - - - - True - False - True - Hide timeout (s) - 0 - - - 0 - 1 - - - - - True - False - True - Show timeout (s) - 0 - - - 0 - 2 - - - - - True - False - True - Pressure threshold - 0 - - - 0 - 3 - - - - - - - - - - - - - - False - True - 0 - - - - diff --git a/extensions/dash-to-dock/appIconIndicators.js b/extensions/dash-to-dock/appIconIndicators.js deleted file mode 100644 index ddff512..0000000 --- a/extensions/dash-to-dock/appIconIndicators.js +++ /dev/null @@ -1,1102 +0,0 @@ -const Cogl = imports.gi.Cogl; -const Cairo = imports.cairo; -const Clutter = imports.gi.Clutter; -const GdkPixbuf = imports.gi.GdkPixbuf -const Gio = imports.gi.Gio; -const Gtk = imports.gi.Gtk; -const Pango = imports.gi.Pango; -const Shell = imports.gi.Shell; -const St = imports.gi.St; - -const Util = imports.misc.util; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; - -let tracker = Shell.WindowTracker.get_default(); - -const RunningIndicatorStyle = { - DEFAULT: 0, - DOTS: 1, - SQUARES: 2, - DASHES: 3, - SEGMENTED: 4, - SOLID: 5, - CILIORA: 6, - METRO: 7 -}; - -const MAX_WINDOWS_CLASSES = 4; - - -/* - * This is the main indicator class to be used. The desired bahviour is - * obtained by composing the desired classes below based on the settings. - * - */ -var AppIconIndicator = class DashToDock_AppIconIndicator { - - constructor(source, settings) { - this._indicators = []; - - // Unity indicators always enabled for now - let unityIndicator = new UnityIndicator(source, settings); - this._indicators.push(unityIndicator); - - // Choose the style for the running indicators - let runningIndicator = null; - let runningIndicatorStyle; - - if (settings.get_boolean('apply-custom-theme' )) { - runningIndicatorStyle = RunningIndicatorStyle.DOTS; - } else { - runningIndicatorStyle = settings.get_enum('running-indicator-style'); - } - - switch (runningIndicatorStyle) { - case RunningIndicatorStyle.DEFAULT: - runningIndicator = new RunningIndicatorDefault(source, settings); - break; - - case RunningIndicatorStyle.DOTS: - runningIndicator = new RunningIndicatorDots(source, settings); - break; - - case RunningIndicatorStyle.SQUARES: - runningIndicator = new RunningIndicatorSquares(source, settings); - break; - - case RunningIndicatorStyle.DASHES: - runningIndicator = new RunningIndicatorDashes(source, settings); - break; - - case RunningIndicatorStyle.SEGMENTED: - runningIndicator = new RunningIndicatorSegmented(source, settings); - break; - - case RunningIndicatorStyle.SOLID: - runningIndicator = new RunningIndicatorSolid(source, settings); - break; - - case RunningIndicatorStyle.CILIORA: - runningIndicator = new RunningIndicatorCiliora(source, settings); - break; - - case RunningIndicatorStyle.METRO: - runningIndicator = new RunningIndicatorMetro(source, settings); - break; - - default: - runningIndicator = new RunningIndicatorBase(source, settings); - } - - this._indicators.push(runningIndicator); - } - - update() { - for (let i=0; i { - this._signalsHandler.destroy(); - }); - } - - update() { - } - - destroy() { - this._source.actor.disconnect(this._sourceDestroyId); - this._signalsHandler.destroy(); - } -}; - -/* - * A base indicator class for running style, from which all other EunningIndicators should derive, - * providing some basic methods, variables definitions and their update, css style classes handling. - * - */ -var RunningIndicatorBase = class DashToDock_RunningIndicatorBase extends IndicatorBase { - - constructor(source, settings) { - super(source, settings) - - this._side = Utils.getPosition(this._settings); - this._nWindows = 0; - - this._dominantColorExtractor = new DominantColorExtractor(this._source.app); - - // These statuses take into account the workspace/monitor isolation - this._isFocused = false; - this._isRunning = false; - } - - update() { - // Limit to 1 to MAX_WINDOWS_CLASSES windows classes - this._nWindows = Math.min(this._source.getInterestingWindows().length, MAX_WINDOWS_CLASSES); - - // We need to check the number of windows, as the focus might be - // happening on another monitor if using isolation - if (tracker.focus_app == this._source.app && this._nWindows > 0) - this._isFocused = true; - else - this._isFocused = false; - - // In the case of workspace isolation, we need to hide the dots of apps with - // no windows in the current workspace - if (this._source.app.state != Shell.AppState.STOPPED && this._nWindows > 0) - this._isRunning = true; - else - this._isRunning = false; - - this._updateCounterClass(); - this._updateFocusClass(); - this._updateDefaultDot(); - } - - _updateCounterClass() { - for (let i = 1; i <= MAX_WINDOWS_CLASSES; i++) { - let className = 'running' + i; - if (i != this._nWindows) - this._source.actor.remove_style_class_name(className); - else - this._source.actor.add_style_class_name(className); - } - } - - _updateFocusClass() { - if (this._isFocused) - this._source.actor.add_style_class_name('focused'); - else - this._source.actor.remove_style_class_name('focused'); - } - - _updateDefaultDot() { - if (this._isRunning) - this._source._dot.show(); - else - this._source._dot.hide(); - } - - _hideDefaultDot() { - // I use opacity to hide the default dot because the show/hide function - // are used by the parent class. - this._source._dot.opacity = 0; - } - - _restoreDefaultDot() { - this._source._dot.opacity = 255; - } - - _enableBacklight() { - - let colorPalette = this._dominantColorExtractor._getColorPalette(); - - // Fallback - if (colorPalette === null) { - this._source._iconContainer.set_style( - 'border-radius: 5px;' + - 'background-gradient-direction: vertical;' + - 'background-gradient-start: #e0e0e0;' + - 'background-gradient-end: darkgray;' - ); - - return; - } - - this._source._iconContainer.set_style( - 'border-radius: 5px;' + - 'background-gradient-direction: vertical;' + - 'background-gradient-start: ' + colorPalette.original + ';' + - 'background-gradient-end: ' + colorPalette.darker + ';' - ); - - } - - _disableBacklight() { - this._source._iconContainer.set_style(null); - } - - destroy() { - this._disableBacklight(); - // Remove glossy background if the children still exists - if (this._source._iconContainer.get_children().length > 1) - this._source._iconContainer.get_children()[1].set_style(null); - this._restoreDefaultDot(); - - super.destroy(); - } -}; - -// We add a css class so third parties themes can limit their indicaor customization -// to the case we do nothing -var RunningIndicatorDefault = class DashToDock_RunningIndicatorDefault extends RunningIndicatorBase { - - constructor(source, settings) { - super(source, settings); - this._source.actor.add_style_class_name('default'); - } - - destory() { - this._source.actor.remove_style_class_name('default'); - super.destroy(); - } -}; - -var RunningIndicatorDots = class DashToDock_RunningIndicatorDots extends RunningIndicatorBase { - - constructor(source, settings) { - super(source, settings) - - this._hideDefaultDot(); - - this._area = new St.DrawingArea({x_expand: true, y_expand: true}); - - // We draw for the bottom case and rotate the canvas for other placements - //set center of rotatoins to the center - this._area.set_pivot_point(0.5, 0.5); - // prepare transformation matrix - let m = new Cogl.Matrix(); - m.init_identity(); - - switch (this._side) { - case St.Side.TOP: - m.xx = -1; - m.rotate(180, 0, 0, 1); - break - - case St.Side.BOTTOM: - // nothing - break; - - case St.Side.LEFT: - m.yy = -1; - m.rotate(90, 0, 0, 1); - break; - - case St.Side.RIGHT: - m.rotate(-90, 0, 0, 1); - break - } - - this._area.set_transform(m); - - this._area.connect('repaint', this._updateIndicator.bind(this)); - this._source._iconContainer.add_child(this._area); - - let keys = ['custom-theme-running-dots-color', - 'custom-theme-running-dots-border-color', - 'custom-theme-running-dots-border-width', - 'custom-theme-customize-running-dots', - 'unity-backlit-items', - 'running-indicator-dominant-color']; - - keys.forEach(function(key) { - this._signalsHandler.add([ - this._settings, - 'changed::' + key, - this.update.bind(this) - ]); - }, this); - - // Apply glossy background - // TODO: move to enable/disableBacklit to apply itonly to the running apps? - // TODO: move to css class for theming support - this._glossyBackgroundStyle = 'background-image: url(\'' + Me.path + '/media/glossy.svg\');' + - 'background-size: contain;'; - } - - update() { - super.update(); - - // Enable / Disable the backlight of running apps - if (!this._settings.get_boolean('apply-custom-theme') && this._settings.get_boolean('unity-backlit-items')) { - this._source._iconContainer.get_children()[1].set_style(this._glossyBackgroundStyle); - if (this._isRunning) - this._enableBacklight(); - else - this._disableBacklight(); - } else { - this._disableBacklight(); - this._source._iconContainer.get_children()[1].set_style(null); - } - - if (this._area) - this._area.queue_repaint(); - } - - _computeStyle() { - - let [width, height] = this._area.get_surface_size(); - this._width = height; - this._height = width; - - // By defaut re-use the style - background color, and border width and color - - // of the default dot - let themeNode = this._source._dot.get_theme_node(); - this._borderColor = themeNode.get_border_color(this._side); - this._borderWidth = themeNode.get_border_width(this._side); - this._bodyColor = themeNode.get_background_color(); - - if (!this._settings.get_boolean('apply-custom-theme')) { - // Adjust for the backlit case - if (this._settings.get_boolean('unity-backlit-items')) { - // Use dominant color for dots too if the backlit is enables - let colorPalette = this._dominantColorExtractor._getColorPalette(); - - // Slightly adjust the styling - this._borderWidth = 2; - - if (colorPalette !== null) { - this._borderColor = Clutter.color_from_string(colorPalette.lighter)[1] ; - this._bodyColor = Clutter.color_from_string(colorPalette.darker)[1]; - } else { - // Fallback - this._borderColor = Clutter.color_from_string('white')[1]; - this._bodyColor = Clutter.color_from_string('gray')[1]; - } - } - - // Apply dominant color if requested - if (this._settings.get_boolean('running-indicator-dominant-color')) { - let colorPalette = this._dominantColorExtractor._getColorPalette(); - if (colorPalette !== null) { - this._bodyColor = Clutter.color_from_string(colorPalette.original)[1]; - } - } - - // Finally, use customize style if requested - if (this._settings.get_boolean('custom-theme-customize-running-dots')) { - this._borderColor = Clutter.color_from_string(this._settings.get_string('custom-theme-running-dots-border-color'))[1]; - this._borderWidth = this._settings.get_int('custom-theme-running-dots-border-width'); - this._bodyColor = Clutter.color_from_string(this._settings.get_string('custom-theme-running-dots-color'))[1]; - } - } - - // Define the radius as an arbitrary size, but keep large enough to account - // for the drawing of the border. - this._radius = Math.max(this._width/22, this._borderWidth/2); - this._padding = 0; // distance from the margin - this._spacing = this._radius + this._borderWidth; // separation between the dots - } - - _updateIndicator() { - - let area = this._area; - let cr = this._area.get_context(); - - this._computeStyle(); - this._drawIndicator(cr); - cr.$dispose(); - } - - _drawIndicator(cr) { - // Draw the required numbers of dots - let n = this._nWindows; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - // draw for the bottom case: - cr.translate((this._width - (2*n)*this._radius - (n-1)*this._spacing)/2, this._height - this._padding); - for (let i = 0; i < n; i++) { - cr.newSubPath(); - cr.arc((2*i+1)*this._radius + i*this._spacing, -this._radius - this._borderWidth/2, this._radius, 0, 2*Math.PI); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - - destroy() { - this._area.destroy(); - super.destroy(); - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorCiliora = class DashToDock_RunningIndicatorCiliora extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - - let size = Math.max(this._width/20, this._borderWidth); - let spacing = size; // separation between the dots - let lineLength = this._width - (size*(this._nWindows-1)) - (spacing*(this._nWindows-1)); - let padding = this._borderWidth; - // For the backlit case here we don't want the outer border visible - if (this._settings.get_boolean('unity-backlit-items') && !this._settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(0, yOffset); - cr.newSubPath(); - cr.rectangle(0, 0, lineLength, size); - for (let i = 1; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(lineLength + (i*spacing) + ((i-1)*size), 0, size, size); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorSegmented = class DashToDock_RunningIndicatorSegmented extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/20, this._borderWidth); - let spacing = Math.ceil(this._width/18); // separation between the dots - let dashLength = Math.ceil((this._width - ((this._nWindows-1)*spacing))/this._nWindows); - let lineLength = this._width - (size*(this._nWindows-1)) - (spacing*(this._nWindows-1)); - let padding = this._borderWidth; - // For the backlit case here we don't want the outer border visible - if (this._settings.get_boolean('unity-backlit-items') && !this._settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(0, yOffset); - for (let i = 0; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(i*dashLength + i*spacing, 0, dashLength, size); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill() - } - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorSolid = class DashToDock_RunningIndicatorSolid extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - - let size = Math.max(this._width/20, this._borderWidth); - let padding = this._borderWidth; - // For the backlit case here we don't want the outer border visible - if (this._settings.get_boolean('unity-backlit-items') && !this._settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(0, yOffset); - cr.newSubPath(); - cr.rectangle(0, 0, this._width, size); - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - - } - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorSquares = class DashToDock_RunningIndicatorSquares extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/11, this._borderWidth); - let padding = this._borderWidth; - let spacing = Math.ceil(this._width/18); // separation between the dots - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(Math.floor((this._width - this._nWindows*size - (this._nWindows-1)*spacing)/2), yOffset); - for (let i = 0; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(i*size + i*spacing, 0, size, size); - } - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - } -} - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorDashes = class DashToDock_RunningIndicatorDashes extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/20, this._borderWidth); - let padding = this._borderWidth; - let spacing = Math.ceil(this._width/18); // separation between the dots - let dashLength = Math.floor(this._width/4) - spacing; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(Math.floor((this._width - this._nWindows*dashLength - (this._nWindows-1)*spacing)/2), yOffset); - for (let i = 0; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(i*dashLength + i*spacing, 0, dashLength, size); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - } -} - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorMetro = class DashToDock_RunningIndicatorMetro extends RunningIndicatorDots { - - constructor(source, settings) { - super(source, settings); - this._source.actor.add_style_class_name('metro'); - } - - destroy() { - this._source.actor.remove_style_class_name('metro'); - super.destroy(); - } - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/20, this._borderWidth); - let padding = 0; - // For the backlit case here we don't want the outer border visible - if (this._settings.get_boolean('unity-backlit-items') && !this._settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - let n = this._nWindows; - if(n <= 1) { - cr.translate(0, yOffset); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.newSubPath(); - cr.rectangle(0, 0, this._width, size); - cr.fill(); - } else { - let blackenedLength = (1/48)*this._width; // need to scale with the SVG for the stacked highlight - let darkenedLength = this._isFocused ? (2/48)*this._width : (10/48)*this._width; - let blackenedColor = this._bodyColor.shade(.3); - let darkenedColor = this._bodyColor.shade(.7); - - cr.translate(0, yOffset); - - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.newSubPath(); - cr.rectangle(0, 0, this._width - darkenedLength - blackenedLength, size); - cr.fill(); - Clutter.cairo_set_source_color(cr, blackenedColor); - cr.newSubPath(); - cr.rectangle(this._width - darkenedLength - blackenedLength, 0, 1, size); - cr.fill(); - Clutter.cairo_set_source_color(cr, darkenedColor); - cr.newSubPath(); - cr.rectangle(this._width - darkenedLength, 0, darkenedLength, size); - cr.fill(); - } - } - } -} - -/* - * Unity like notification and progress indicators - */ -var UnityIndicator = class DashToDock_UnityIndicator extends IndicatorBase { - - constructor(source, settings) { - - super(source, settings); - - this._notificationBadgeLabel = new St.Label(); - this._notificationBadgeBin = new St.Bin({ - child: this._notificationBadgeLabel, - x_align: St.Align.END, y_align: St.Align.START, - x_expand: true, y_expand: true - }); - this._notificationBadgeLabel.add_style_class_name('notification-badge'); - this._notificationBadgeCount = 0; - this._notificationBadgeBin.hide(); - - this._source._iconContainer.add_child(this._notificationBadgeBin); - this._source._iconContainer.connect('allocation-changed', this.updateNotificationBadge.bind(this)); - - this._remoteEntries = []; - this._source.remoteModel.lookupById(this._source.app.id).forEach( - (entry) => { - this.insertEntryRemote(entry); - } - ); - - this._signalsHandler.add([ - this._source.remoteModel, - 'entry-added', - this._onLauncherEntryRemoteAdded.bind(this) - ], [ - this._source.remoteModel, - 'entry-removed', - this._onLauncherEntryRemoteRemoved.bind(this) - ]) - } - - _onLauncherEntryRemoteAdded(remoteModel, entry) { - if (!entry || !entry.appId()) - return; - if (this._source && this._source.app && this._source.app.id == entry.appId()) { - this.insertEntryRemote(entry); - } - } - - _onLauncherEntryRemoteRemoved(remoteModel, entry) { - if (!entry || !entry.appId()) - return; - - if (this._source && this._source.app && this._source.app.id == entry.appId()) { - this.removeEntryRemote(entry); - } - } - - updateNotificationBadge() { - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let [minWidth, natWidth] = this._source._iconContainer.get_preferred_width(-1); - let logicalNatWidth = natWidth / scaleFactor; - let font_size = Math.max(10, Math.round(logicalNatWidth / 5)); - let margin_left = Math.round(logicalNatWidth / 4); - - this._notificationBadgeLabel.set_style( - 'font-size: ' + font_size + 'px;' + - 'margin-left: ' + margin_left + 'px;' - ); - - this._notificationBadgeBin.width = Math.round(logicalNatWidth - margin_left); - this._notificationBadgeLabel.clutter_text.ellipsize = Pango.EllipsizeMode.MIDDLE; - } - - _notificationBadgeCountToText(count) { - if (count <= 9999) { - return count.toString(); - } else if (count < 1e5) { - let thousands = count / 1e3; - return thousands.toFixed(1).toString() + "k"; - } else if (count < 1e6) { - let thousands = count / 1e3; - return thousands.toFixed(0).toString() + "k"; - } else if (count < 1e8) { - let millions = count / 1e6; - return millions.toFixed(1).toString() + "M"; - } else if (count < 1e9) { - let millions = count / 1e6; - return millions.toFixed(0).toString() + "M"; - } else { - let billions = count / 1e9; - return billions.toFixed(1).toString() + "B"; - } - } - - setNotificationBadge(count) { - this._notificationBadgeCount = count; - let text = this._notificationBadgeCountToText(count); - this._notificationBadgeLabel.set_text(text); - } - - toggleNotificationBadge(activate) { - if (activate && this._notificationBadgeCount > 0) { - this.updateNotificationBadge(); - this._notificationBadgeBin.show(); - } - else - this._notificationBadgeBin.hide(); - } - - _showProgressOverlay() { - if (this._progressOverlayArea) { - this._updateProgressOverlay(); - return; - } - - this._progressOverlayArea = new St.DrawingArea({x_expand: true, y_expand: true}); - this._progressOverlayArea.connect('repaint', () => { - this._drawProgressOverlay(this._progressOverlayArea); - }); - - this._source._iconContainer.add_child(this._progressOverlayArea); - this._updateProgressOverlay(); - } - - _hideProgressOverlay() { - if (this._progressOverlayArea) - this._progressOverlayArea.destroy(); - this._progressOverlayArea = null; - } - - _updateProgressOverlay() { - if (this._progressOverlayArea) - this._progressOverlayArea.queue_repaint(); - } - - _drawProgressOverlay(area) { - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let [surfaceWidth, surfaceHeight] = area.get_surface_size(); - let cr = area.get_context(); - - let iconSize = this._source.icon.iconSize * scaleFactor; - - let x = Math.floor((surfaceWidth - iconSize) / 2); - let y = Math.floor((surfaceHeight - iconSize) / 2); - - let lineWidth = Math.floor(1.0 * scaleFactor); - let padding = Math.floor(iconSize * 0.05); - let width = iconSize - 2.0*padding; - let height = Math.floor(Math.min(18.0*scaleFactor, 0.20*iconSize)); - x += padding; - y += iconSize - height - padding; - - cr.setLineWidth(lineWidth); - - // Draw the outer stroke - let stroke = new Cairo.LinearGradient(0, y, 0, y + height); - let fill = null; - stroke.addColorStopRGBA(0.5, 0.5, 0.5, 0.5, 0.1); - stroke.addColorStopRGBA(0.9, 0.8, 0.8, 0.8, 0.4); - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); - - // Draw the background - x += lineWidth; - y += lineWidth; - width -= 2.0*lineWidth; - height -= 2.0*lineWidth; - - stroke = Cairo.SolidPattern.createRGBA(0.20, 0.20, 0.20, 0.9); - fill = new Cairo.LinearGradient(0, y, 0, y + height); - fill.addColorStopRGBA(0.4, 0.25, 0.25, 0.25, 1.0); - fill.addColorStopRGBA(0.9, 0.35, 0.35, 0.35, 1.0); - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); - - // Draw the finished bar - x += lineWidth; - y += lineWidth; - width -= 2.0*lineWidth; - height -= 2.0*lineWidth; - - let finishedWidth = Math.ceil(this._progress * width); - stroke = Cairo.SolidPattern.createRGBA(0.8, 0.8, 0.8, 1.0); - fill = Cairo.SolidPattern.createRGBA(0.9, 0.9, 0.9, 1.0); - - if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) - Utils.drawRoundedLine(cr, x + lineWidth/2.0 + width - finishedWidth, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); - else - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); - - cr.$dispose(); - } - - setProgress(progress) { - this._progress = Math.min(Math.max(progress, 0.0), 1.0); - this._updateProgressOverlay(); - } - - toggleProgressOverlay(activate) { - if (activate) { - this._showProgressOverlay(); - } - else { - this._hideProgressOverlay(); - } - } - - insertEntryRemote(remote) { - if (!remote || this._remoteEntries.indexOf(remote) !== -1) - return; - - this._remoteEntries.push(remote); - this._selectEntryRemote(remote); - } - - removeEntryRemote(remote) { - if (!remote || this._remoteEntries.indexOf(remote) == -1) - return; - - this._remoteEntries.splice(this._remoteEntries.indexOf(remote), 1); - - if (this._remoteEntries.length > 0) { - this._selectEntryRemote(this._remoteEntries[this._remoteEntries.length-1]); - } else { - this.setNotificationBadge(0); - this.toggleNotificationBadge(false); - this.setProgress(0); - this.toggleProgressOverlay(false); - } - } - - _selectEntryRemote(remote) { - if (!remote) - return; - - this._signalsHandler.removeWithLabel('entry-remotes'); - - this._signalsHandler.addWithLabel('entry-remotes', - [ - remote, - 'count-changed', - (remote, value) => { - this.setNotificationBadge(value); - } - ], [ - remote, - 'count-visible-changed', - (remote, value) => { - this.toggleNotificationBadge(value); - } - ], [ - remote, - 'progress-changed', - (remote, value) => { - this.setProgress(value); - } - ], [ - remote, - 'progress-visible-changed', - (remote, value) => { - this.toggleProgressOverlay(value); - } - ]); - - this.setNotificationBadge(remote.count()); - this.toggleNotificationBadge(remote.countVisible()); - this.setProgress(remote.progress()); - this.toggleProgressOverlay(remote.progressVisible()); - } -} - - -// We need an icons theme object, this is the only way I managed to get -// pixel buffers that can be used for calculating the backlight color -let themeLoader = null; - -// Global icon cache. Used for Unity7 styling. -let iconCacheMap = new Map(); -// Max number of items to store -// We don't expect to ever reach this number, but let's put an hard limit to avoid -// even the remote possibility of the cached items to grow indefinitely. -const MAX_CACHED_ITEMS = 1000; -// When the size exceed it, the oldest 'n' ones are deleted -const BATCH_SIZE_TO_DELETE = 50; -// The icon size used to extract the dominant color -const DOMINANT_COLOR_ICON_SIZE = 64; - -// Compute dominant color frim the app icon. -// The color is cached for efficiency. -var DominantColorExtractor = class DashToDock_DominantColorExtractor { - - constructor(app) { - this._app = app; - } - - /** - * Try to get the pixel buffer for the current icon, if not fail gracefully - */ - _getIconPixBuf() { - let iconTexture = this._app.create_icon_texture(16); - - if (themeLoader === null) { - let ifaceSettings = new Gio.Settings({ schema: "org.gnome.desktop.interface" }); - - themeLoader = new Gtk.IconTheme(), - themeLoader.set_custom_theme(ifaceSettings.get_string('icon-theme')); // Make sure the correct theme is loaded - } - - // Unable to load the icon texture, use fallback - if (iconTexture instanceof St.Icon === false) { - return null; - } - - iconTexture = iconTexture.get_gicon(); - - // Unable to load the icon texture, use fallback - if (iconTexture === null) { - return null; - } - - if (iconTexture instanceof Gio.FileIcon) { - // Use GdkPixBuf to load the pixel buffer from the provided file path - return GdkPixbuf.Pixbuf.new_from_file(iconTexture.get_file().get_path()); - } - - // Get the pixel buffer from the icon theme - let icon_info = themeLoader.lookup_icon(iconTexture.get_names()[0], DOMINANT_COLOR_ICON_SIZE, 0); - if (icon_info !== null) - return icon_info.load_icon(); - else - return null; - } - - /** - * The backlight color choosing algorithm was mostly ported to javascript from the - * Unity7 C++ source of Canonicals: - * https://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/launcher/LauncherIcon.cpp - * so it more or less works the same way. - */ - _getColorPalette() { - if (iconCacheMap.get(this._app.get_id())) { - // We already know the answer - return iconCacheMap.get(this._app.get_id()); - } - - let pixBuf = this._getIconPixBuf(); - if (pixBuf == null) - return null; - - let pixels = pixBuf.get_pixels(), - offset = 0; - - let total = 0, - rTotal = 0, - gTotal = 0, - bTotal = 0; - - let resample_y = 1, - resample_x = 1; - - // Resampling of large icons - // We resample icons larger than twice the desired size, as the resampling - // to a size s - // DOMINANT_COLOR_ICON_SIZE < s < 2*DOMINANT_COLOR_ICON_SIZE, - // most of the case exactly DOMINANT_COLOR_ICON_SIZE as the icon size is tipycally - // a multiple of it. - let width = pixBuf.get_width(); - let height = pixBuf.get_height(); - - // Resample - if (height >= 2* DOMINANT_COLOR_ICON_SIZE) - resample_y = Math.floor(height/DOMINANT_COLOR_ICON_SIZE); - - if (width >= 2* DOMINANT_COLOR_ICON_SIZE) - resample_x = Math.floor(width/DOMINANT_COLOR_ICON_SIZE); - - if (resample_x !==1 || resample_y !== 1) - pixels = this._resamplePixels(pixels, resample_x, resample_y); - - // computing the limit outside the for (where it would be repeated at each iteration) - // for performance reasons - let limit = pixels.length; - for (let offset = 0; offset < limit; offset+=4) { - let r = pixels[offset], - g = pixels[offset + 1], - b = pixels[offset + 2], - a = pixels[offset + 3]; - - let saturation = (Math.max(r,g, b) - Math.min(r,g, b)); - let relevance = 0.1 * 255 * 255 + 0.9 * a * saturation; - - rTotal += r * relevance; - gTotal += g * relevance; - bTotal += b * relevance; - - total += relevance; - } - - total = total * 255; - - let r = rTotal / total, - g = gTotal / total, - b = bTotal / total; - - let hsv = Utils.ColorUtils.RGBtoHSV(r * 255, g * 255, b * 255); - - if (hsv.s > 0.15) - hsv.s = 0.65; - hsv.v = 0.90; - - let rgb = Utils.ColorUtils.HSVtoRGB(hsv.h, hsv.s, hsv.v); - - // Cache the result. - let backgroundColor = { - lighter: Utils.ColorUtils.ColorLuminance(rgb.r, rgb.g, rgb.b, 0.2), - original: Utils.ColorUtils.ColorLuminance(rgb.r, rgb.g, rgb.b, 0), - darker: Utils.ColorUtils.ColorLuminance(rgb.r, rgb.g, rgb.b, -0.5) - }; - - if (iconCacheMap.size >= MAX_CACHED_ITEMS) { - //delete oldest cached values (which are in order of insertions) - let ctr=0; - for (let key of iconCacheMap.keys()) { - if (++ctr > BATCH_SIZE_TO_DELETE) - break; - iconCacheMap.delete(key); - } - } - - iconCacheMap.set(this._app.get_id(), backgroundColor); - - return backgroundColor; - } - - /** - * Downsample large icons before scanning for the backlight color to - * improve performance. - * - * @param pixBuf - * @param pixels - * @param resampleX - * @param resampleY - * - * @return []; - */ - _resamplePixels (pixels, resampleX, resampleY) { - let resampledPixels = []; - // computing the limit outside the for (where it would be repeated at each iteration) - // for performance reasons - let limit = pixels.length / (resampleX * resampleY) / 4; - for (let i = 0; i < limit; i++) { - let pixel = i * resampleX * resampleY; - - resampledPixels.push(pixels[pixel * 4]); - resampledPixels.push(pixels[pixel * 4 + 1]); - resampledPixels.push(pixels[pixel * 4 + 2]); - resampledPixels.push(pixels[pixel * 4 + 3]); - } - - return resampledPixels; - } -}; diff --git a/extensions/dash-to-dock/appIcons.js b/extensions/dash-to-dock/appIcons.js deleted file mode 100644 index 3b28304..0000000 --- a/extensions/dash-to-dock/appIcons.js +++ /dev/null @@ -1,1172 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const GdkPixbuf = imports.gi.GdkPixbuf -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const Gtk = imports.gi.Gtk; -const Signals = imports.signals; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; -const Mainloop = imports.mainloop; - -// Use __ () and N__() for the extension gettext domain, and reuse -// the shell domain with the default _() and N_() -const Gettext = imports.gettext.domain('dashtodock'); -const __ = Gettext.gettext; -const N__ = function(e) { return e }; - -const AppDisplay = imports.ui.appDisplay; -const AppFavorites = imports.ui.appFavorites; -const Dash = imports.ui.dash; -const DND = imports.ui.dnd; -const IconGrid = imports.ui.iconGrid; -const Main = imports.ui.main; -const PopupMenu = imports.ui.popupMenu; -const Tweener = imports.ui.tweener; -const Util = imports.misc.util; -const Workspace = imports.ui.workspace; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; -const WindowPreview = Me.imports.windowPreview; -const AppIconIndicators = Me.imports.appIconIndicators; - -let tracker = Shell.WindowTracker.get_default(); - -let DASH_ITEM_LABEL_SHOW_TIME = Dash.DASH_ITEM_LABEL_SHOW_TIME; - -const clickAction = { - SKIP: 0, - MINIMIZE: 1, - LAUNCH: 2, - CYCLE_WINDOWS: 3, - MINIMIZE_OR_OVERVIEW: 4, - PREVIEWS: 5, - MINIMIZE_OR_PREVIEWS: 6, - FOCUS_OR_PREVIEWS: 7, - QUIT: 8, -}; - -const scrollAction = { - DO_NOTHING: 0, - CYCLE_WINDOWS: 1, - SWITCH_WORKSPACE: 2 -}; - -let recentlyClickedAppLoopId = 0; -let recentlyClickedApp = null; -let recentlyClickedAppWindows = null; -let recentlyClickedAppIndex = 0; -let recentlyClickedAppMonitor = -1; - -/** - * Extend AppIcon - * - * - Pass settings to the constructor and bind settings changes - * - Apply a css class based on the number of windows of each application (#N); - * - Customized indicators for running applications in place of the default "dot" style which is hidden (#N); - * a class of the form "running#N" is applied to the AppWellIcon actor. - * like the original .running one. - * - Add a .focused style to the focused app - * - Customize click actions. - * - Update minimization animation target - * - Update menu if open on windows change - */ -var MyAppIcon = class DashToDock_AppIcon extends AppDisplay.AppIcon { - - // settings are required inside. - constructor(settings, remoteModel, app, monitorIndex, iconParams) { - super(app, iconParams); - - // a prefix is required to avoid conflicting with the parent class variable - this._dtdSettings = settings; - this.monitorIndex = monitorIndex; - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this.remoteModel = remoteModel; - this._indicator = null; - - this._updateIndicatorStyle(); - - // Monitor windows-changes instead of app state. - // Keep using the same Id and function callback (that is extended) - if (this._stateChangedId > 0) { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; - } - - this._windowsChangedId = this.app.connect('windows-changed', - this.onWindowsChanged.bind(this)); - this._focusAppChangeId = tracker.connect('notify::focus-app', - this._onFocusAppChanged.bind(this)); - - // In Wayland sessions, this signal is needed to track the state of windows dragged - // from one monitor to another. As this is triggered quite often (whenever a new winow - // of any application opened or moved to a different desktop), - // we restrict this signal to the case when 'isolate-monitors' is true, - // and if there are at least 2 monitors. - if (this._dtdSettings.get_boolean('isolate-monitors') && - Main.layoutManager.monitors.length > 1) { - this._signalsHandler.removeWithLabel('isolate-monitors'); - this._signalsHandler.addWithLabel('isolate-monitors', [ - global.display, - 'window-entered-monitor', - this._onWindowEntered.bind(this) - ]); - } - - this._progressOverlayArea = null; - this._progress = 0; - - let keys = ['apply-custom-theme', - 'running-indicator-style', - ]; - - keys.forEach(function(key) { - this._signalsHandler.add([ - this._dtdSettings, - 'changed::' + key, - this._updateIndicatorStyle.bind(this) - ]); - }, this); - - this._dtdSettings.connect('changed::scroll-action', () => { - this._optionalScrollCycleWindows(); - }); - this._optionalScrollCycleWindows(); - - this._numberOverlay(); - - this._previewMenuManager = null; - this._previewMenu = null; - } - - _onDestroy() { - super._onDestroy(); - - // This is necessary due to an upstream bug - // https://bugzilla.gnome.org/show_bug.cgi?id=757556 - // It can be safely removed once it get solved upstrea. - if (this._menu) - this._menu.close(false); - - // Disconect global signals - - if (this._windowsChangedId > 0) - this.app.disconnect(this._windowsChangedId); - this._windowsChangedId = 0; - - if (this._focusAppChangeId > 0) { - tracker.disconnect(this._focusAppChangeId); - this._focusAppChangeId = 0; - } - - this._signalsHandler.destroy(); - - if (this._scrollEventHandler) - this.actor.disconnect(this._scrollEventHandler); - } - - // TOOD Rename this function - _updateIndicatorStyle() { - - if (this._indicator !== null) { - this._indicator.destroy(); - this._indicator = null; - } - this._indicator = new AppIconIndicators.AppIconIndicator(this, this._dtdSettings); - this._indicator.update(); - } - - _onWindowEntered(metaScreen, monitorIndex, metaWin) { - let app = Shell.WindowTracker.get_default().get_window_app(metaWin); - if (app && app.get_id() == this.app.get_id()) - this.onWindowsChanged(); - } - - _optionalScrollCycleWindows() { - if (this._scrollEventHandler) { - this.actor.disconnect(this._scrollEventHandler); - this._scrollEventHandler = 0; - } - - let isEnabled = this._dtdSettings.get_enum('scroll-action') === scrollAction.CYCLE_WINDOWS; - if (!isEnabled) return; - this._scrollEventHandler = this.actor.connect('scroll-event', - this.onScrollEvent.bind(this)); - } - - onScrollEvent(actor, event) { - - // We only activate windows of running applications, i.e. we never open new windows - // We check if the app is running, and that the # of windows is > 0 in - // case we use workspace isolation, - let appIsRunning = this.app.state == Shell.AppState.RUNNING - && this.getInterestingWindows().length > 0; - - if (!appIsRunning) - return false - - if (this._optionalScrollCycleWindowsDeadTimeId > 0) - return false; - else - this._optionalScrollCycleWindowsDeadTimeId = Mainloop.timeout_add(250, () => { - this._optionalScrollCycleWindowsDeadTimeId = 0; - }); - - let direction = null; - - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - direction = Meta.MotionDirection.UP; - break; - case Clutter.ScrollDirection.DOWN: - direction = Meta.MotionDirection.DOWN; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - if (dy < 0) - direction = Meta.MotionDirection.UP; - else if (dy > 0) - direction = Meta.MotionDirection.DOWN; - break; - } - - let focusedApp = tracker.focus_app; - if (!Main.overview._shown) { - let reversed = direction === Meta.MotionDirection.UP; - if (this.app == focusedApp) - this._cycleThroughWindows(reversed); - else { - // Activate the first window - let windows = this.getInterestingWindows(); - if (windows.length > 0) { - let w = windows[0]; - Main.activateWindow(w); - } - } - } - else - this.app.activate(); - return true; - } - - onWindowsChanged() { - - if (this._menu && this._menu.isOpen) - this._menu.update(); - - this._indicator.update(); - this.updateIconGeometry(); - } - - /** - * Update taraget for minimization animation - */ - updateIconGeometry() { - // If (for unknown reason) the actor is not on the stage the reported size - // and position are random values, which might exceeds the integer range - // resulting in an error when assigned to the a rect. This is a more like - // a workaround to prevent flooding the system with errors. - if (this.actor.get_stage() == null) - return; - - let rect = new Meta.Rectangle(); - - [rect.x, rect.y] = this.actor.get_transformed_position(); - [rect.width, rect.height] = this.actor.get_transformed_size(); - - let windows = this.app.get_windows(); - if (this._dtdSettings.get_boolean('multi-monitor')){ - let monitorIndex = this.monitorIndex; - windows = windows.filter(function(w) { - return w.get_monitor() == monitorIndex; - }); - } - windows.forEach(function(w) { - w.set_icon_geometry(rect); - }); - } - - _updateRunningStyle() { - // The logic originally in this function has been moved to - // AppIconIndicatorBase._updateDefaultDot(). However it cannot be removed as - // it called by the parent constructor. - } - - popupMenu() { - this._removeMenuTimeout(); - this.actor.fake_release(); - this._draggable.fakeRelease(); - - if (!this._menu) { - this._menu = new MyAppIconMenu(this, this._dtdSettings); - this._menu.connect('activate-window', (menu, window) => { - this.activateWindow(window); - }); - this._menu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - else { - // Setting the max-height is s useful if part of the menu is - // scrollable so the minimum height is smaller than the natural height. - let monitor_index = Main.layoutManager.findIndexForActor(this.actor); - let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor_index); - let position = Utils.getPosition(this._dtdSettings); - this._isHorizontal = ( position == St.Side.TOP || - position == St.Side.BOTTOM); - // If horizontal also remove the height of the dash - let additional_margin = this._isHorizontal && !this._dtdSettings.get_boolean('dock-fixed') ? Main.overview._dash.actor.height : 0; - let verticalMargins = this._menu.actor.margin_top + this._menu.actor.margin_bottom; - // Also set a max width to the menu, so long labels (long windows title) get truncated - this._menu.actor.style = ('max-height: ' + Math.round(workArea.height - additional_margin - verticalMargins) + 'px;' + - 'max-width: 400px'); - } - }); - let id = Main.overview.connect('hiding', () => { - this._menu.close(); - }); - this._menu.actor.connect('destroy', function() { - Main.overview.disconnect(id); - }); - - this._menuManager.addMenu(this._menu); - } - - this.emit('menu-state-changed', true); - - this.actor.set_hover(true); - this._menu.popup(); - this._menuManager.ignoreRelease(); - this.emit('sync-tooltip'); - - return false; - } - - _onFocusAppChanged() { - this._indicator.update(); - } - - activate(button) { - let event = Clutter.get_current_event(); - let modifiers = event ? event.get_state() : 0; - let focusedApp = tracker.focus_app; - - // Only consider SHIFT and CONTROL as modifiers (exclude SUPER, CAPS-LOCK, etc.) - modifiers = modifiers & (Clutter.ModifierType.SHIFT_MASK | Clutter.ModifierType.CONTROL_MASK); - - // We don't change the CTRL-click behaviour: in such case we just chain - // up the parent method and return. - if (modifiers & Clutter.ModifierType.CONTROL_MASK) { - // Keep default behaviour: launch new window - // By calling the parent method I make it compatible - // with other extensions tweaking ctrl + click - super.activate(button); - return; - } - - // We check what type of click we have and if the modifier SHIFT is - // being used. We then define what buttonAction should be for this - // event. - let buttonAction = 0; - if (button && button == 2 ) { - if (modifiers & Clutter.ModifierType.SHIFT_MASK) - buttonAction = this._dtdSettings.get_enum('shift-middle-click-action'); - else - buttonAction = this._dtdSettings.get_enum('middle-click-action'); - } - else if (button && button == 1) { - if (modifiers & Clutter.ModifierType.SHIFT_MASK) - buttonAction = this._dtdSettings.get_enum('shift-click-action'); - else - buttonAction = this._dtdSettings.get_enum('click-action'); - } - - // We check if the app is running, and that the # of windows is > 0 in - // case we use workspace isolation. - let windows = this.getInterestingWindows(); - let appIsRunning = this.app.state == Shell.AppState.RUNNING - && windows.length > 0; - - // Some action modes (e.g. MINIMIZE_OR_OVERVIEW) require overview to remain open - // This variable keeps track of this - let shouldHideOverview = true; - - // We customize the action only when the application is already running - if (appIsRunning) { - switch (buttonAction) { - case clickAction.MINIMIZE: - // In overview just activate the app, unless the acion is explicitely - // requested with a keyboard modifier - if (!Main.overview._shown || modifiers){ - // If we have button=2 or a modifier, allow minimization even if - // the app is not focused - if (this.app == focusedApp || 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 click_count = 0; - if (Clutter.EventType.CLUTTER_BUTTON_PRESS) - click_count = event.get_click_count(); - let all_windows = (button == 1 && ! modifiers) || click_count > 1; - this._minimizeWindow(all_windows); - } - else - this._activateAllWindows(); - } - else { - let w = windows[0]; - Main.activateWindow(w); - } - break; - - case clickAction.MINIMIZE_OR_OVERVIEW: - // When a single window is present, toggle minimization - // If only one windows is present toggle minimization, but only when trigggered with the - // simple click action (no modifiers, no middle click). - if (windows.length == 1 && !modifiers && button == 1) { - let w = windows[0]; - if (this.app == focusedApp) { - // Window is raised, minimize it - this._minimizeWindow(w); - } else { - // Window is minimized, raise it - Main.activateWindow(w); - } - // Launch overview when multiple windows are present - // TODO: only show current app windows when gnome shell API will allow it - } else { - shouldHideOverview = false; - Main.overview.toggle(); - } - break; - - case clickAction.CYCLE_WINDOWS: - if (!Main.overview._shown){ - if (this.app == focusedApp) - this._cycleThroughWindows(); - else { - // Activate the first window - let w = windows[0]; - Main.activateWindow(w); - } - } - else - this.app.activate(); - break; - - case clickAction.FOCUS_OR_PREVIEWS: - if (this.app == focusedApp && - (windows.length > 1 || modifiers || button != 1)) { - this._windowPreviews(); - } else { - // Activate the first window - let w = windows[0]; - Main.activateWindow(w); - } - break; - - case clickAction.LAUNCH: - this.launchNewWindow(); - break; - - case clickAction.PREVIEWS: - if (!Main.overview._shown) { - // If only one windows is present just switch to it, but only when trigggered with the - // simple click action (no modifiers, no middle click). - if (windows.length == 1 && !modifiers && button == 1) { - let w = windows[0]; - Main.activateWindow(w); - } else - this._windowPreviews(); - } - else { - this.app.activate(); - } - break; - - case clickAction.MINIMIZE_OR_PREVIEWS: - // When a single window is present, toggle minimization - // If only one windows is present toggle minimization, but only when trigggered with the - // simple click action (no modifiers, no middle click). - if (!Main.overview._shown){ - if (windows.length == 1 && !modifiers && button == 1) { - let w = windows[0]; - if (this.app == focusedApp) { - // Window is raised, minimize it - this._minimizeWindow(w); - } else { - // Window is minimized, raise it - Main.activateWindow(w); - } - } else { - // Launch previews when multiple windows are present - this._windowPreviews(); - } - } else { - this.app.activate(); - } - break; - - case clickAction.QUIT: - this.closeAllWindows(); - break; - - case clickAction.SKIP: - let w = windows[0]; - Main.activateWindow(w); - break; - } - } - else { - this.launchNewWindow(); - } - - // Hide overview except when action mode requires it - if(shouldHideOverview) { - Main.overview.hide(); - } - } - - shouldShowTooltip() { - return this.actor.hover && (!this._menu || !this._menu.isOpen) && - (!this._previewMenu || !this._previewMenu.isOpen); - } - - _windowPreviews() { - if (!this._previewMenu) { - this._previewMenuManager = new PopupMenu.PopupMenuManager(this); - - this._previewMenu = new WindowPreview.WindowPreviewMenu(this, this._dtdSettings); - - this._previewMenuManager.addMenu(this._previewMenu); - - this._previewMenu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - }); - let id = Main.overview.connect('hiding', () => { - this._previewMenu.close(); - }); - this._previewMenu.actor.connect('destroy', function() { - Main.overview.disconnect(id); - }); - - } - - if (this._previewMenu.isOpen) - this._previewMenu.close(); - else - this._previewMenu.popup(); - - return false; - } - - // Try to do the right thing when attempting to launch a new window of an app. In - // particular, if the application doens't allow to launch a new window, activate - // the existing window instead. - launchNewWindow(p) { - let appInfo = this.app.get_app_info(); - let actions = appInfo.list_actions(); - if (this.app.can_open_new_window()) { - this.animateLaunch(); - // This is used as a workaround for a bug resulting in no new windows being opened - // for certain running applications when calling open_new_window(). - // - // https://bugzilla.gnome.org/show_bug.cgi?id=756844 - // - // Similar to what done when generating the popupMenu entries, if the application provides - // a "New Window" action, use it instead of directly requesting a new window with - // open_new_window(), which fails for certain application, notably Nautilus. - if (actions.indexOf('new-window') == -1) { - this.app.open_new_window(-1); - } - else { - let i = actions.indexOf('new-window'); - if (i !== -1) - this.app.launch_action(actions[i], global.get_current_time(), -1); - } - } - else { - // Try to manually activate the first window. Otherwise, when the app is activated by - // switching to a different workspace, a launch spinning icon is shown and disappers only - // after a timeout. - let windows = this.app.get_windows(); - if (windows.length > 0) - Main.activateWindow(windows[0]) - else - this.app.activate(); - } - } - - _numberOverlay() { - // Add label for a Hot-Key visual aid - this._numberOverlayLabel = new St.Label(); - this._numberOverlayBin = new St.Bin({ - child: this._numberOverlayLabel, - x_align: St.Align.START, y_align: St.Align.START, - x_expand: true, y_expand: true - }); - this._numberOverlayLabel.add_style_class_name('number-overlay'); - this._numberOverlayOrder = -1; - this._numberOverlayBin.hide(); - - this._iconContainer.add_child(this._numberOverlayBin); - - } - - updateNumberOverlay() { - // We apply an overall scale factor that might come from a HiDPI monitor. - // Clutter dimensions are in physical pixels, but CSS measures are in logical - // pixels, so make sure to consider the scale. - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - // 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._iconContainer.get_preferred_width(-1); - let font_size = Math.round(Math.max(12, 0.3*natWidth) / scaleFactor); - let size = Math.round(font_size*1.2); - this._numberOverlayLabel.set_style( - 'font-size: ' + font_size + 'px;' + - 'border-radius: ' + this.icon.iconSize + 'px;' + - 'width: ' + size + 'px; height: ' + size +'px;' - ); - } - - setNumberOverlay(number) { - this._numberOverlayOrder = number; - this._numberOverlayLabel.set_text(number.toString()); - } - - toggleNumberOverlay(activate) { - if (activate && this._numberOverlayOrder > -1) { - this.updateNumberOverlay(); - this._numberOverlayBin.show(); - } - else - this._numberOverlayBin.hide(); - } - - _minimizeWindow(param) { - // Param true make all app windows minimize - let windows = this.getInterestingWindows(); - let current_workspace = global.workspace_manager.get_active_workspace(); - for (let i = 0; i < windows.length; i++) { - let w = windows[i]; - if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()) { - w.minimize(); - // Just minimize one window. By specification it should be the - // focused window on the current workspace. - if(!param) - break; - } - } - } - - // By default only non minimized windows are activated. - // This activates all windows in the current workspace. - _activateAllWindows() { - // First activate first window so workspace is switched if needed. - // We don't do this if isolation is on! - if (!this._dtdSettings.get_boolean('isolate-workspaces') && - !this._dtdSettings.get_boolean('isolate-monitors')) - this.app.activate(); - - // then activate all other app windows in the current workspace - let windows = this.getInterestingWindows(); - let activeWorkspace = global.workspace_manager.get_active_workspace_index(); - - if (windows.length <= 0) - return; - - let activatedWindows = 0; - - for (let i = windows.length - 1; i >= 0; i--) { - if (windows[i].get_workspace().index() == activeWorkspace) { - Main.activateWindow(windows[i]); - activatedWindows++; - } - } - } - - //This closes all windows of the app. - closeAllWindows() { - let windows = this.getInterestingWindows(); - for (let i = 0; i < windows.length; i++) - windows[i].delete(global.get_current_time()); - } - - _cycleThroughWindows(reversed) { - // Store for a little amount of time last clicked app and its windows - // since the order changes upon window interaction - let MEMORY_TIME=3000; - - let app_windows = this.getInterestingWindows(); - - if (app_windows.length <1) - return - - if (recentlyClickedAppLoopId > 0) - Mainloop.source_remove(recentlyClickedAppLoopId); - recentlyClickedAppLoopId = Mainloop.timeout_add(MEMORY_TIME, this._resetRecentlyClickedApp); - - // If there isn't already a list of windows for the current app, - // or the stored list is outdated, use the current windows list. - let monitorIsolation = this._dtdSettings.get_boolean('isolate-monitors'); - if (!recentlyClickedApp || - recentlyClickedApp.get_id() != this.app.get_id() || - recentlyClickedAppWindows.length != app_windows.length || - (recentlyClickedAppMonitor != this.monitorIndex && monitorIsolation)) { - recentlyClickedApp = this.app; - recentlyClickedAppWindows = app_windows; - recentlyClickedAppMonitor = this.monitorIndex; - recentlyClickedAppIndex = 0; - } - - if (reversed) { - recentlyClickedAppIndex--; - if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; - } else { - recentlyClickedAppIndex++; - } - let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; - let window = recentlyClickedAppWindows[index]; - - Main.activateWindow(window); - } - - _resetRecentlyClickedApp() { - if (recentlyClickedAppLoopId > 0) - Mainloop.source_remove(recentlyClickedAppLoopId); - recentlyClickedAppLoopId=0; - recentlyClickedApp =null; - recentlyClickedAppWindows = null; - recentlyClickedAppIndex = 0; - recentlyClickedAppMonitor = -1; - - return false; - } - - // Filter out unnecessary windows, for instance - // nautilus desktop window. - getInterestingWindows() { - return getInterestingWindows(this.app, this._dtdSettings, this.monitorIndex); - } -}; -/** - * Extend AppIconMenu - * - * - Pass settings to the constructor - * - set popup arrow side based on dash orientation - * - Add close windows option based on quitfromdash extension - * (https://github.com/deuill/shell-extension-quitfromdash) - * - Add open windows thumbnails instead of list - * - update menu when application windows change - */ -const MyAppIconMenu = class DashToDock_MyAppIconMenu extends AppDisplay.AppIconMenu { - - constructor(source, settings) { - let side = Utils.getPosition(settings); - - // Damm it, there has to be a proper way of doing this... - // As I can't call the parent parent constructor (?) passing the side - // parameter, I overwite what I need later - super(source); - - // Change the initialized side where required. - this._arrowSide = side; - this._boxPointer._arrowSide = side; - this._boxPointer._userArrowSide = side; - - this._dtdSettings = settings; - } - - _redisplay() { - this.removeAll(); - - if (this._dtdSettings.get_boolean('show-windows-preview')) { - // Display the app windows menu items and the separator between windows - // of the current desktop and other windows. - - this._allWindowsMenuItem = new PopupMenu.PopupSubMenuMenuItem(__('All Windows'), false); - this._allWindowsMenuItem.actor.hide(); - this.addMenuItem(this._allWindowsMenuItem); - - if (!this._source.app.is_window_backed()) { - this._appendSeparator(); - - let appInfo = this._source.app.get_app_info(); - let actions = appInfo.list_actions(); - if (this._source.app.can_open_new_window() && - actions.indexOf('new-window') == -1) { - this._newWindowMenuItem = this._appendMenuItem(_("New Window")); - this._newWindowMenuItem.connect('activate', () => { - if (this._source.app.state == Shell.AppState.STOPPED) - this._source.animateLaunch(); - - this._source.app.open_new_window(-1); - this.emit('activate-window', null); - }); - this._appendSeparator(); - } - - - if (AppDisplay.discreteGpuAvailable && - this._source.app.state == Shell.AppState.STOPPED && - actions.indexOf('activate-discrete-gpu') == -1) { - this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card")); - this._onDiscreteGpuMenuItem.connect('activate', () => { - if (this._source.app.state == Shell.AppState.STOPPED) - this._source.animateLaunch(); - - this._source.app.launch(0, -1, true); - this.emit('activate-window', null); - }); - } - - for (let i = 0; i < actions.length; i++) { - let action = actions[i]; - let item = this._appendMenuItem(appInfo.get_action_name(action)); - item.connect('activate', (emitter, event) => { - this._source.app.launch_action(action, event.get_time(), -1); - this.emit('activate-window', null); - }); - } - - let canFavorite = global.settings.is_writable('favorite-apps'); - - if (canFavorite) { - this._appendSeparator(); - - let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id()); - - if (isFavorite) { - let item = this._appendMenuItem(_("Remove from Favorites")); - item.connect('activate', () => { - let favs = AppFavorites.getAppFavorites(); - favs.removeFavorite(this._source.app.get_id()); - }); - } else { - let item = this._appendMenuItem(_("Add to Favorites")); - item.connect('activate', () => { - let favs = AppFavorites.getAppFavorites(); - favs.addFavorite(this._source.app.get_id()); - }); - } - } - - if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) { - this._appendSeparator(); - let item = this._appendMenuItem(_("Show Details")); - item.connect('activate', () => { - let id = this._source.app.get_id(); - let args = GLib.Variant.new('(ss)', [id, '']); - Gio.DBus.get(Gio.BusType.SESSION, null, - function(o, res) { - let bus = Gio.DBus.get_finish(res); - bus.call('org.gnome.Software', - '/org/gnome/Software', - 'org.gtk.Actions', 'Activate', - GLib.Variant.new('(sava{sv})', - ['details', [args], null]), - null, 0, -1, null, null); - Main.overview.hide(); - }); - }); - } - } - - } else { - super._redisplay(); - } - - // quit menu - this._appendSeparator(); - this._quitfromDashMenuItem = this._appendMenuItem(_("Quit")); - this._quitfromDashMenuItem.connect('activate', () => { - this._source.closeAllWindows(); - }); - - this.update(); - } - - // update menu content when application windows change. This is desirable as actions - // acting on windows (closing) are performed while the menu is shown. - update() { - - if(this._dtdSettings.get_boolean('show-windows-preview')){ - - let windows = this._source.getInterestingWindows(); - - // update, show or hide the quit menu - if ( windows.length > 0) { - let quitFromDashMenuText = ""; - if (windows.length == 1) - this._quitfromDashMenuItem.label.set_text(_("Quit")); - else - this._quitfromDashMenuItem.label.set_text(_("Quit %d Windows").format(windows.length)); - - this._quitfromDashMenuItem.actor.show(); - - } else { - this._quitfromDashMenuItem.actor.hide(); - } - - // update, show, or hide the allWindows menu - // Check if there are new windows not already displayed. In such case, repopulate the allWindows - // menu. Windows removal is already handled by each preview being connected to the destroy signal - let old_windows = this._allWindowsMenuItem.menu._getMenuItems().map(function(item){ - return item._window; - }); - - let new_windows = windows.filter(function(w) {return old_windows.indexOf(w) < 0;}); - if (new_windows.length > 0) { - this._populateAllWindowMenu(windows); - - // Try to set the width to that of the submenu. - // TODO: can't get the actual size, getting a bit less. - // Temporary workaround: add 15px to compensate - this._allWindowsMenuItem.actor.width = this._allWindowsMenuItem.menu.actor.width + 15; - - } - - // The menu is created hidden and never hidded after being shown. Instead, a singlal - // connected to its items destroy will set is insensitive if no more windows preview are shown. - if (windows.length > 0){ - this._allWindowsMenuItem.actor.show(); - this._allWindowsMenuItem.setSensitive(true); - } - - // Update separators - this._getMenuItems().forEach(this._updateSeparatorVisibility.bind(this)); - } - - - } - - _populateAllWindowMenu(windows) { - - this._allWindowsMenuItem.menu.removeAll(); - - if (windows.length > 0) { - - let activeWorkspace = global.workspace_manager.get_active_workspace(); - let separatorShown = windows[0].get_workspace() != activeWorkspace; - - for (let i = 0; i < windows.length; i++) { - let window = windows[i]; - if (!separatorShown && window.get_workspace() != activeWorkspace) { - this._allWindowsMenuItem.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - separatorShown = true; - } - - let item = new WindowPreview.WindowPreviewMenuItem(window); - this._allWindowsMenuItem.menu.addMenuItem(item); - item.connect('activate', () => { - this.emit('activate-window', window); - }); - - // This is to achieve a more gracefull transition when the last windows is closed. - item.connect('destroy', () => { - if(this._allWindowsMenuItem.menu._getMenuItems().length == 1) // It's still counting the item just going to be destroyed - this._allWindowsMenuItem.setSensitive(false); - }); - } - } - } -}; -Signals.addSignalMethods(MyAppIconMenu.prototype); - -// Filter out unnecessary windows, for instance -// nautilus desktop window. -function getInterestingWindows(app, settings, monitorIndex) { - let windows = app.get_windows().filter(function(w) { - return !w.skip_taskbar; - }); - - // When using workspace isolation, we filter out windows - // that are not in the current workspace - if (settings.get_boolean('isolate-workspaces')) - windows = windows.filter(function(w) { - return w.get_workspace().index() == global.workspace_manager.get_active_workspace_index(); - }); - - if (settings.get_boolean('isolate-monitors')) - windows = windows.filter(function(w) { - return w.get_monitor() == monitorIndex; - }); - - return windows; -} - -/** - * A wrapper class around the ShowAppsIcon class. - * - * - Pass settings to the constructor - * - set label position based on dash orientation (Note, I am reusing most machinery of the appIcon class) - * - implement a popupMenu based on the AppIcon code (Note, I am reusing most machinery of the appIcon class) - * - * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. - * thus use this pattern where the real showAppsIcon object is encaptulated, and a reference to it will be properly wired upon - * use of this class in place of the original showAppsButton. - * - */ - -var ShowAppsIconWrapper = class DashToDock_ShowAppsIconWrapper { - constructor(settings) { - this._dtdSettings = settings; - this.realShowAppsIcon = new Dash.ShowAppsIcon(); - - /* the variable equivalent to toggleButton has a different name in the appIcon class - (actor): duplicate reference to easily reuse appIcon methods */ - this.actor = this.realShowAppsIcon.toggleButton; - - // Re-use appIcon methods - this._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; - this._setPopupTimeout = AppDisplay.AppIcon.prototype._setPopupTimeout; - this._onButtonPress = AppDisplay.AppIcon.prototype._onButtonPress; - this._onKeyboardPopupMenu = AppDisplay.AppIcon.prototype._onKeyboardPopupMenu; - this._onLeaveEvent = AppDisplay.AppIcon.prototype._onLeaveEvent; - this._onTouchEvent = AppDisplay.AppIcon.prototype._onTouchEvent; - this._onMenuPoppedDown = AppDisplay.AppIcon.prototype._onMenuPoppedDown; - - // No action on clicked (showing of the appsview is controlled elsewhere) - this._onClicked = (actor, button) => { - this._removeMenuTimeout(); - }; - - this.actor.connect('leave-event', this._onLeaveEvent.bind(this)); - this.actor.connect('button-press-event', this._onButtonPress.bind(this)); - this.actor.connect('touch-event', this._onTouchEvent.bind(this)); - this.actor.connect('clicked', this._onClicked.bind(this)); - this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); - - this._menu = null; - this._menuManager = new PopupMenu.PopupMenuManager(this); - this._menuTimeoutId = 0; - - this.realShowAppsIcon._dtdSettings = settings; - this.realShowAppsIcon.showLabel = itemShowLabel; - } - - popupMenu() { - this._removeMenuTimeout(); - this.actor.fake_release(); - - if (!this._menu) { - this._menu = new MyShowAppsIconMenu(this, this._dtdSettings); - this._menu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - }); - let id = Main.overview.connect('hiding', () => { - this._menu.close(); - }); - this._menu.actor.connect('destroy', function() { - Main.overview.disconnect(id); - }); - this._menuManager.addMenu(this._menu); - } - - //this.emit('menu-state-changed', true); - - this.actor.set_hover(true); - this._menu.popup(); - this._menuManager.ignoreRelease(); - this.emit('sync-tooltip'); - - return false; - } -}; -Signals.addSignalMethods(ShowAppsIconWrapper.prototype); - - -/** - * A menu for the showAppsIcon - */ -var MyShowAppsIconMenu = class DashToDock_MyShowAppsIconMenu extends MyAppIconMenu { - _redisplay() { - this.removeAll(); - - /* Translators: %s is "Settings", which is automatically translated. You - can also translate the full message if this fits better your language. */ - let name = __('Dash to Dock %s').format(_('Settings')) - let item = this._appendMenuItem(name); - - item.connect('activate', function () { - Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); - }); - } -}; - -/** - * This function is used for both extendShowAppsIcon and extendDashItemContainer - */ -function itemShowLabel() { - // Check if the label is still present at all. When switching workpaces, the - // item might have been destroyed in between. - if (!this._labelText || this.label.get_stage() == null) - return; - - this.label.set_text(this._labelText); - this.label.opacity = 0; - this.label.show(); - - let [stageX, stageY] = this.get_transformed_position(); - let node = this.label.get_theme_node(); - - let itemWidth = this.allocation.x2 - this.allocation.x1; - let itemHeight = this.allocation.y2 - this.allocation.y1; - - let labelWidth = this.label.get_width(); - let labelHeight = this.label.get_height(); - - let x, y, xOffset, yOffset; - - let position = Utils.getPosition(this._dtdSettings); - this._isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); - let labelOffset = node.get_length('-x-offset'); - - switch (position) { - case St.Side.LEFT: - yOffset = Math.floor((itemHeight - labelHeight) / 2); - y = stageY + yOffset; - xOffset = labelOffset; - x = stageX + this.get_width() + xOffset; - break; - case St.Side.RIGHT: - yOffset = Math.floor((itemHeight - labelHeight) / 2); - y = stageY + yOffset; - xOffset = labelOffset; - x = Math.round(stageX) - labelWidth - xOffset; - break; - case St.Side.TOP: - y = stageY + labelOffset + itemHeight; - xOffset = Math.floor((itemWidth - labelWidth) / 2); - x = stageX + xOffset; - break; - case St.Side.BOTTOM: - yOffset = labelOffset; - y = stageY - labelHeight - yOffset; - xOffset = Math.floor((itemWidth - labelWidth) / 2); - x = stageX + xOffset; - break; - } - - // keep the label inside the screen border - // Only needed fot the x coordinate. - - // Leave a few pixel gap - let gap = 5; - let monitor = Main.layoutManager.findMonitorForActor(this); - if (x - monitor.x < gap) - x += monitor.x - x + labelOffset; - else if (x + labelWidth > monitor.x + monitor.width - gap) - x -= x + labelWidth - (monitor.x + monitor.width) + gap; - - this.label.set_position(x, y); - Tweener.addTween(this.label, { - opacity: 255, - time: DASH_ITEM_LABEL_SHOW_TIME, - transition: 'easeOutQuad', - }); -} diff --git a/extensions/dash-to-dock/dash.js b/extensions/dash-to-dock/dash.js deleted file mode 100644 index a646256..0000000 --- a/extensions/dash-to-dock/dash.js +++ /dev/null @@ -1,1171 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const Gtk = imports.gi.Gtk; -const Signals = imports.signals; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; -const Mainloop = imports.mainloop; - -const AppDisplay = imports.ui.appDisplay; -const AppFavorites = imports.ui.appFavorites; -const Dash = imports.ui.dash; -const DND = imports.ui.dnd; -const IconGrid = imports.ui.iconGrid; -const Main = imports.ui.main; -const PopupMenu = imports.ui.popupMenu; -const Tweener = imports.ui.tweener; -const Util = imports.misc.util; -const Workspace = imports.ui.workspace; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; -const AppIcons = Me.imports.appIcons; - -let DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME; -let DASH_ITEM_LABEL_HIDE_TIME = Dash.DASH_ITEM_LABEL_HIDE_TIME; -let DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; - -/** - * Extend DashItemContainer - * - * - Pass settings to the constructor - * - set label position based on dash orientation - * - * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. - * thus use this ugly pattern. - */ -function extendDashItemContainer(dashItemContainer, settings) { - dashItemContainer._dtdSettings = settings; - dashItemContainer.showLabel = AppIcons.itemShowLabel; -} - -/** - * This class is a fork of the upstream DashActor class (ui.dash.js) - * - * Summary of changes: - * - passed settings to class as parameter - * - modified chldBox calculations for when 'show-apps-at-top' option is checked - * - handle horizontal dash - */ -var MyDashActor = GObject.registerClass( -class DashToDock_MyDashActor extends St.Widget { - - _init(settings) { - // a prefix is required to avoid conflicting with the parent class variable - this._dtdSettings = settings; - this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL); - - this._position = Utils.getPosition(settings); - this._isHorizontal = ((this._position == St.Side.TOP) || - (this._position == St.Side.BOTTOM)); - - let layout = new Clutter.BoxLayout({ - orientation: this._isHorizontal ? Clutter.Orientation.HORIZONTAL : Clutter.Orientation.VERTICAL - }); - - super._init({ - name: 'dash', - layout_manager: layout, - clip_to_allocation: true - }); - - // Since we are usually visible but not usually changing, make sure - // most repaint requests don't actually require us to repaint anything. - // This saves significant CPU when repainting the screen. - this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); - } - - vfunc_allocate(box, flags) { - this.set_allocation(box, flags); - let contentBox = box; - let availWidth = contentBox.x2 - contentBox.x1; - let availHeight = contentBox.y2 - contentBox.y1; - - let [appIcons, showAppsButton] = this.get_children(); - let [showAppsMinHeight, showAppsNatHeight] = showAppsButton.get_preferred_height(availWidth); - let [showAppsMinWidth, showAppsNatWidth] = showAppsButton.get_preferred_width(availHeight); - - let offset_x = this._isHorizontal?showAppsNatWidth:0; - let offset_y = this._isHorizontal?0:showAppsNatHeight; - - let childBox = new Clutter.ActorBox(); - if ((this._dtdSettings.get_boolean('show-apps-at-top') && !this._isHorizontal) - || (this._dtdSettings.get_boolean('show-apps-at-top') && !this._rtl) - || (!this._dtdSettings.get_boolean('show-apps-at-top') && this._isHorizontal && this._rtl)) { - childBox.x1 = contentBox.x1 + offset_x; - childBox.y1 = contentBox.y1 + offset_y; - childBox.x2 = contentBox.x2; - childBox.y2 = contentBox.y2; - appIcons.allocate(childBox, flags); - - childBox.y1 = contentBox.y1; - childBox.x1 = contentBox.x1; - childBox.x2 = contentBox.x1 + showAppsNatWidth; - childBox.y2 = contentBox.y1 + showAppsNatHeight; - showAppsButton.allocate(childBox, flags); - } - else { - childBox.x1 = contentBox.x1; - childBox.y1 = contentBox.y1; - childBox.x2 = contentBox.x2 - offset_x; - childBox.y2 = contentBox.y2 - offset_y; - appIcons.allocate(childBox, flags); - - childBox.x2 = contentBox.x2; - childBox.y2 = contentBox.y2; - childBox.x1 = contentBox.x2 - showAppsNatWidth; - childBox.y1 = contentBox.y2 - showAppsNatHeight; - showAppsButton.allocate(childBox, flags); - } - } - - vfunc_get_preferred_width(forHeight) { - // We want to request the natural height of all our children - // as our natural height, so we chain up to StWidget (which - // then calls BoxLayout), but we only request the showApps - // button as the minimum size - - let [, natWidth] = this.layout_manager.get_preferred_width(this, forHeight); - - let themeNode = this.get_theme_node(); - let [, showAppsButton] = this.get_children(); - let [minWidth, ] = showAppsButton.get_preferred_height(forHeight); - - return [minWidth, natWidth]; - } - - vfunc_get_preferred_height(forWidth) { - // We want to request the natural height of all our children - // as our natural height, so we chain up to StWidget (which - // then calls BoxLayout), but we only request the showApps - // button as the minimum size - - let [, natHeight] = this.layout_manager.get_preferred_height(this, forWidth); - - let themeNode = this.get_theme_node(); - let [, showAppsButton] = this.get_children(); - let [minHeight, ] = showAppsButton.get_preferred_height(forWidth); - - return [minHeight, natHeight]; - } -}); - -const baseIconSizes = [16, 22, 24, 32, 48, 64, 96, 128]; - -/** - * This class is a fork of the upstream dash class (ui.dash.js) - * - * Summary of changes: - * - disconnect global signals adding a destroy method; - * - play animations even when not in overview mode - * - set a maximum icon size - * - show running and/or favorite applications - * - emit a custom signal when an app icon is added - * - hide showApps label when the custom menu is shown. - * - add scrollview - * ensure actor is visible on keyfocus inseid the scrollview - * - add 128px icon size, might be usefull for hidpi display - * - sync minimization application target position. - * - keep running apps ordered. - */ -var MyDash = class DashToDock_MyDash { - - constructor(settings, remoteModel, monitorIndex) { - this._dtdSettings = settings; - - // Initialize icon variables and size - this._maxHeight = -1; - this.iconSize = this._dtdSettings.get_int('dash-max-icon-size'); - this._availableIconSizes = baseIconSizes; - this._shownInitially = false; - this._initializeIconSize(this.iconSize); - - this._remoteModel = remoteModel; - this._monitorIndex = monitorIndex; - this._position = Utils.getPosition(settings); - this._isHorizontal = ((this._position == St.Side.TOP) || - (this._position == St.Side.BOTTOM)); - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._dragPlaceholder = null; - this._dragPlaceholderPos = -1; - this._animatingPlaceholdersCount = 0; - this._showLabelTimeoutId = 0; - this._resetHoverTimeoutId = 0; - this._ensureAppIconVisibilityTimeoutId = 0; - this._labelShowing = false; - - this._container = new MyDashActor(settings); - this._scrollView = new St.ScrollView({ - name: 'dashtodockDashScrollview', - hscrollbar_policy: Gtk.PolicyType.NEVER, - vscrollbar_policy: Gtk.PolicyType.NEVER, - enable_mouse_scrolling: false - }); - - this._scrollView.connect('scroll-event', this._onScrollEvent.bind(this)); - - this._box = new St.BoxLayout({ - vertical: !this._isHorizontal, - clip_to_allocation: false, - x_align: Clutter.ActorAlign.START, - y_align: Clutter.ActorAlign.START - }); - this._box._delegate = this; - this._container.add_actor(this._scrollView); - this._scrollView.add_actor(this._box); - - // Create a wrapper around the real showAppsIcon in order to add a popupMenu. - let showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this._dtdSettings); - showAppsIconWrapper.connect('menu-state-changed', (showAppsIconWrapper, opened) => { - this._itemMenuStateChanged(showAppsIconWrapper, opened); - }); - // an instance of the showAppsIcon class is encapsulated in the wrapper - this._showAppsIcon = showAppsIconWrapper.realShowAppsIcon; - - this._showAppsIcon.childScale = 1; - this._showAppsIcon.childOpacity = 255; - this._showAppsIcon.icon.setIconSize(this.iconSize); - this._hookUpLabel(this._showAppsIcon); - - this.showAppsButton = this._showAppsIcon.toggleButton; - - this._container.add_actor(this._showAppsIcon); - - let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; - this.actor = new St.Bin({ - child: this._container, - y_align: St.Align.START, - x_align: rtl ? St.Align.END : St.Align.START - }); - - if (this._isHorizontal) { - this.actor.connect('notify::width', () => { - if (this._maxHeight != this.actor.width) - this._queueRedisplay(); - this._maxHeight = this.actor.width; - }); - } - else { - this.actor.connect('notify::height', () => { - if (this._maxHeight != this.actor.height) - this._queueRedisplay(); - this._maxHeight = this.actor.height; - }); - } - - // Update minimization animation target position on allocation of the - // container and on scrollview change. - this._box.connect('notify::allocation', this._updateAppsIconGeometry.bind(this)); - let scrollViewAdjustment = this._isHorizontal ? this._scrollView.hscroll.adjustment : this._scrollView.vscroll.adjustment; - scrollViewAdjustment.connect('notify::value', this._updateAppsIconGeometry.bind(this)); - - this._workId = Main.initializeDeferredWork(this._box, this._redisplay.bind(this)); - - this._settings = new Gio.Settings({ - schema_id: 'org.gnome.shell' - }); - - this._appSystem = Shell.AppSystem.get_default(); - - this._signalsHandler.add([ - this._appSystem, - 'installed-changed', - () => { - AppFavorites.getAppFavorites().reload(); - this._queueRedisplay(); - } - ], [ - AppFavorites.getAppFavorites(), - 'changed', - this._queueRedisplay.bind(this) - ], [ - this._appSystem, - 'app-state-changed', - this._queueRedisplay.bind(this) - ], [ - Main.overview, - 'item-drag-begin', - this._onDragBegin.bind(this) - ], [ - Main.overview, - 'item-drag-end', - this._onDragEnd.bind(this) - ], [ - Main.overview, - 'item-drag-cancelled', - this._onDragCancelled.bind(this) - ]); - } - - destroy() { - this._signalsHandler.destroy(); - } - - _onScrollEvent(actor, event) { - // If scroll is not used because the icon is resized, let the scroll event propagate. - if (!this._dtdSettings.get_boolean('icon-size-fixed')) - return Clutter.EVENT_PROPAGATE; - - // reset timeout to avid conflicts with the mousehover event - if (this._ensureAppIconVisibilityTimeoutId > 0) { - Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); - this._ensureAppIconVisibilityTimeoutId = 0; - } - - // Skip to avoid double events mouse - if (event.is_pointer_emulated()) - return Clutter.EVENT_STOP; - - let adjustment, delta; - - if (this._isHorizontal) - adjustment = this._scrollView.get_hscroll_bar().get_adjustment(); - else - adjustment = this._scrollView.get_vscroll_bar().get_adjustment(); - - let increment = adjustment.step_increment; - - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - delta = -increment; - break; - case Clutter.ScrollDirection.DOWN: - delta = +increment; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - delta = dy * increment; - // Also consider horizontal component, for instance touchpad - if (this._isHorizontal) - delta += dx * increment; - break; - } - - adjustment.set_value(adjustment.get_value() + delta); - - return Clutter.EVENT_STOP; - } - - _onDragBegin() { - this._dragCancelled = false; - this._dragMonitor = { - dragMotion: this._onDragMotion.bind(this) - }; - DND.addDragMonitor(this._dragMonitor); - - if (this._box.get_n_children() == 0) { - this._emptyDropTarget = new Dash.EmptyDropTargetItem(); - this._box.insert_child_at_index(this._emptyDropTarget, 0); - this._emptyDropTarget.show(true); - } - } - - _onDragCancelled() { - this._dragCancelled = true; - this._endDrag(); - } - - _onDragEnd() { - if (this._dragCancelled) - return; - - this._endDrag(); - } - - _endDrag() { - this._clearDragPlaceholder(); - this._clearEmptyDropTarget(); - this._showAppsIcon.setDragApp(null); - DND.removeDragMonitor(this._dragMonitor); - } - - _onDragMotion(dragEvent) { - let app = Dash.getAppFromSource(dragEvent.source); - if (app == null) - return DND.DragMotionResult.CONTINUE; - - let showAppsHovered = this._showAppsIcon.contains(dragEvent.targetActor); - - if (!this._box.contains(dragEvent.targetActor) || showAppsHovered) - this._clearDragPlaceholder(); - - if (showAppsHovered) - this._showAppsIcon.setDragApp(app); - else - this._showAppsIcon.setDragApp(null); - - return DND.DragMotionResult.CONTINUE; - } - - _appIdListToHash(apps) { - let ids = {}; - for (let i = 0; i < apps.length; i++) - ids[apps[i].get_id()] = apps[i]; - return ids; - } - - _queueRedisplay() { - Main.queueDeferredWork(this._workId); - } - - _hookUpLabel(item, appIcon) { - item.child.connect('notify::hover', () => { - this._syncLabel(item, appIcon); - }); - - let id = Main.overview.connect('hiding', () => { - this._labelShowing = false; - item.hideLabel(); - }); - item.child.connect('destroy', function() { - Main.overview.disconnect(id); - }); - - if (appIcon) { - appIcon.connect('sync-tooltip', () => { - this._syncLabel(item, appIcon); - }); - } - } - - _createAppItem(app) { - let appIcon = new AppIcons.MyAppIcon(this._dtdSettings, this._remoteModel, app, this._monitorIndex, - { setSizeManually: true, - showLabel: false }); - - if (appIcon._draggable) { - appIcon._draggable.connect('drag-begin', () => { - appIcon.actor.opacity = 50; - }); - appIcon._draggable.connect('drag-end', () => { - appIcon.actor.opacity = 255; - }); - } - - appIcon.connect('menu-state-changed', (appIcon, opened) => { - this._itemMenuStateChanged(item, opened); - }); - - let item = new Dash.DashItemContainer(); - - extendDashItemContainer(item, this._dtdSettings); - item.setChild(appIcon.actor); - - appIcon.actor.connect('notify::hover', () => { - if (appIcon.actor.hover) { - this._ensureAppIconVisibilityTimeoutId = Mainloop.timeout_add(100, () => { - ensureActorVisibleInScrollView(this._scrollView, appIcon.actor); - this._ensureAppIconVisibilityTimeoutId = 0; - return GLib.SOURCE_REMOVE; - }); - } - else { - if (this._ensureAppIconVisibilityTimeoutId > 0) { - Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); - this._ensureAppIconVisibilityTimeoutId = 0; - } - } - }); - - appIcon.actor.connect('clicked', (actor) => { - ensureActorVisibleInScrollView(this._scrollView, actor); - }); - - appIcon.actor.connect('key-focus-in', (actor) => { - let [x_shift, y_shift] = ensureActorVisibleInScrollView(this._scrollView, actor); - - // This signal is triggered also by mouse click. The popup menu is opened at the original - // coordinates. Thus correct for the shift which is going to be applied to the scrollview. - if (appIcon._menu) { - appIcon._menu._boxPointer.xOffset = -x_shift; - appIcon._menu._boxPointer.yOffset = -y_shift; - } - }); - - // Override default AppIcon label_actor, now the - // accessible_name is set at DashItemContainer.setLabelText - appIcon.actor.label_actor = null; - item.setLabelText(app.get_name()); - - appIcon.icon.setIconSize(this.iconSize); - this._hookUpLabel(item, appIcon); - - return item; - } - - /** - * Return an array with the "proper" appIcons currently in the dash - */ - getAppIcons() { - // Only consider children which are "proper" - // icons (i.e. ignoring drag placeholders) and which are not - // animating out (which means they will be destroyed at the end of - // the animation) - let iconChildren = this._box.get_children().filter(function(actor) { - return actor.child && - actor.child._delegate && - actor.child._delegate.icon && - !actor.animatingOut; - }); - - let appIcons = iconChildren.map(function(actor) { - return actor.child._delegate; - }); - - return appIcons; - } - - _updateAppsIconGeometry() { - let appIcons = this.getAppIcons(); - appIcons.forEach(function(icon) { - icon.updateIconGeometry(); - }); - } - - _itemMenuStateChanged(item, opened) { - // When the menu closes, it calls sync_hover, which means - // that the notify::hover handler does everything we need to. - if (opened) { - if (this._showLabelTimeoutId > 0) { - Mainloop.source_remove(this._showLabelTimeoutId); - this._showLabelTimeoutId = 0; - } - - item.hideLabel(); - } - else { - // I want to listen from outside when a menu is closed. I used to - // add a custom signal to the appIcon, since gnome 3.8 the signal - // calling this callback was added upstream. - this.emit('menu-closed'); - } - } - - _syncLabel(item, appIcon) { - let shouldShow = appIcon ? appIcon.shouldShowTooltip() : item.child.get_hover(); - - if (shouldShow) { - if (this._showLabelTimeoutId == 0) { - let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; - this._showLabelTimeoutId = Mainloop.timeout_add(timeout, () => { - this._labelShowing = true; - item.showLabel(); - this._showLabelTimeoutId = 0; - return GLib.SOURCE_REMOVE; - }); - GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel'); - if (this._resetHoverTimeoutId > 0) { - Mainloop.source_remove(this._resetHoverTimeoutId); - this._resetHoverTimeoutId = 0; - } - } - } - else { - if (this._showLabelTimeoutId > 0) - Mainloop.source_remove(this._showLabelTimeoutId); - this._showLabelTimeoutId = 0; - item.hideLabel(); - if (this._labelShowing) { - this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT, () => { - this._labelShowing = false; - this._resetHoverTimeoutId = 0; - return GLib.SOURCE_REMOVE; - }); - GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing'); - } - } - } - - _adjustIconSize() { - // For the icon size, we only consider children which are "proper" - // icons (i.e. ignoring drag placeholders) and which are not - // animating out (which means they will be destroyed at the end of - // the animation) - let iconChildren = this._box.get_children().filter(function(actor) { - return actor.child && - actor.child._delegate && - actor.child._delegate.icon && - !actor.animatingOut; - }); - - iconChildren.push(this._showAppsIcon); - - if (this._maxHeight == -1) - return; - - // Check if the container is present in the stage. This avoids critical - // errors when unlocking the screen - if (!this._container.get_stage()) - return; - - let themeNode = this._container.get_theme_node(); - let maxAllocation = new Clutter.ActorBox({ - x1: 0, - y1: 0, - x2: this._isHorizontal ? this._maxHeight : 42 /* whatever */, - y2: this._isHorizontal ? 42 : this._maxHeight - }); - let maxContent = themeNode.get_content_box(maxAllocation); - let availHeight; - if (this._isHorizontal) - availHeight = maxContent.x2 - maxContent.x1; - else - availHeight = maxContent.y2 - maxContent.y1; - let spacing = themeNode.get_length('spacing'); - - let firstButton = iconChildren[0].child; - let firstIcon = firstButton._delegate.icon; - - let minHeight, natHeight, minWidth, natWidth; - - // Enforce the current icon size during the size request - firstIcon.setIconSize(this.iconSize); - [minHeight, natHeight] = firstButton.get_preferred_height(-1); - [minWidth, natWidth] = firstButton.get_preferred_width(-1); - - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let iconSizes = this._availableIconSizes.map(function(s) { - return s * scaleFactor; - }); - - // Subtract icon padding and box spacing from the available height - if (this._isHorizontal) - availHeight -= iconChildren.length * (natWidth - this.iconSize * scaleFactor) + - (iconChildren.length - 1) * spacing; - else - availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) + - (iconChildren.length - 1) * spacing; - - let availSize = availHeight / iconChildren.length; - - - let newIconSize = this._availableIconSizes[0]; - for (let i = 0; i < iconSizes.length; i++) { - if (iconSizes[i] < availSize) - newIconSize = this._availableIconSizes[i]; - } - - if (newIconSize == this.iconSize) - return; - - let oldIconSize = this.iconSize; - this.iconSize = newIconSize; - this.emit('icon-size-changed'); - - let scale = oldIconSize / newIconSize; - for (let i = 0; i < iconChildren.length; i++) { - let icon = iconChildren[i].child._delegate.icon; - - // Set the new size immediately, to keep the icons' sizes - // in sync with this.iconSize - icon.setIconSize(this.iconSize); - - // Don't animate the icon size change when the overview - // is transitioning, or when initially filling - // the dash - if (Main.overview.animationInProgress || - !this._shownInitially) - continue; - - let [targetWidth, targetHeight] = icon.icon.get_size(); - - // Scale the icon's texture to the previous size and - // tween to the new size - icon.icon.set_size(icon.icon.width * scale, - icon.icon.height * scale); - - Tweener.addTween(icon.icon, - { width: targetWidth, - height: targetHeight, - time: DASH_ANIMATION_TIME, - transition: 'easeOutQuad', - }); - } - } - - _redisplay() { - let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); - - let running = this._appSystem.get_running(); - if (this._dtdSettings.get_boolean('isolate-workspaces') || - this._dtdSettings.get_boolean('isolate-monitors')) { - // When using isolation, we filter out apps that have no windows in - // the current workspace - let settings = this._dtdSettings; - let monitorIndex = this._monitorIndex; - running = running.filter(function(_app) { - return AppIcons.getInterestingWindows(_app, settings, monitorIndex).length != 0; - }); - } - - let children = this._box.get_children().filter(function(actor) { - return actor.child && - actor.child._delegate && - actor.child._delegate.app; - }); - // Apps currently in the dash - let oldApps = children.map(function(actor) { - return actor.child._delegate.app; - }); - // Apps supposed to be in the dash - let newApps = []; - - if (this._dtdSettings.get_boolean('show-favorites')) { - for (let id in favorites) - newApps.push(favorites[id]); - } - - // We reorder the running apps so that they don't change position on the - // dash with every redisplay() call - if (this._dtdSettings.get_boolean('show-running')) { - // First: add the apps from the oldApps list that are still running - for (let i = 0; i < oldApps.length; i++) { - let index = running.indexOf(oldApps[i]); - if (index > -1) { - let app = running.splice(index, 1)[0]; - if (this._dtdSettings.get_boolean('show-favorites') && (app.get_id() in favorites)) - continue; - newApps.push(app); - } - } - // Second: add the new apps - for (let i = 0; i < running.length; i++) { - let app = running[i]; - if (this._dtdSettings.get_boolean('show-favorites') && (app.get_id() in favorites)) - continue; - newApps.push(app); - } - } - - // Figure out the actual changes to the list of items; we iterate - // over both the list of items currently in the dash and the list - // of items expected there, and collect additions and removals. - // Moves are both an addition and a removal, where the order of - // the operations depends on whether we encounter the position - // where the item has been added first or the one from where it - // was removed. - // There is an assumption that only one item is moved at a given - // time; when moving several items at once, everything will still - // end up at the right position, but there might be additional - // additions/removals (e.g. it might remove all the launchers - // and add them back in the new order even if a smaller set of - // additions and removals is possible). - // If above assumptions turns out to be a problem, we might need - // to use a more sophisticated algorithm, e.g. Longest Common - // Subsequence as used by diff. - - let addedItems = []; - let removedActors = []; - - let newIndex = 0; - let oldIndex = 0; - while ((newIndex < newApps.length) || (oldIndex < oldApps.length)) { - // No change at oldIndex/newIndex - if (oldApps[oldIndex] && oldApps[oldIndex] == newApps[newIndex]) { - oldIndex++; - newIndex++; - continue; - } - - // App removed at oldIndex - if (oldApps[oldIndex] && (newApps.indexOf(oldApps[oldIndex]) == -1)) { - removedActors.push(children[oldIndex]); - oldIndex++; - continue; - } - - // App added at newIndex - if (newApps[newIndex] && (oldApps.indexOf(newApps[newIndex]) == -1)) { - let newItem = this._createAppItem(newApps[newIndex]); - addedItems.push({ app: newApps[newIndex], - item: newItem, - pos: newIndex }); - newIndex++; - continue; - } - - // App moved - let insertHere = newApps[newIndex + 1] && (newApps[newIndex + 1] == oldApps[oldIndex]); - let alreadyRemoved = removedActors.reduce(function(result, actor) { - let removedApp = actor.child._delegate.app; - return result || removedApp == newApps[newIndex]; - }, false); - - if (insertHere || alreadyRemoved) { - let newItem = this._createAppItem(newApps[newIndex]); - addedItems.push({ - app: newApps[newIndex], - item: newItem, - pos: newIndex + removedActors.length - }); - newIndex++; - } - else { - removedActors.push(children[oldIndex]); - oldIndex++; - } - } - - for (let i = 0; i < addedItems.length; i++) - this._box.insert_child_at_index(addedItems[i].item, - addedItems[i].pos); - - for (let i = 0; i < removedActors.length; i++) { - let item = removedActors[i]; - - // Don't animate item removal when the overview is transitioning - if (!Main.overview.animationInProgress) - item.animateOutAndDestroy(); - else - item.destroy(); - } - - this._adjustIconSize(); - - for (let i = 0; i < addedItems.length; i++) - // Emit a custom signal notifying that a new item has been added - this.emit('item-added', addedItems[i]); - - // Skip animations on first run when adding the initial set - // of items, to avoid all items zooming in at once - - let animate = this._shownInitially && - !Main.overview.animationInProgress; - - if (!this._shownInitially) - this._shownInitially = true; - - for (let i = 0; i < addedItems.length; i++) - addedItems[i].item.show(animate); - - // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 - // Without it, StBoxLayout may use a stale size cache - this._box.queue_relayout(); - - // This is required for icon reordering when the scrollview is used. - this._updateAppsIconGeometry(); - - // This will update the size, and the corresponding number for each icon - this._updateNumberOverlay(); - } - - _updateNumberOverlay() { - let appIcons = this.getAppIcons(); - let counter = 1; - appIcons.forEach(function(icon) { - if (counter < 10){ - icon.setNumberOverlay(counter); - counter++; - } - else if (counter == 10) { - icon.setNumberOverlay(0); - counter++; - } - else { - // No overlay after 10 - icon.setNumberOverlay(-1); - } - icon.updateNumberOverlay(); - }); - - } - - toggleNumberOverlay(activate) { - let appIcons = this.getAppIcons(); - appIcons.forEach(function(icon) { - icon.toggleNumberOverlay(activate); - }); - } - - _initializeIconSize(max_size) { - let max_allowed = baseIconSizes[baseIconSizes.length-1]; - max_size = Math.min(max_size, max_allowed); - - if (this._dtdSettings.get_boolean('icon-size-fixed')) - this._availableIconSizes = [max_size]; - else { - this._availableIconSizes = baseIconSizes.filter(function(val) { - return (val { - this._animatingPlaceholdersCount--; - }); - this._dragPlaceholder = null; - } - this._dragPlaceholderPos = -1; - } - - _clearEmptyDropTarget() { - if (this._emptyDropTarget) { - this._emptyDropTarget.animateOutAndDestroy(); - this._emptyDropTarget = null; - } - } - - handleDragOver(source, actor, x, y, time) { - let app = Dash.getAppFromSource(source); - - // Don't allow favoriting of transient apps - if (app == null || app.is_window_backed()) - return DND.DragMotionResult.NO_DROP; - - if (!this._settings.is_writable('favorite-apps') || !this._dtdSettings.get_boolean('show-favorites')) - return DND.DragMotionResult.NO_DROP; - - let favorites = AppFavorites.getAppFavorites().getFavorites(); - let numFavorites = favorites.length; - - let favPos = favorites.indexOf(app); - - let children = this._box.get_children(); - let numChildren = children.length; - let boxHeight = 0; - for (let i = 0; i < numChildren; i++) - boxHeight += this._isHorizontal?children[i].width:children[i].height; - - // Keep the placeholder out of the index calculation; assuming that - // the remove target has the same size as "normal" items, we don't - // need to do the same adjustment there. - if (this._dragPlaceholder) { - boxHeight -= this._isHorizontal?this._dragPlaceholder.width:this._dragPlaceholder.height; - numChildren--; - } - - let pos; - if (!this._emptyDropTarget) { - pos = Math.floor((this._isHorizontal?x:y) * numChildren / boxHeight); - if (pos > numChildren) - pos = numChildren; - } - else - pos = 0; // always insert at the top when dash is empty - - // Take into account childredn position in rtl - if (this._isHorizontal && (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)) - pos = numChildren - pos; - - if ((pos != this._dragPlaceholderPos) && (pos <= numFavorites) && (this._animatingPlaceholdersCount == 0)) { - this._dragPlaceholderPos = pos; - - // Don't allow positioning before or after self - if ((favPos != -1) && (pos == favPos || pos == favPos + 1)) { - this._clearDragPlaceholder(); - return DND.DragMotionResult.CONTINUE; - } - - // If the placeholder already exists, we just move - // it, but if we are adding it, expand its size in - // an animation - let fadeIn; - if (this._dragPlaceholder) { - this._dragPlaceholder.destroy(); - fadeIn = false; - } - else - fadeIn = true; - - this._dragPlaceholder = new Dash.DragPlaceholderItem(); - this._dragPlaceholder.child.set_width (this.iconSize); - this._dragPlaceholder.child.set_height (this.iconSize / 2); - this._box.insert_child_at_index(this._dragPlaceholder, - this._dragPlaceholderPos); - this._dragPlaceholder.show(fadeIn); - // Ensure the next and previous icon are visible when moving the placeholder - // (I assume there's room for both of them) - if (this._dragPlaceholderPos > 1) - ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[this._dragPlaceholderPos-1]); - if (this._dragPlaceholderPos < this._box.get_children().length-1) - ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[this._dragPlaceholderPos+1]); - } - - // Remove the drag placeholder if we are not in the - // "favorites zone" - if (pos > numFavorites) - this._clearDragPlaceholder(); - - if (!this._dragPlaceholder) - return DND.DragMotionResult.NO_DROP; - - let srcIsFavorite = (favPos != -1); - - if (srcIsFavorite) - return DND.DragMotionResult.MOVE_DROP; - - return DND.DragMotionResult.COPY_DROP; - } - - /** - * Draggable target interface - */ - acceptDrop(source, actor, x, y, time) { - let app = Dash.getAppFromSource(source); - - // Don't allow favoriting of transient apps - if (app == null || app.is_window_backed()) - return false; - - if (!this._settings.is_writable('favorite-apps') || !this._dtdSettings.get_boolean('show-favorites')) - return false; - - let id = app.get_id(); - - let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); - - let srcIsFavorite = (id in favorites); - - let favPos = 0; - let children = this._box.get_children(); - for (let i = 0; i < this._dragPlaceholderPos; i++) { - if (this._dragPlaceholder && (children[i] == this._dragPlaceholder)) - continue; - - let childId = children[i].child._delegate.app.get_id(); - if (childId == id) - continue; - if (childId in favorites) - favPos++; - } - - // No drag placeholder means we don't wan't to favorite the app - // and we are dragging it to its original position - if (!this._dragPlaceholder) - return true; - - Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { - let appFavorites = AppFavorites.getAppFavorites(); - if (srcIsFavorite) - appFavorites.moveFavoriteToPos(id, favPos); - else - appFavorites.addFavoriteAtPos(id, favPos); - return false; - }); - - return true; - } - - showShowAppsButton() { - this.showAppsButton.visible = true - this.showAppsButton.set_width(-1) - this.showAppsButton.set_height(-1) - } - - hideShowAppsButton() { - this.showAppsButton.hide() - this.showAppsButton.set_width(0) - this.showAppsButton.set_height(0) - } -}; - -Signals.addSignalMethods(MyDash.prototype); - -/** - * This is a copy of the same function in utils.js, but also adjust horizontal scrolling - * and perform few further cheks on the current value to avoid changing the values when - * it would be clamp to the current one in any case. - * Return the amount of shift applied - */ -function ensureActorVisibleInScrollView(scrollView, actor) { - let adjust_v = true; - let adjust_h = true; - - let vadjustment = scrollView.vscroll.adjustment; - let hadjustment = scrollView.hscroll.adjustment; - let [vvalue, vlower, vupper, vstepIncrement, vpageIncrement, vpageSize] = vadjustment.get_values(); - let [hvalue, hlower, hupper, hstepIncrement, hpageIncrement, hpageSize] = hadjustment.get_values(); - - let [hvalue0, vvalue0] = [hvalue, vvalue]; - - let voffset = 0; - let hoffset = 0; - let fade = scrollView.get_effect('fade'); - if (fade) { - voffset = fade.vfade_offset; - hoffset = fade.hfade_offset; - } - - let box = actor.get_allocation_box(); - let y1 = box.y1, y2 = box.y2, x1 = box.x1, x2 = box.x2; - - let parent = actor.get_parent(); - while (parent != scrollView) { - if (!parent) - throw new Error('Actor not in scroll view'); - - let box = parent.get_allocation_box(); - y1 += box.y1; - y2 += box.y1; - x1 += box.x1; - x2 += box.x1; - parent = parent.get_parent(); - } - - if (y1 < vvalue + voffset) - vvalue = Math.max(0, y1 - voffset); - else if (vvalue < vupper - vpageSize && y2 > vvalue + vpageSize - voffset) - vvalue = Math.min(vupper -vpageSize, y2 + voffset - vpageSize); - - if (x1 < hvalue + hoffset) - hvalue = Math.max(0, x1 - hoffset); - else if (hvalue < hupper - hpageSize && x2 > hvalue + hpageSize - hoffset) - hvalue = Math.min(hupper - hpageSize, x2 + hoffset - hpageSize); - - if (vvalue !== vvalue0) { - Tweener.addTween(vadjustment, { value: vvalue, - time: Util.SCROLL_TIME, - transition: 'easeOutQuad' - }); - } - - if (hvalue !== hvalue0) { - Tweener.addTween(hadjustment, - { value: hvalue, - time: Util.SCROLL_TIME, - transition: 'easeOutQuad' }); - } - - return [hvalue- hvalue0, vvalue - vvalue0]; -} diff --git a/extensions/dash-to-dock/docking.js b/extensions/dash-to-dock/docking.js deleted file mode 100644 index d35094b..0000000 --- a/extensions/dash-to-dock/docking.js +++ /dev/null @@ -1,1853 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const Gtk = imports.gi.Gtk; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; -const Mainloop = imports.mainloop; -const Params = imports.misc.params; - -const Main = imports.ui.main; -const Dash = imports.ui.dash; -const IconGrid = imports.ui.iconGrid; -const Overview = imports.ui.overview; -const OverviewControls = imports.ui.overviewControls; -const PointerWatcher = imports.ui.pointerWatcher; -const Tweener = imports.ui.tweener; -const Signals = imports.signals; -const ViewSelector = imports.ui.viewSelector; -const WorkspaceSwitcherPopup= imports.ui.workspaceSwitcherPopup; -const Layout = imports.ui.layout; -const LayoutManager = imports.ui.main.layoutManager; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; -const Intellihide = Me.imports.intellihide; -const Theming = Me.imports.theming; -const MyDash = Me.imports.dash; -const LauncherAPI = Me.imports.launcherAPI; - -const DOCK_DWELL_CHECK_INTERVAL = 100; - -var State = { - HIDDEN: 0, - SHOWING: 1, - SHOWN: 2, - HIDING: 3 -}; - -const scrollAction = { - DO_NOTHING: 0, - CYCLE_WINDOWS: 1, - SWITCH_WORKSPACE: 2 -}; - -/** - * A simple St.Widget with one child whose allocation takes into account the - * slide out of its child via the _slidex parameter ([0:1]). - * - * Required since I want to track the input region of this container which is - * based on its allocation even if the child overlows the parent actor. By doing - * this the region of the dash that is slideout is not steling anymore the input - * regions making the extesion usable when the primary monitor is the right one. - * - * The slidex parameter can be used to directly animate the sliding. The parent - * must have a WEST (SOUTH) anchor_point to achieve the sliding to the RIGHT (BOTTOM) - * side. -*/ -var DashSlideContainer = GObject.registerClass( -class DashToDock_DashSlideContainer extends St.Widget { - - _init(params) { - // Default local params - let localDefaults = { - side: St.Side.LEFT, - initialSlideValue: 1 - } - - let localParams = Params.parse(params, localDefaults, true); - - if (params) { - // Remove local params before passing the params to the parent - // constructor to avoid errors. - let prop; - for (prop in localDefaults) { - if ((prop in params)) - delete params[prop]; - } - } - - super._init(params); - this._child = null; - - // slide parameter: 1 = visible, 0 = hidden. - this._slidex = localParams.initialSlideValue; - this._side = localParams.side; - this._slideoutSize = 0; // minimum size when slided out - } - - vfunc_allocate(box, flags) { - this.set_allocation(box, flags); - - if (this._child == null) - return; - - let availWidth = box.x2 - box.x1; - let availHeight = box.y2 - box.y1; - let [, , natChildWidth, natChildHeight] = - this._child.get_preferred_size(); - - let childWidth = natChildWidth; - let childHeight = natChildHeight; - - let childBox = new Clutter.ActorBox(); - - let slideoutSize = this._slideoutSize; - - if (this._side == St.Side.LEFT) { - childBox.x1 = (this._slidex -1) * (childWidth - slideoutSize); - childBox.x2 = slideoutSize + this._slidex*(childWidth - slideoutSize); - childBox.y1 = 0; - childBox.y2 = childBox.y1 + childHeight; - } - else if ((this._side == St.Side.RIGHT) || (this._side == St.Side.BOTTOM)) { - childBox.x1 = 0; - childBox.x2 = childWidth; - childBox.y1 = 0; - childBox.y2 = childBox.y1 + childHeight; - } - else if (this._side == St.Side.TOP) { - childBox.x1 = 0; - childBox.x2 = childWidth; - childBox.y1 = (this._slidex -1) * (childHeight - slideoutSize); - childBox.y2 = slideoutSize + this._slidex * (childHeight - slideoutSize); - } - - this._child.allocate(childBox, flags); - this._child.set_clip(-childBox.x1, -childBox.y1, - -childBox.x1+availWidth, -childBox.y1 + availHeight); - } - - /** - * Just the child width but taking into account the slided out part - */ - vfunc_get_preferred_width(forHeight) { - let [minWidth, natWidth] = this._child.get_preferred_width(forHeight); - if ((this._side == St.Side.LEFT) || (this._side == St.Side.RIGHT)) { - minWidth = (minWidth - this._slideoutSize) * this._slidex + this._slideoutSize; - natWidth = (natWidth - this._slideoutSize) * this._slidex + this._slideoutSize; - } - return [minWidth, natWidth]; - } - - /** - * Just the child height but taking into account the slided out part - */ - vfunc_get_preferred_height(forWidth) { - let [minHeight, natHeight] = this._child.get_preferred_height(forWidth); - if ((this._side == St.Side.TOP) || (this._side == St.Side.BOTTOM)) { - minHeight = (minHeight - this._slideoutSize) * this._slidex + this._slideoutSize; - natHeight = (natHeight - this._slideoutSize) * this._slidex + this._slideoutSize; - } - return [minHeight, natHeight]; - } - - /** - * I was expecting it to be a virtual function... stil I don't understand - * how things work. - */ - add_child(actor) { - // I'm supposed to have only on child - if (this._child !== null) - this.remove_child(actor); - - this._child = actor; - super.add_child(actor); - } - - set slidex(value) { - this._slidex = value; - this._child.queue_relayout(); - } - - get slidex() { - return this._slidex; - } -}); - -var DockedDash = class DashToDock { - - constructor(settings, remoteModel, monitorIndex) { - this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL); - - // Load settings - this._settings = settings; - this._remoteModel = remoteModel; - this._monitorIndex = monitorIndex; - // Connect global signals - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._bindSettingsChanges(); - - this._position = Utils.getPosition(settings); - this._isHorizontal = ((this._position == St.Side.TOP) || (this._position == St.Side.BOTTOM)); - - // Temporary ignore hover events linked to autohide for whatever reason - this._ignoreHover = false; - this._oldignoreHover = null; - // This variables are linked to the settings regardles of autohide or intellihide - // being temporary disable. Get set by _updateVisibilityMode; - this._autohideIsEnabled = null; - this._intellihideIsEnabled = null; - this._fixedIsEnabled = null; - - // Create intellihide object to monitor windows overlapping - this._intellihide = new Intellihide.Intellihide(this._settings, this._monitorIndex); - - // initialize dock state - this._dockState = State.HIDDEN; - - // Put dock on the required monitor - this._monitor = Main.layoutManager.monitors[this._monitorIndex]; - - // this store size and the position where the dash is shown; - // used by intellihide module to check window overlap. - this.staticBox = new Clutter.ActorBox(); - - // Initialize pressure barrier variables - this._canUsePressure = false; - this._pressureBarrier = null; - this._barrier = null; - this._removeBarrierTimeoutId = 0; - - // Initialize dwelling system variables - this._dockDwelling = false; - this._dockWatch = null; - this._dockDwellUserTime = 0; - this._dockDwellTimeoutId = 0 - - // Create a new dash object - this.dash = new MyDash.MyDash(this._settings, this._remoteModel, this._monitorIndex); - - if (!this._settings.get_boolean('show-show-apps-button')) - this.dash.hideShowAppsButton(); - - // Create the main actor and the containers for sliding in and out and - // centering, turn on track hover - - let positionStyleClass = ['top', 'right', 'bottom', 'left']; - // This is the centering actor - this.actor = new St.Bin({ - name: 'dashtodockContainer', - reactive: false, - style_class: positionStyleClass[this._position], - x_align: this._isHorizontal?St.Align.MIDDLE:St.Align.START, - y_align: this._isHorizontal?St.Align.START:St.Align.MIDDLE - }); - this.actor._delegate = this; - - // This is the sliding actor whose allocation is to be tracked for input regions - this._slider = new DashSlideContainer({ - side: this._position, - initialSlideValue: 0 - }); - - // This is the actor whose hover status us tracked for autohide - this._box = new St.BoxLayout({ - name: 'dashtodockBox', - reactive: true, - track_hover: true - }); - this._box.connect('notify::hover', this._hoverChanged.bind(this)); - - // Create and apply height constraint to the dash. It's controlled by this.actor height - this.constrainSize = new Clutter.BindConstraint({ - source: this.actor, - coordinate: this._isHorizontal?Clutter.BindCoordinate.WIDTH:Clutter.BindCoordinate.HEIGHT - }); - this.dash.actor.add_constraint(this.constrainSize); - - this._signalsHandler.add([ - Main.overview, - 'item-drag-begin', - this._onDragStart.bind(this) - ], [ - Main.overview, - 'item-drag-end', - this._onDragEnd.bind(this) - ], [ - Main.overview, - 'item-drag-cancelled', - this._onDragEnd.bind(this) - ], [ - // update when workarea changes, for instance if other extensions modify the struts - //(like moving th panel at the bottom) - global.display, - 'workareas-changed', - this._resetPosition.bind(this) - ], [ - Main.overview, - 'showing', - this._onOverviewShowing.bind(this) - ], [ - Main.overview, - 'hiding', - this._onOverviewHiding.bind(this) - ], [ - // Hide on appview - Main.overview.viewSelector, - 'page-changed', - this._pageChanged.bind(this) - ], [ - Main.overview.viewSelector, - 'page-empty', - this._onPageEmpty.bind(this) - ], [ - // Ensure the ShowAppsButton status is kept in sync - Main.overview.viewSelector._showAppsButton, - 'notify::checked', - this._syncShowAppsButtonToggled.bind(this) - ], [ - global.display, - 'in-fullscreen-changed', - this._updateBarrier.bind(this) - ], [ - // Monitor windows overlapping - this._intellihide, - 'status-changed', - this._updateDashVisibility.bind(this) - ], [ - // Keep dragged icon consistent in size with this dash - this.dash, - 'icon-size-changed', - () => { Main.overview.dashIconSize = this.dash.iconSize; } - ], [ - // This duplicate the similar signal which is in owerview.js. - // Being connected and thus executed later this effectively - // overwrite any attempt to use the size of the default dash - //which given the customization is usually much smaller. - // I can't easily disconnect the original signal - Main.overview._controls.dash, - 'icon-size-changed', - () => { Main.overview.dashIconSize = this.dash.iconSize; } - ], [ - // sync hover after a popupmenu is closed - this.dash, - 'menu-closed', - () => { this._box.sync_hover() } - ]); - - this._injectionsHandler = new Utils.InjectionsHandler(); - this._themeManager = new Theming.ThemeManager(this._settings, this); - - // Since the actor is not a topLevel child and its parent is now not added to the Chrome, - // the allocation change of the parent container (slide in and slideout) doesn't trigger - // anymore an update of the input regions. Force the update manually. - this.actor.connect('notify::allocation', - Main.layoutManager._queueUpdateRegions.bind(Main.layoutManager)); - - this.dash._container.connect('allocation-changed', this._updateStaticBox.bind(this)); - this._slider.connect(this._isHorizontal ? 'notify::x' : 'notify::y', this._updateStaticBox.bind(this)); - - // Load optional features that need to be activated for one dock only - if (this._monitorIndex == this._settings.get_int('preferred-monitor')) - this._enableExtraFeatures(); - // Load optional features that need to be activated once per dock - this._optionalScrollWorkspaceSwitch(); - - // Delay operations that require the shell to be fully loaded and with - // user theme applied. - - this._paintId = this.actor.connect('paint', this._initialize.bind(this)); - - // Manage the which is used to reserve space in the overview for the dock - // Add and additional dashSpacer positioned according to the dash positioning. - // It gets restored on extension unload. - this._dashSpacer = new OverviewControls.DashSpacer(); - this._dashSpacer.setDashActor(this._box); - - if (this._position == St.Side.LEFT) - Main.overview._controls._group.insert_child_at_index(this._dashSpacer, this._rtl ? -1 : 0); // insert on first - else if (this._position == St.Side.RIGHT) - Main.overview._controls._group.insert_child_at_index(this._dashSpacer, this._rtl ? 0 : -1); // insert on last - else if (this._position == St.Side.TOP) - Main.overview._overview.insert_child_at_index(this._dashSpacer, 0); - else if (this._position == St.Side.BOTTOM) - Main.overview._overview.insert_child_at_index(this._dashSpacer, -1); - - // Add dash container actor and the container to the Chrome. - this.actor.set_child(this._slider); - this._slider.add_child(this._box); - this._box.add_actor(this.dash.actor); - - // Add aligning container without tracking it for input region - Main.uiGroup.add_child(this.actor); - - if (this._settings.get_boolean('dock-fixed')) { - // Note: tracking the fullscreen directly on the slider actor causes some hiccups when fullscreening - // windows of certain applications - Main.layoutManager._trackActor(this.actor, {affectsInputRegion: false, trackFullscreen: true}); - Main.layoutManager._trackActor(this._slider, {affectsStruts: true}); - } - else - Main.layoutManager._trackActor(this._slider); - - // Set initial position - this._resetDepth(); - this._resetPosition(); - } - - _initialize() { - if (this._paintId > 0) { - this.actor.disconnect(this._paintId); - this._paintId=0; - } - - // Apply custome css class according to the settings - this._themeManager.updateCustomTheme(); - - // Since Gnome 3.8 dragging an app without having opened the overview before cause the attemp to - //animate a null target since some variables are not initialized when the viewSelector is created - if (Main.overview.viewSelector._activePage == null) - Main.overview.viewSelector._activePage = Main.overview.viewSelector._workspacesPage; - - this._updateVisibilityMode(); - - // In case we are already inside the overview when the extension is loaded, - // for instance on unlocking the screen if it was locked with the overview open. - if (Main.overview.visibleTarget) { - this._onOverviewShowing(); - this._pageChanged(); - } - - // Setup pressure barrier (GS38+ only) - this._updatePressureBarrier(); - this._updateBarrier(); - - // setup dwelling system if pressure barriers are not available - this._setupDockDwellIfNeeded(); - } - - destroy() { - // Disconnect global signals - this._signalsHandler.destroy(); - // The dash, intellihide and themeManager have global signals as well internally - this.dash.destroy(); - this._intellihide.destroy(); - this._themeManager.destroy(); - - this._injectionsHandler.destroy(); - - // Destroy main clutter actor: this should be sufficient removing it and - // destroying all its children - this.actor.destroy(); - - // Remove barrier timeout - if (this._removeBarrierTimeoutId > 0) - Mainloop.source_remove(this._removeBarrierTimeoutId); - - // Remove existing barrier - this._removeBarrier(); - - // Remove pointer watcher - if (this._dockWatch) { - PointerWatcher.getPointerWatcher()._removeWatch(this._dockWatch); - this._dockWatch = null; - } - - // Remove the dashSpacer - this._dashSpacer.destroy(); - - } - - _bindSettingsChanges() { - this._signalsHandler.add([ - this._settings, - 'changed::scroll-action', - () => { this._optionalScrollWorkspaceSwitch(); } - ], [ - this._settings, - 'changed::dash-max-icon-size', - () => { this.dash.setIconSize(this._settings.get_int('dash-max-icon-size')); } - ], [ - this._settings, - 'changed::icon-size-fixed', - () => { this.dash.setIconSize(this._settings.get_int('dash-max-icon-size')); } - ], [ - this._settings, - 'changed::show-favorites', - () => { this.dash.resetAppIcons(); } - ], [ - this._settings, - 'changed::show-running', - () => { this.dash.resetAppIcons(); } - ], [ - this._settings, - 'changed::show-apps-at-top', - () => { this.dash.resetAppIcons(); } - ], [ - this._settings, - 'changed::show-show-apps-button', - () => { - if (this._settings.get_boolean('show-show-apps-button')) - this.dash.showShowAppsButton(); - else - this.dash.hideShowAppsButton(); - } - ], [ - this._settings, - 'changed::dock-fixed', - () => { - if (this._settings.get_boolean('dock-fixed')) { - Main.layoutManager._untrackActor(this.actor); - Main.layoutManager._trackActor(this.actor, {affectsInputRegion: false, trackFullscreen: true}); - Main.layoutManager._untrackActor(this._slider); - Main.layoutManager._trackActor(this._slider, {affectsStruts: true}); - } else { - Main.layoutManager._untrackActor(this.actor); - Main.layoutManager._untrackActor(this._slider); - Main.layoutManager._trackActor(this._slider); - } - - this._resetPosition(); - - // Add or remove barrier depending on if dock-fixed - this._updateBarrier(); - - this._updateVisibilityMode(); - } - ], [ - this._settings, - 'changed::intellihide', - this._updateVisibilityMode.bind(this) - ], [ - this._settings, - 'changed::intellihide-mode', - () => { this._intellihide.forceUpdate(); } - ], [ - this._settings, - 'changed::autohide', - () => { - this._updateVisibilityMode(); - this._updateBarrier(); - } - ], [ - this._settings, - 'changed::autohide-in-fullscreen', - this._updateBarrier.bind(this) - ], - [ - this._settings, - 'changed::extend-height', - this._resetPosition.bind(this) - ], [ - this._settings, - 'changed::height-fraction', - this._resetPosition.bind(this) - ], [ - this._settings, - 'changed::require-pressure-to-show', - () => { - // Remove pointer watcher - if (this._dockWatch) { - PointerWatcher.getPointerWatcher()._removeWatch(this._dockWatch); - this._dockWatch = null; - } - this._setupDockDwellIfNeeded(); - this._updateBarrier(); - } - ], [ - this._settings, - 'changed::pressure-threshold', - () => { - this._updatePressureBarrier(); - this._updateBarrier(); - } - ]); - - } - - /** - * This is call when visibility settings change - */ - _updateVisibilityMode() { - if (this._settings.get_boolean('dock-fixed')) { - this._fixedIsEnabled = true; - this._autohideIsEnabled = false; - this._intellihideIsEnabled = false; - } - else { - this._fixedIsEnabled = false; - this._autohideIsEnabled = this._settings.get_boolean('autohide') - this._intellihideIsEnabled = this._settings.get_boolean('intellihide') - } - - if (this._intellihideIsEnabled) - this._intellihide.enable(); - else - this._intellihide.disable(); - - this._updateDashVisibility(); - } - - /** - * Show/hide dash based on, in order of priority: - * overview visibility - * fixed mode - * intellihide - * autohide - * overview visibility - */ - _updateDashVisibility() { - if (Main.overview.visibleTarget) - return; - - if (this._fixedIsEnabled) { - this._removeAnimations(); - this._animateIn(this._settings.get_double('animation-time'), 0); - } - else if (this._intellihideIsEnabled) { - if (this._intellihide.getOverlapStatus()) { - this._ignoreHover = false; - // Do not hide if autohide is enabled and mouse is hover - if (!this._box.hover || !this._autohideIsEnabled) - this._animateOut(this._settings.get_double('animation-time'), 0); - } - else { - this._ignoreHover = true; - this._removeAnimations(); - this._animateIn(this._settings.get_double('animation-time'), 0); - } - } - else { - if (this._autohideIsEnabled) { - this._ignoreHover = false; - global.sync_pointer(); - - if (this._box.hover) - this._animateIn(this._settings.get_double('animation-time'), 0); - else - this._animateOut(this._settings.get_double('animation-time'), 0); - } - else - this._animateOut(this._settings.get_double('animation-time'), 0); - } - } - - _onOverviewShowing() { - this._ignoreHover = true; - this._intellihide.disable(); - this._removeAnimations(); - this._animateIn(this._settings.get_double('animation-time'), 0); - } - - _onOverviewHiding() { - this._ignoreHover = false; - this._intellihide.enable(); - this._updateDashVisibility(); - } - - _hoverChanged() { - if (!this._ignoreHover) { - // Skip if dock is not in autohide mode for instance because it is shown - // by intellihide. - if (this._autohideIsEnabled) { - if (this._box.hover) - this._show(); - else - this._hide(); - } - } - } - - getDockState() { - return this._dockState; - } - - _show() { - if ((this._dockState == State.HIDDEN) || (this._dockState == State.HIDING)) { - if (this._dockState == State.HIDING) - // suppress all potential queued hiding animations - i.e. added to Tweener but not started, - // always give priority to show - this._removeAnimations(); - - this.emit('showing'); - this._animateIn(this._settings.get_double('animation-time'), 0); - } - } - - _hide() { - // If no hiding animation is running or queued - if ((this._dockState == State.SHOWN) || (this._dockState == State.SHOWING)) { - let delay; - - if (this._dockState == State.SHOWING) - //if a show already started, let it finish; queue hide without removing the show. - // to obtain this I increase the delay to avoid the overlap and interference - // between the animations - delay = this._settings.get_double('hide-delay') + this._settings.get_double('animation-time'); - else - delay = this._settings.get_double('hide-delay'); - - this.emit('hiding'); - this._animateOut(this._settings.get_double('animation-time'), delay); - } - } - - _animateIn(time, delay) { - this._dockState = State.SHOWING; - - Tweener.addTween(this._slider, { - slidex: 1, - time: time, - delay: delay, - transition: 'easeOutQuad', - onComplete: () => { - this._dockState = State.SHOWN; - // Remove barrier so that mouse pointer is released and can access monitors on other side of dock - // NOTE: Delay needed to keep mouse from moving past dock and re-hiding dock immediately. This - // gives users an opportunity to hover over the dock - if (this._removeBarrierTimeoutId > 0) - Mainloop.source_remove(this._removeBarrierTimeoutId); - this._removeBarrierTimeoutId = Mainloop.timeout_add(100, this._removeBarrier.bind(this)); - } - }); - } - - _animateOut(time, delay) { - this._dockState = State.HIDING; - Tweener.addTween(this._slider, { - slidex: 0, - time: time, - delay: delay , - transition: 'easeOutQuad', - onComplete: () => { - this._dockState = State.HIDDEN; - // Remove queued barried removal if any - if (this._removeBarrierTimeoutId > 0) - Mainloop.source_remove(this._removeBarrierTimeoutId); - this._updateBarrier(); - } - }); - } - - /** - * Dwelling system based on the GNOME Shell 3.14 messageTray code. - */ - _setupDockDwellIfNeeded() { - // If we don't have extended barrier features, then we need - // to support the old tray dwelling mechanism. - if (!global.display.supports_extended_barriers() || !this._settings.get_boolean('require-pressure-to-show')) { - let pointerWatcher = PointerWatcher.getPointerWatcher(); - this._dockWatch = pointerWatcher.addWatch(DOCK_DWELL_CHECK_INTERVAL, this._checkDockDwell.bind(this)); - this._dockDwelling = false; - this._dockDwellUserTime = 0; - } - } - - _checkDockDwell(x, y) { - - let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor.index) - let shouldDwell; - // Check for the correct screen edge, extending the sensitive area to the whole workarea, - // minus 1 px to avoid conflicting with other active corners. - if (this._position == St.Side.LEFT) - shouldDwell = (x == this._monitor.x) && (y > workArea.y) && (y < workArea.y + workArea.height); - else if (this._position == St.Side.RIGHT) - shouldDwell = (x == this._monitor.x + this._monitor.width - 1) && (y > workArea.y) && (y < workArea.y + workArea.height); - else if (this._position == St.Side.TOP) - shouldDwell = (y == this._monitor.y) && (x > workArea.x) && (x < workArea.x + workArea.width); - else if (this._position == St.Side.BOTTOM) - shouldDwell = (y == this._monitor.y + this._monitor.height - 1) && (x > workArea.x) && (x < workArea.x + workArea.width); - - if (shouldDwell) { - // We only set up dwell timeout when the user is not hovering over the dock - // already (!this._box.hover). - // The _dockDwelling variable is used so that we only try to - // fire off one dock dwell - if it fails (because, say, the user has the mouse down), - // we don't try again until the user moves the mouse up and down again. - if (!this._dockDwelling && !this._box.hover && (this._dockDwellTimeoutId == 0)) { - // Save the interaction timestamp so we can detect user input - let focusWindow = global.display.focus_window; - this._dockDwellUserTime = focusWindow ? focusWindow.user_time : 0; - - this._dockDwellTimeoutId = Mainloop.timeout_add(this._settings.get_double('show-delay') * 1000, - this._dockDwellTimeout.bind(this)); - GLib.Source.set_name_by_id(this._dockDwellTimeoutId, '[dash-to-dock] this._dockDwellTimeout'); - } - this._dockDwelling = true; - } - else { - this._cancelDockDwell(); - this._dockDwelling = false; - } - } - - _cancelDockDwell() { - if (this._dockDwellTimeoutId != 0) { - Mainloop.source_remove(this._dockDwellTimeoutId); - this._dockDwellTimeoutId = 0; - } - } - - _dockDwellTimeout() { - this._dockDwellTimeoutId = 0; - - if (!this._settings.get_boolean('autohide-in-fullscreen') && this._monitor.inFullscreen) - return GLib.SOURCE_REMOVE; - - // We don't want to open the tray when a modal dialog - // is up, so we check the modal count for that. When we are in the - // overview we have to take the overview's modal push into account - if (Main.modalCount > (Main.overview.visible ? 1 : 0)) - return GLib.SOURCE_REMOVE; - - // If the user interacted with the focus window since we started the tray - // dwell (by clicking or typing), don't activate the message tray - let focusWindow = global.display.focus_window; - let currentUserTime = focusWindow ? focusWindow.user_time : 0; - if (currentUserTime != this._dockDwellUserTime) - return GLib.SOURCE_REMOVE; - - // Reuse the pressure version function, the logic is the same - this._onPressureSensed(); - return GLib.SOURCE_REMOVE; - } - - _updatePressureBarrier() { - this._canUsePressure = global.display.supports_extended_barriers(); - let pressureThreshold = this._settings.get_double('pressure-threshold'); - - // Remove existing pressure barrier - if (this._pressureBarrier) { - this._pressureBarrier.destroy(); - this._pressureBarrier = null; - } - - if (this._barrier) { - this._barrier.destroy(); - this._barrier = null; - } - - // Create new pressure barrier based on pressure threshold setting - if (this._canUsePressure) { - this._pressureBarrier = new Layout.PressureBarrier(pressureThreshold, this._settings.get_double('show-delay')*1000, - Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW); - this._pressureBarrier.connect('trigger', (barrier) => { - if (!this._settings.get_boolean('autohide-in-fullscreen') && this._monitor.inFullscreen) - return; - this._onPressureSensed(); - }); - } - } - - /** - * handler for mouse pressure sensed - */ - _onPressureSensed() { - if (Main.overview.visibleTarget) - return; - - // In case the mouse move away from the dock area before hovering it, in such case the leave event - // would never be triggered and the dock would stay visible forever. - let triggerTimeoutId = Mainloop.timeout_add(250, () => { - triggerTimeoutId = 0; - - let [x, y, mods] = global.get_pointer(); - let shouldHide = true; - switch (this._position) { - case St.Side.LEFT: - if (x <= this.staticBox.x2 && - x >= this._monitor.x && - y >= this._monitor.y && - y <= this._monitor.y + this._monitor.height) { - shouldHide = false; - } - break; - case St.Side.RIGHT: - if (x >= this.staticBox.x1 && - x <= this._monitor.x + this._monitor.width && - y >= this._monitor.y && - y <= this._monitor.y + this._monitor.height) { - shouldHide = false; - } - break; - case St.Side.TOP: - if (x >= this._monitor.x && - x <= this._monitor.x + this._monitor.width && - y <= this.staticBox.y2 && - y >= this._monitor.y) { - shouldHide = false; - } - break; - case St.Side.BOTTOM: - if (x >= this._monitor.x && - x <= this._monitor.x + this._monitor.width && - y >= this.staticBox.y1 && - y <= this._monitor.y + this._monitor.height) { - shouldHide = false; - } - } - if (shouldHide) { - this._hoverChanged(); - return GLib.SOURCE_REMOVE; - } - else { - return GLib.SOURCE_CONTINUE; - } - - }); - - this._show(); - } - - /** - * Remove pressure barrier - */ - _removeBarrier() { - if (this._barrier) { - if (this._pressureBarrier) - this._pressureBarrier.removeBarrier(this._barrier); - this._barrier.destroy(); - this._barrier = null; - } - this._removeBarrierTimeoutId = 0; - return false; - } - - /** - * Update pressure barrier size - */ - _updateBarrier() { - // Remove existing barrier - this._removeBarrier(); - - // The barrier needs to be removed in fullscreen with autohide disabled, otherwise the mouse can - // get trapped on monitor. - if (this._monitor.inFullscreen && !this._settings.get_boolean('autohide-in-fullscreen')) - return - - // Manually reset pressure barrier - // This is necessary because we remove the pressure barrier when it is triggered to show the dock - if (this._pressureBarrier) { - this._pressureBarrier._reset(); - this._pressureBarrier._isTriggered = false; - } - - // Create new barrier - // The barrier extends to the whole workarea, minus 1 px to avoid conflicting with other active corners - // Note: dash in fixed position doesn't use pressure barrier. - if (this._canUsePressure && this._autohideIsEnabled && this._settings.get_boolean('require-pressure-to-show')) { - let x1, x2, y1, y2, direction; - let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor.index) - - if (this._position == St.Side.LEFT) { - x1 = this._monitor.x + 1; - x2 = x1; - y1 = workArea.y + 1; - y2 = workArea.y + workArea.height - 1; - direction = Meta.BarrierDirection.POSITIVE_X; - } - else if (this._position == St.Side.RIGHT) { - x1 = this._monitor.x + this._monitor.width - 1; - x2 = x1; - y1 = workArea.y + 1; - y2 = workArea.y + workArea.height - 1; - direction = Meta.BarrierDirection.NEGATIVE_X; - } - else if (this._position == St.Side.TOP) { - x1 = workArea.x + 1; - x2 = workArea.x + workArea.width - 1; - y1 = this._monitor.y; - y2 = y1; - direction = Meta.BarrierDirection.POSITIVE_Y; - } - else if (this._position == St.Side.BOTTOM) { - x1 = workArea.x + 1; - x2 = workArea.x + workArea.width - 1; - y1 = this._monitor.y + this._monitor.height; - y2 = y1; - direction = Meta.BarrierDirection.NEGATIVE_Y; - } - - this._barrier = new Meta.Barrier({ - display: global.display, - x1: x1, - x2: x2, - y1: y1, - y2: y2, - directions: direction - }); - if (this._pressureBarrier) - this._pressureBarrier.addBarrier(this._barrier); - } - } - - _isPrimaryMonitor() { - return (this._monitorIndex == Main.layoutManager.primaryIndex); - } - - _resetPosition() { - // Ensure variables linked to settings are updated. - this._updateVisibilityMode(); - - let extendHeight = this._settings.get_boolean('extend-height'); - - // Note: do not use the workarea coordinates in the direction on which the dock is placed, - // to avoid a loop [position change -> workArea change -> position change] with - // fixed dock. - let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitorIndex); - - // Reserve space for the dash on the overview - // if the dock is on the primary monitor - if (this._isPrimaryMonitor()) - this._dashSpacer.show(); - else - // No space is required in the overview of the dash - this._dashSpacer.hide(); - - let fraction = this._settings.get_double('height-fraction'); - - if (extendHeight) - fraction = 1; - else if ((fraction < 0) || (fraction > 1)) - fraction = 0.95; - - let anchor_point; - - if (this._isHorizontal) { - this.actor.width = Math.round( fraction * workArea.width); - - let pos_y; - if (this._position == St.Side.BOTTOM) { - pos_y = this._monitor.y + this._monitor.height; - anchor_point = Clutter.Gravity.SOUTH_WEST; - } - else { - pos_y = this._monitor.y; - anchor_point = Clutter.Gravity.NORTH_WEST; - } - - this.actor.move_anchor_point_from_gravity(anchor_point); - this.actor.x = workArea.x + Math.round((1 - fraction) / 2 * workArea.width); - this.actor.y = pos_y; - - if (extendHeight) { - this.dash._container.set_width(this.actor.width); - this.actor.add_style_class_name('extended'); - } - else { - this.dash._container.set_width(-1); - this.actor.remove_style_class_name('extended'); - } - } - else { - this.actor.height = Math.round(fraction * workArea.height); - - let pos_x; - if (this._position == St.Side.RIGHT) { - pos_x = this._monitor.x + this._monitor.width; - anchor_point = Clutter.Gravity.NORTH_EAST; - } - else { - pos_x = this._monitor.x; - anchor_point = Clutter.Gravity.NORTH_WEST; - } - - this.actor.move_anchor_point_from_gravity(anchor_point); - this.actor.x = pos_x; - this.actor.y = workArea.y + Math.round((1 - fraction) / 2 * workArea.height); - - if (extendHeight) { - this.dash._container.set_height(this.actor.height); - this.actor.add_style_class_name('extended'); - } - else { - this.dash._container.set_height(-1); - this.actor.remove_style_class_name('extended'); - } - } - - this._y0 = this.actor.y; - } - - // Set the dash at the correct depth in z - _resetDepth() { - // Keep the dash below the modalDialogGroup - Main.layoutManager.uiGroup.set_child_below_sibling(this.actor, Main.layoutManager.modalDialogGroup); - } - - _updateStaticBox() { - this.staticBox.init_rect( - this.actor.x + this._slider.x - (this._position == St.Side.RIGHT ? this._box.width : 0), - this.actor.y + this._slider.y - (this._position == St.Side.BOTTOM ? this._box.height : 0), - this._box.width, - this._box.height - ); - - this._intellihide.updateTargetBox(this.staticBox); - } - - _removeAnimations() { - Tweener.removeTweens(this._slider); - } - - _onDragStart() { - // The dash need to be above the top_window_group, otherwise it doesn't - // accept dnd of app icons when not in overiew mode. - Main.layoutManager.uiGroup.set_child_above_sibling(this.actor, global.top_window_group); - this._oldignoreHover = this._ignoreHover; - this._ignoreHover = true; - this._animateIn(this._settings.get_double('animation-time'), 0); - } - - _onDragEnd() { - // Restore drag default dash stack order - this._resetDepth(); - if (this._oldignoreHover !== null) - this._ignoreHover = this._oldignoreHover; - this._oldignoreHover = null; - this._box.sync_hover(); - if (Main.overview._shown) - this._pageChanged(); - } - - _pageChanged() { - let activePage = Main.overview.viewSelector.getActivePage(); - let dashVisible = (activePage == ViewSelector.ViewPage.WINDOWS || - activePage == ViewSelector.ViewPage.APPS); - - if (dashVisible) - this._animateIn(this._settings.get_double('animation-time'), 0); - else - this._animateOut(this._settings.get_double('animation-time'), 0); - } - - _onPageEmpty() { - /* The dash spacer is required only in the WINDOWS view if in the default position. - * The 'page-empty' signal is emitted in between a change of view, - * signalling the spacer can be added and removed without visible effect, - * as it's done for the upstream dashSpacer. - * - * Moreover, hiding the spacer ensure the appGrid allocaton is triggered. - * This matter as the appview spring animation is triggered by to first reallocaton of the appGrid, - * (See appDisplay.js, line 202 on GNOME Shell 3.14: - * this._grid.actor.connect('notify::allocation', ...) - * which in turn seems to be triggered by changes in the other actors in the overview. - * Normally, as far as I could understand, either the dashSpacer being hidden or the workspacesThumbnails - * sliding out would trigger the allocation. However, with no stock dash - * and no thumbnails, which happen if the user configured only 1 and static workspace, - * the animation out of icons is not played. - */ - - let activePage = Main.overview.viewSelector.getActivePage(); - this._dashSpacer.visible = (this._isHorizontal || activePage == ViewSelector.ViewPage.WINDOWS); - } - - /** - * Show dock and give key focus to it - */ - _onAccessibilityFocus() { - this._box.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); - this._animateIn(this._settings.get_double('animation-time'), 0); - } - - /** - * Keep ShowAppsButton status in sync with the overview status - */ - _syncShowAppsButtonToggled() { - let status = Main.overview.viewSelector._showAppsButton.checked; - if (this.dash.showAppsButton.checked !== status) - this.dash.showAppsButton.checked = status; - } - - // Optional features to be enabled only for the main Dock - _enableExtraFeatures() { - // Restore dash accessibility - Main.ctrlAltTabManager.addGroup( - this.dash.actor, _('Dash'), 'user-bookmarks-symbolic', - {focusCallback: this._onAccessibilityFocus.bind(this)}); - } - - /** - * Switch workspace by scrolling over the dock - */ - _optionalScrollWorkspaceSwitch() { - let label = 'optionalScrollWorkspaceSwitch'; - - function isEnabled() { - return this._settings.get_enum('scroll-action') === scrollAction.SWITCH_WORKSPACE; - } - - this._settings.connect('changed::scroll-action', () => { - if (isEnabled.bind(this)()) - enable.bind(this)(); - else - disable.bind(this)(); - }); - - if (isEnabled.bind(this)()) - enable.bind(this)(); - - function enable() { - this._signalsHandler.removeWithLabel(label); - - this._signalsHandler.addWithLabel(label, [ - this._box, - 'scroll-event', - onScrollEvent.bind(this) - ]); - - this._optionalScrollWorkspaceSwitchDeadTimeId = 0; - } - - function disable() { - this._signalsHandler.removeWithLabel(label); - - if (this._optionalScrollWorkspaceSwitchDeadTimeId > 0) { - Mainloop.source_remove(this._optionalScrollWorkspaceSwitchDeadTimeId); - this._optionalScrollWorkspaceSwitchDeadTimeId = 0; - } - } - - // This was inspired to desktop-scroller@obsidien.github.com - function onScrollEvent(actor, event) { - // When in overview change workscape only in windows view - if (Main.overview.visible && Main.overview.viewSelector.getActivePage() !== ViewSelector.ViewPage.WINDOWS) - return false; - - let activeWs = global.workspace_manager.get_active_workspace(); - let direction = null; - - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - direction = Meta.MotionDirection.UP; - break; - case Clutter.ScrollDirection.DOWN: - direction = Meta.MotionDirection.DOWN; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - if (dy < 0) - direction = Meta.MotionDirection.UP; - else if (dy > 0) - direction = Meta.MotionDirection.DOWN; - break; - } - - if (direction !== null) { - // Prevent scroll events from triggering too many workspace switches - // by adding a 250ms deadtime between each scroll event. - // Usefull on laptops when using a touchpad. - - // During the deadtime do nothing - if (this._optionalScrollWorkspaceSwitchDeadTimeId > 0) - return false; - else - this._optionalScrollWorkspaceSwitchDeadTimeId = Mainloop.timeout_add(250, () => { - this._optionalScrollWorkspaceSwitchDeadTimeId = 0; - }); - - let ws; - - ws = activeWs.get_neighbor(direction) - - if (Main.wm._workspaceSwitcherPopup == null) - Main.wm._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup(); - // Set the actor non reactive, so that it doesn't prevent the - // clicks events from reaching the dash actor. I can't see a reason - // why it should be reactive. - Main.wm._workspaceSwitcherPopup.actor.reactive = false; - Main.wm._workspaceSwitcherPopup.connect('destroy', function() { - Main.wm._workspaceSwitcherPopup = null; - }); - - // Do not show wokspaceSwithcer in overview - if (!Main.overview.visible) - Main.wm._workspaceSwitcherPopup.display(direction, ws.index()); - Main.wm.actionMoveWorkspace(ws); - - return true; - } - else - return false; - } - } - - _activateApp(appIndex) { - let children = this.dash._box.get_children().filter(function(actor) { - return actor.child && - actor.child._delegate && - actor.child._delegate.app; - }); - - // Apps currently in the dash - let apps = children.map(function(actor) { - return actor.child._delegate; - }); - - // Activate with button = 1, i.e. same as left click - let button = 1; - if (appIndex < apps.length) - apps[appIndex].activate(button); - } -}; - -Signals.addSignalMethods(DockedDash.prototype); - -/* - * Handle keybaord shortcuts - */ -const DashToDock_KeyboardShortcuts_NUM_HOTKEYS = 10; - -var KeyboardShortcuts = class DashToDock_KeyboardShortcuts { - - constructor(settings, allDocks){ - this._settings = settings; - this._allDocks = allDocks; - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._hotKeysEnabled = false; - if (this._settings.get_boolean('hot-keys')) - this._enableHotKeys(); - - this._signalsHandler.add([ - this._settings, - 'changed::hot-keys', - () => { - if (this._settings.get_boolean('hot-keys')) - this._enableHotKeys.bind(this)(); - else - this._disableHotKeys.bind(this)(); - } - ]); - - this._optionalNumberOverlay(); - } - - destroy() { - // Remove keybindings - this._disableHotKeys(); - this._disableExtraShortcut(); - this._signalsHandler.destroy(); - } - - _enableHotKeys() { - if (this._hotKeysEnabled) - return; - - // Setup keyboard bindings for dash elements - let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-']; - keys.forEach( function(key) { - for (let i = 0; i < DashToDock_KeyboardShortcuts_NUM_HOTKEYS; i++) { - let appNum = i; - Main.wm.addKeybinding(key + (i + 1), this._settings, - Meta.KeyBindingFlags.NONE, - Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, - () => { - this._allDocks[0]._activateApp(appNum); - this._showOverlay(); - }); - } - }, this); - - this._hotKeysEnabled = true; - } - - _disableHotKeys() { - if (!this._hotKeysEnabled) - return; - - let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-']; - keys.forEach( function(key) { - for (let i = 0; i < DashToDock_KeyboardShortcuts_NUM_HOTKEYS; i++) - Main.wm.removeKeybinding(key + (i + 1)); - }, this); - - this._hotKeysEnabled = false; - } - - _optionalNumberOverlay() { - this._shortcutIsSet = false; - // Enable extra shortcut if either 'overlay' or 'show-dock' are true - if (this._settings.get_boolean('hot-keys') && - (this._settings.get_boolean('hotkeys-overlay') || this._settings.get_boolean('hotkeys-show-dock'))) - this._enableExtraShortcut(); - - this._signalsHandler.add([ - this._settings, - 'changed::hot-keys', - this._checkHotkeysOptions.bind(this) - ], [ - this._settings, - 'changed::hotkeys-overlay', - this._checkHotkeysOptions.bind(this) - ], [ - this._settings, - 'changed::hotkeys-show-dock', - this._checkHotkeysOptions.bind(this) - ]); - } - - _checkHotkeysOptions() { - if (this._settings.get_boolean('hot-keys') && - (this._settings.get_boolean('hotkeys-overlay') || this._settings.get_boolean('hotkeys-show-dock'))) - this._enableExtraShortcut(); - else - this._disableExtraShortcut(); - } - - _enableExtraShortcut() { - if (!this._shortcutIsSet) { - Main.wm.addKeybinding('shortcut', this._settings, - Meta.KeyBindingFlags.NONE, - Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, - this._showOverlay.bind(this)); - this._shortcutIsSet = true; - } - } - - _disableExtraShortcut() { - if (this._shortcutIsSet) { - Main.wm.removeKeybinding('shortcut'); - this._shortcutIsSet = false; - } - } - - _showOverlay() { - for (let i = 0; i < this._allDocks.length; i++) { - let dock = this._allDocks[i]; - if (dock._settings.get_boolean('hotkeys-overlay')) - dock.dash.toggleNumberOverlay(true); - - // Restart the counting if the shortcut is pressed again - if (dock._numberOverlayTimeoutId) { - Mainloop.source_remove(dock._numberOverlayTimeoutId); - dock._numberOverlayTimeoutId = 0; - } - - // Hide the overlay/dock after the timeout - let timeout = dock._settings.get_double('shortcut-timeout') * 1000; - dock._numberOverlayTimeoutId = Mainloop.timeout_add(timeout, () => { - dock._numberOverlayTimeoutId = 0; - dock.dash.toggleNumberOverlay(false); - // Hide the dock again if necessary - dock._updateDashVisibility(); - }); - - // Show the dock if it is hidden - if (dock._settings.get_boolean('hotkeys-show-dock')) { - let showDock = (dock._intellihideIsEnabled || dock._autohideIsEnabled); - if (showDock) - dock._show(); - } - } - } -}; - -/** - * Isolate overview to open new windows for inactive apps - * Note: the future implementaion is not fully contained here. Some bits are around in other methods of other classes. - * This class just take care of enabling/disabling the option. - */ -var WorkspaceIsolation = class DashToDock_WorkspaceIsolation { - - constructor(settings, allDocks) { - - this._settings = settings; - this._allDocks = allDocks; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._injectionsHandler = new Utils.InjectionsHandler(); - - this._signalsHandler.add([ - this._settings, - 'changed::isolate-workspaces', - () => { - this._allDocks.forEach(function(dock) { - dock.dash.resetAppIcons(); - }); - if (this._settings.get_boolean('isolate-workspaces') || - this._settings.get_boolean('isolate-monitors')) - this._enable.bind(this)(); - else - this._disable.bind(this)(); - } - ],[ - this._settings, - 'changed::isolate-monitors', - () => { - this._allDocks.forEach(function(dock) { - dock.dash.resetAppIcons(); - }); - if (this._settings.get_boolean('isolate-workspaces') || - this._settings.get_boolean('isolate-monitors')) - this._enable.bind(this)(); - else - this._disable.bind(this)(); - } - ]); - - if (this._settings.get_boolean('isolate-workspaces') || - this._settings.get_boolean('isolate-monitors')) - this._enable(); - - } - - _enable() { - - // ensure I never double-register/inject - // although it should never happen - this._disable(); - - this._allDocks.forEach(function(dock) { - this._signalsHandler.addWithLabel('isolation', [ - global.display, - 'restacked', - dock.dash._queueRedisplay.bind(dock.dash) - ], [ - global.window_manager, - 'switch-workspace', - dock.dash._queueRedisplay.bind(dock.dash) - ]); - - // This last signal is only needed for monitor isolation, as windows - // might migrate from one monitor to another without triggering 'restacked' - if (this._settings.get_boolean('isolate-monitors')) - this._signalsHandler.addWithLabel('isolation', [ - global.display, - 'window-entered-monitor', - dock.dash._queueRedisplay.bind(dock.dash) - ]); - - }, this); - - // here this is the Shell.App - function IsolatedOverview() { - // These lines take care of Nautilus for icons on Desktop - let windows = this.get_windows().filter(function(w) { - return w.get_workspace().index() == global.workspace_manager.get_active_workspace_index(); - }); - if (windows.length == 1) - if (windows[0].skip_taskbar) - return this.open_new_window(-1); - - if (this.is_on_workspace(global.workspace_manager.get_active_workspace())) - return Main.activateWindow(windows[0]); - return this.open_new_window(-1); - } - - this._injectionsHandler.addWithLabel('isolation', [ - Shell.App.prototype, - 'activate', - IsolatedOverview - ]); - } - - _disable () { - this._signalsHandler.removeWithLabel('isolation'); - this._injectionsHandler.removeWithLabel('isolation'); - } - - destroy() { - this._signalsHandler.destroy(); - this._injectionsHandler.destroy(); - } -}; - - -var DockManager = class DashToDock_DockManager { - - constructor() { - this._remoteModel = new LauncherAPI.LauncherEntryRemoteModel(); - this._settings = ExtensionUtils.getSettings('org.gnome.shell.extensions.dash-to-dock'); - this._oldDash = Main.overview._dash; - /* Array of all the docks created */ - this._allDocks = []; - this._createDocks(); - - // status variable: true when the overview is shown through the dash - // applications button. - this._forcedOverview = false; - - // Connect relevant signals to the toggling function - this._bindSettingsChanges(); - } - - _toggle() { - this._deleteDocks(); - this._createDocks(); - this.emit('toggled'); - } - - _bindSettingsChanges() { - // Connect relevant signals to the toggling function - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._signalsHandler.add([ - Meta.MonitorManager.get(), - 'monitors-changed', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::multi-monitor', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::preferred-monitor', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::dock-position', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::extend-height', - this._adjustPanelCorners.bind(this) - ], [ - this._settings, - 'changed::dock-fixed', - this._adjustPanelCorners.bind(this) - ]); - } - - _createDocks() { - - // If there are no monitors (headless configurations, but it can also happen temporary while disconnecting - // and reconnecting monitors), just do nothing. When a monitor will be connected we we'll be notified and - // and thus create the docks. This prevents pointing trying to access monitors throughout the code, were we - // are assuming that at least the primary monitor is present. - if (Main.layoutManager.monitors.length <= 0) { - return; - } - - this._preferredMonitorIndex = this._settings.get_int('preferred-monitor'); - // In case of multi-monitor, we consider the dock on the primary monitor to be the preferred (main) one - // regardless of the settings - // The dock goes on the primary monitor also if the settings are incosistent (e.g. desired monitor not connected). - if (this._settings.get_boolean('multi-monitor') || - this._preferredMonitorIndex < 0 || this._preferredMonitorIndex > Main.layoutManager.monitors.length - 1 - ) { - this._preferredMonitorIndex = Main.layoutManager.primaryIndex; - } else { - // Gdk and shell monitors numbering differ at least under wayland: - // While the primary monitor appears to be always index 0 in Gdk, - // the shell can assign a different number (Main.layoutManager.primaryMonitor) - // This ensure the indexing in the settings (Gdk) and in the shell are matched, - // i.e. that we start counting from the primaryMonitorIndex - this._preferredMonitorIndex = (Main.layoutManager.primaryIndex + this._preferredMonitorIndex) % Main.layoutManager.monitors.length ; - } - - // First we create the main Dock, to get the extra features to bind to this one - let dock = new DockedDash(this._settings, this._remoteModel, this._preferredMonitorIndex); - this._mainShowAppsButton = dock.dash.showAppsButton; - this._allDocks.push(dock); - - // connect app icon into the view selector - dock.dash.showAppsButton.connect('notify::checked', this._onShowAppsButtonToggled.bind(this)); - - // Make the necessary changes to Main.overview._dash - this._prepareMainDash(); - - // Adjust corners if necessary - this._adjustPanelCorners(); - - if (this._settings.get_boolean('multi-monitor')) { - let nMon = Main.layoutManager.monitors.length; - for (let iMon = 0; iMon < nMon; iMon++) { - if (iMon == this._preferredMonitorIndex) - continue; - let dock = new DockedDash(this._settings, this._remoteModel, iMon); - this._allDocks.push(dock); - // connect app icon into the view selector - dock.dash.showAppsButton.connect('notify::checked', this._onShowAppsButtonToggled.bind(this)); - } - } - - // Load optional features. We load *after* the docks are created, since - // we need to connect the signals to all dock instances. - this._workspaceIsolation = new WorkspaceIsolation(this._settings, this._allDocks); - this._keyboardShortcuts = new KeyboardShortcuts(this._settings, this._allDocks); - } - - _prepareMainDash() { - // Pretend I'm the dash: meant to make appgrd swarm animation come from the - // right position of the appShowButton. - Main.overview._dash = this._allDocks[0].dash; - - // set stored icon size to the new dash - Main.overview.dashIconSize = this._allDocks[0].dash.iconSize; - - // Hide usual Dash - Main.overview._controls.dash.actor.hide(); - - // Also set dash width to 1, so it's almost not taken into account by code - // calculaing the reserved space in the overview. The reason to keep it at 1 is - // to allow its visibility change to trigger an allocaion of the appGrid which - // in turn is triggergin the appsIcon spring animation, required when no other - // actors has this effect, i.e in horizontal mode and without the workspaceThumnails - // 1 static workspace only) - Main.overview._controls.dash.actor.set_width(1); - } - - _deleteDocks() { - // Remove extra features - this._workspaceIsolation.destroy(); - this._keyboardShortcuts.destroy(); - - // Delete all docks - let nDocks = this._allDocks.length; - for (let i = nDocks-1; i >= 0; i--) { - this._allDocks[i].destroy(); - this._allDocks.pop(); - } - } - - _restoreDash() { - Main.overview._controls.dash.actor.show(); - Main.overview._controls.dash.actor.set_width(-1); //reset default dash size - // This force the recalculation of the icon size - Main.overview._controls.dash._maxHeight = -1; - - // reset stored icon size to the default dash - Main.overview.dashIconSize = Main.overview._controls.dash.iconSize; - - Main.overview._dash = this._oldDash; - } - - _onShowAppsButtonToggled(button) { - // Sync the status of the default appButtons. Only if the two statuses are - // different, that means the user interacted with the extension provided - // application button, cutomize the behaviour. Otherwise the shell has changed the - // status (due to the _syncShowAppsButtonToggled function below) and it - // has already performed the desired action. - - let animate = this._settings.get_boolean('animate-show-apps'); - let selector = Main.overview.viewSelector; - - if (selector._showAppsButton.checked !== button.checked) { - // find visible view - let visibleView; - Main.overview.viewSelector.appDisplay._views.every(function(v, index) { - if (v.view.actor.visible) { - visibleView = index; - return false; - } - else - return true; - }); - - if (button.checked) { - // force spring animation triggering.By default the animation only - // runs if we are already inside the overview. - if (!Main.overview._shown) { - this._forcedOverview = true; - let view = Main.overview.viewSelector.appDisplay._views[visibleView].view; - let grid = view._grid; - if (animate) { - // Animate in the the appview, hide the appGrid to avoiud flashing - // Go to the appView before entering the overview, skipping the workspaces. - // Do this manually avoiding opacity in transitions so that the setting of the opacity - // to 0 doesn't get overwritten. - Main.overview.viewSelector._activePage.opacity = 0; - Main.overview.viewSelector._activePage.hide(); - Main.overview.viewSelector._activePage = Main.overview.viewSelector._appsPage; - Main.overview.viewSelector._activePage.show(); - grid.actor.opacity = 0; - - // The animation has to be trigered manually because the AppDisplay.animate - // method is waiting for an allocation not happening, as we skip the workspace view - // and the appgrid could already be allocated from previous shown. - // It has to be triggered after the overview is shown as wrong coordinates are obtained - // otherwise. - let overviewShownId = Main.overview.connect('shown', () => { - Main.overview.disconnect(overviewShownId); - Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { - grid.actor.opacity = 255; - grid.animateSpring(IconGrid.AnimationDirection.IN, this._allDocks[0].dash.showAppsButton); - }); - }); - } - else { - Main.overview.viewSelector._activePage = Main.overview.viewSelector._appsPage; - Main.overview.viewSelector._activePage.show(); - grid.actor.opacity = 255; - } - - } - - // Finally show the overview - selector._showAppsButton.checked = true; - Main.overview.show(); - } - else { - if (this._forcedOverview) { - // force exiting overview if needed - - if (animate) { - // Manually trigger springout animation without activating the - // workspaceView to avoid the zoomout animation. Hide the appPage - // onComplete to avoid ugly flashing of original icons. - let view = Main.overview.viewSelector.appDisplay._views[visibleView].view; - let grid = view._grid; - view.animate(IconGrid.AnimationDirection.OUT, () => { - Main.overview.viewSelector._appsPage.hide(); - Main.overview.hide(); - selector._showAppsButton.checked = false; - this._forcedOverview = false; - }); - } - else { - Main.overview.hide(); - this._forcedOverview = false; - } - } - else { - selector._showAppsButton.checked = false; - this._forcedOverview = false; - } - } - } - - // whenever the button is unactivated even if not by the user still reset the - // forcedOverview flag - if (button.checked == false) - this._forcedOverview = false; - } - - destroy() { - this._signalsHandler.destroy(); - this._deleteDocks(); - this._revertPanelCorners(); - this._restoreDash(); - this._remoteModel.destroy(); - } - - /** - * Adjust Panel corners - */ - _adjustPanelCorners() { - let position = Utils.getPosition(this._settings); - let isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); - let extendHeight = this._settings.get_boolean('extend-height'); - let fixedIsEnabled = this._settings.get_boolean('dock-fixed'); - let dockOnPrimary = this._settings.get_boolean('multi-monitor') || - this._preferredMonitorIndex == Main.layoutManager.primaryIndex; - - if (!isHorizontal && dockOnPrimary && extendHeight && fixedIsEnabled) { - Main.panel._rightCorner.actor.hide(); - Main.panel._leftCorner.actor.hide(); - } - else - this._revertPanelCorners(); - } - - _revertPanelCorners() { - Main.panel._leftCorner.actor.show(); - Main.panel._rightCorner.actor.show(); - } -}; -Signals.addSignalMethods(DockManager.prototype); diff --git a/extensions/dash-to-dock/extension.js b/extensions/dash-to-dock/extension.js deleted file mode 100644 index f025fae..0000000 --- a/extensions/dash-to-dock/extension.js +++ /dev/null @@ -1,23 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; - -// We declare this with var so it can be accessed by other extensions in -// GNOME Shell 3.26+ (mozjs52+). -var dockManager; - -function init() { - ExtensionUtils.initTranslations('dashtodock'); -} - -function enable() { - dockManager = new Docking.DockManager(); -} - -function disable() { - dockManager.destroy(); - - dockManager=null; -} diff --git a/extensions/dash-to-dock/intellihide.js b/extensions/dash-to-dock/intellihide.js deleted file mode 100644 index f102ea3..0000000 --- a/extensions/dash-to-dock/intellihide.js +++ /dev/null @@ -1,321 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const GLib = imports.gi.GLib; -const Mainloop = imports.mainloop; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; - -const Main = imports.ui.main; -const Signals = imports.signals; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; - -// A good compromise between reactivity and efficiency; to be tuned. -const INTELLIHIDE_CHECK_INTERVAL = 100; - -const OverlapStatus = { - UNDEFINED: -1, - FALSE: 0, - TRUE: 1 -}; - -const IntellihideMode = { - ALL_WINDOWS: 0, - FOCUS_APPLICATION_WINDOWS: 1, - MAXIMIZED_WINDOWS : 2 -}; - -// List of windows type taken into account. Order is important (keep the original -// enum order). -const handledWindowTypes = [ - Meta.WindowType.NORMAL, - Meta.WindowType.DOCK, - Meta.WindowType.DIALOG, - Meta.WindowType.MODAL_DIALOG, - Meta.WindowType.TOOLBAR, - Meta.WindowType.MENU, - Meta.WindowType.UTILITY, - Meta.WindowType.SPLASHSCREEN -]; - -/** - * A rough and ugly implementation of the intellihide behaviour. - * Intallihide object: emit 'status-changed' signal when the overlap of windows - * with the provided targetBoxClutter.ActorBox changes; - */ -var Intellihide = class DashToDock_Intellihide { - - constructor(settings, monitorIndex) { - // Load settings - this._settings = settings; - this._monitorIndex = monitorIndex; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._tracker = Shell.WindowTracker.get_default(); - this._focusApp = null; // The application whose window is focused. - this._topApp = null; // The application whose window is on top on the monitor with the dock. - - this._isEnabled = false; - this.status = OverlapStatus.UNDEFINED; - this._targetBox = null; - - this._checkOverlapTimeoutContinue = false; - this._checkOverlapTimeoutId = 0; - - this._trackedWindows = new Map(); - - // Connect global signals - this._signalsHandler.add([ - // Add signals on windows created from now on - global.display, - 'window-created', - this._windowCreated.bind(this) - ], [ - // triggered for instance when the window list order changes, - // included when the workspace is switched - global.display, - 'restacked', - this._checkOverlap.bind(this) - ], [ - // when windows are alwasy on top, the focus window can change - // without the windows being restacked. Thus monitor window focus change. - this._tracker, - 'notify::focus-app', - this._checkOverlap.bind(this) - ], [ - // update wne monitor changes, for instance in multimonitor when monitor are attached - Meta.MonitorManager.get(), - 'monitors-changed', - this._checkOverlap.bind(this) - ]); - } - - destroy() { - // Disconnect global signals - this._signalsHandler.destroy(); - - // Remove residual windows signals - this.disable(); - } - - enable() { - this._isEnabled = true; - this._status = OverlapStatus.UNDEFINED; - global.get_window_actors().forEach(function(wa) { - this._addWindowSignals(wa); - }, this); - this._doCheckOverlap(); - } - - disable() { - this._isEnabled = false; - - for (let wa of this._trackedWindows.keys()) { - this._removeWindowSignals(wa); - } - this._trackedWindows.clear(); - - if (this._checkOverlapTimeoutId > 0) { - Mainloop.source_remove(this._checkOverlapTimeoutId); - this._checkOverlapTimeoutId = 0; - } - } - - _windowCreated(display, metaWindow) { - this._addWindowSignals(metaWindow.get_compositor_private()); - } - - _addWindowSignals(wa) { - if (!this._handledWindow(wa)) - return; - let signalId = wa.connect('allocation-changed', this._checkOverlap.bind(this)); - this._trackedWindows.set(wa, signalId); - wa.connect('destroy', this._removeWindowSignals.bind(this)); - } - - _removeWindowSignals(wa) { - if (this._trackedWindows.get(wa)) { - wa.disconnect(this._trackedWindows.get(wa)); - this._trackedWindows.delete(wa); - } - - } - - updateTargetBox(box) { - this._targetBox = box; - this._checkOverlap(); - } - - forceUpdate() { - this._status = OverlapStatus.UNDEFINED; - this._doCheckOverlap(); - } - - getOverlapStatus() { - return (this._status == OverlapStatus.TRUE); - } - - _checkOverlap() { - if (!this._isEnabled || (this._targetBox == null)) - return; - - /* Limit the number of calls to the doCheckOverlap function */ - if (this._checkOverlapTimeoutId) { - this._checkOverlapTimeoutContinue = true; - return - } - - this._doCheckOverlap(); - - this._checkOverlapTimeoutId = Mainloop.timeout_add(INTELLIHIDE_CHECK_INTERVAL, () => { - this._doCheckOverlap(); - if (this._checkOverlapTimeoutContinue) { - this._checkOverlapTimeoutContinue = false; - return GLib.SOURCE_CONTINUE; - } else { - this._checkOverlapTimeoutId = 0; - return GLib.SOURCE_REMOVE; - } - }); - } - - _doCheckOverlap() { - - if (!this._isEnabled || (this._targetBox == null)) - return; - - let overlaps = OverlapStatus.FALSE; - let windows = global.get_window_actors(); - - if (windows.length > 0) { - /* - * Get the top window on the monitor where the dock is placed. - * The idea is that we dont want to overlap with the windows of the topmost application, - * event is it's not the focused app -- for instance because in multimonitor the user - * select a window in the secondary monitor. - */ - - let topWindow = null; - for (let i = windows.length - 1; i >= 0; i--) { - let meta_win = windows[i].get_meta_window(); - if (this._handledWindow(windows[i]) && (meta_win.get_monitor() == this._monitorIndex)) { - topWindow = meta_win; - break; - } - } - - if (topWindow !== null) { - this._topApp = this._tracker.get_window_app(topWindow); - // If there isn't a focused app, use that of the window on top - this._focusApp = this._tracker.focus_app || this._topApp - - windows = windows.filter(this._intellihideFilterInteresting, this); - - for (let i = 0; i < windows.length; i++) { - let win = windows[i].get_meta_window(); - - if (win) { - let rect = win.get_frame_rect(); - - let test = (rect.x < this._targetBox.x2) && - (rect.x + rect.width > this._targetBox.x1) && - (rect.y < this._targetBox.y2) && - (rect.y + rect.height > this._targetBox.y1); - - if (test) { - overlaps = OverlapStatus.TRUE; - break; - } - } - } - } - } - - if (this._status !== overlaps) { - this._status = overlaps; - this.emit('status-changed', this._status); - } - - } - - // Filter interesting windows to be considered for intellihide. - // Consider all windows visible on the current workspace. - // Optionally skip windows of other applications - _intellihideFilterInteresting(wa) { - let meta_win = wa.get_meta_window(); - if (!this._handledWindow(wa)) - return false; - - let currentWorkspace = global.workspace_manager.get_active_workspace_index(); - let wksp = meta_win.get_workspace(); - let wksp_index = wksp.index(); - - // Depending on the intellihide mode, exclude non-relevent windows - switch (this._settings.get_enum('intellihide-mode')) { - case IntellihideMode.ALL_WINDOWS: - // Do nothing - break; - - case IntellihideMode.FOCUS_APPLICATION_WINDOWS: - // Skip windows of other apps - if (this._focusApp) { - // The DropDownTerminal extension is not an application per se - // so we match its window by wm class instead - if (meta_win.get_wm_class() == 'DropDownTerminalWindow') - return true; - - let currentApp = this._tracker.get_window_app(meta_win); - let focusWindow = global.display.get_focus_window() - - // Consider half maximized windows side by side - // and windows which are alwayson top - if((currentApp != this._focusApp) && (currentApp != this._topApp) - && !((focusWindow && focusWindow.maximized_vertically && !focusWindow.maximized_horizontally) - && (meta_win.maximized_vertically && !meta_win.maximized_horizontally) - && meta_win.get_monitor() == focusWindow.get_monitor()) - && !meta_win.is_above()) - return false; - } - break; - - case IntellihideMode.MAXIMIZED_WINDOWS: - // Skip unmaximized windows - if (!meta_win.maximized_vertically && !meta_win.maximized_horizontally) - return false; - break; - } - - if ( wksp_index == currentWorkspace && meta_win.showing_on_its_workspace() ) - return true; - else - return false; - - } - - // Filter windows by type - // inspired by Opacify@gnome-shell.localdomain.pl - _handledWindow(wa) { - let metaWindow = wa.get_meta_window(); - - if (!metaWindow) - return false; - - // The DropDownTerminal extension uses the POPUP_MENU window type hint - // so we match its window by wm class instead - if (metaWindow.get_wm_class() == 'DropDownTerminalWindow') - return true; - - let wtype = metaWindow.get_window_type(); - for (let i = 0; i < handledWindowTypes.length; i++) { - var hwtype = handledWindowTypes[i]; - if (hwtype == wtype) - return true; - else if (hwtype > wtype) - return false; - } - return false; - } -}; - -Signals.addSignalMethods(Intellihide.prototype); diff --git a/extensions/dash-to-dock/launcherAPI.js b/extensions/dash-to-dock/launcherAPI.js deleted file mode 100644 index f0b6199..0000000 --- a/extensions/dash-to-dock/launcherAPI.js +++ /dev/null @@ -1,239 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; -const Signals = imports.signals; - -var LauncherEntryRemoteModel = class DashToDock_LauncherEntryRemoteModel { - - constructor() { - this._entriesByDBusName = {}; - - this._launcher_entry_dbus_signal_id = - Gio.DBus.session.signal_subscribe(null, // sender - 'com.canonical.Unity.LauncherEntry', // iface - null, // member - null, // path - null, // arg0 - Gio.DBusSignalFlags.NONE, - this._onEntrySignalReceived.bind(this)); - - this._dbus_name_owner_changed_signal_id = - Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender - 'org.freedesktop.DBus', // interface - 'NameOwnerChanged', // member - '/org/freedesktop/DBus', // path - null, // arg0 - Gio.DBusSignalFlags.NONE, - this._onDBusNameOwnerChanged.bind(this)); - - this._acquireUnityDBus(); - } - - destroy() { - if (this._launcher_entry_dbus_signal_id) { - Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id); - } - - if (this._dbus_name_owner_changed_signal_id) { - Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id); - } - - this._releaseUnityDBus(); - } - - size() { - return Object.keys(this._entriesByDBusName).length; - } - - lookupByDBusName(dbusName) { - return this._entriesByDBusName.hasOwnProperty(dbusName) ? this._entriesByDBusName[dbusName] : null; - } - - lookupById(appId) { - let ret = []; - for (let dbusName in this._entriesByDBusName) { - let entry = this._entriesByDBusName[dbusName]; - if (entry && entry.appId() == appId) { - ret.push(entry); - } - } - - return ret; - } - - addEntry(entry) { - let existingEntry = this.lookupByDBusName(entry.dbusName()); - if (existingEntry) { - existingEntry.update(entry); - } else { - this._entriesByDBusName[entry.dbusName()] = entry; - this.emit('entry-added', entry); - } - } - - removeEntry(entry) { - delete this._entriesByDBusName[entry.dbusName()] - this.emit('entry-removed', entry); - } - - _acquireUnityDBus() { - if (!this._unity_bus_id) { - Gio.DBus.session.own_name('com.canonical.Unity', - Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null); - } - } - - _releaseUnityDBus() { - if (this._unity_bus_id) { - Gio.DBus.session.unown_name(this._unity_bus_id); - this._unity_bus_id = 0; - } - } - - _onEntrySignalReceived(connection, sender_name, object_path, - interface_name, signal_name, parameters, user_data) { - if (!parameters || !signal_name) - return; - - if (signal_name == 'Update') { - if (!sender_name) { - return; - } - - this._handleUpdateRequest(sender_name, parameters); - } - } - - _onDBusNameOwnerChanged(connection, sender_name, object_path, - interface_name, signal_name, parameters, user_data) { - if (!parameters || !this.size()) - return; - - let [name, before, after] = parameters.deep_unpack(); - - if (!after) { - if (this._entriesByDBusName.hasOwnProperty(before)) { - this.removeEntry(this._entriesByDBusName[before]); - } - } - } - - _handleUpdateRequest(senderName, parameters) { - if (!senderName || !parameters) { - return; - } - - let [appUri, properties] = parameters.deep_unpack(); - let appId = appUri.replace(/(^\w+:|^)\/\//, ''); - let entry = this.lookupByDBusName(senderName); - - if (entry) { - entry.setDBusName(senderName); - entry.update(properties); - } else { - let entry = new LauncherEntryRemote(senderName, appId, properties); - this.addEntry(entry); - } - } -}; -Signals.addSignalMethods(LauncherEntryRemoteModel.prototype); - -var LauncherEntryRemote = class DashToDock_LauncherEntryRemote { - - constructor(dbusName, appId, properties) { - this._dbusName = dbusName; - this._appId = appId; - this._count = 0; - this._countVisible = false; - this._progress = 0.0; - this._progressVisible = false; - this.update(properties); - } - - appId() { - return this._appId; - } - - dbusName() { - return this._dbusName; - } - - count() { - return this._count; - } - - setCount(count) { - if (this._count != count) { - this._count = count; - this.emit('count-changed', this._count); - } - } - - countVisible() { - return this._countVisible; - } - - setCountVisible(countVisible) { - if (this._countVisible != countVisible) { - this._countVisible = countVisible; - this.emit('count-visible-changed', this._countVisible); - } - } - - progress() { - return this._progress; - } - - setProgress(progress) { - if (this._progress != progress) { - this._progress = progress; - this.emit('progress-changed', this._progress); - } - } - - progressVisible() { - return this._progressVisible; - } - - setProgressVisible(progressVisible) { - if (this._progressVisible != progressVisible) { - this._progressVisible = progressVisible; - this.emit('progress-visible-changed', this._progressVisible); - } - } - - setDBusName(dbusName) { - if (this._dbusName != dbusName) { - let oldName = this._dbusName; - this._dbusName = dbusName; - this.emit('dbus-name-changed', oldName); - } - } - - update(other) { - if (other instanceof LauncherEntryRemote) { - this.setDBusName(other.dbusName()) - this.setCount(other.count()); - this.setCountVisible(other.countVisible()); - this.setProgress(other.progress()); - this.setProgressVisible(other.progressVisible()) - } else { - for (let property in other) { - if (other.hasOwnProperty(property)) { - if (property == 'count') { - this.setCount(other[property].get_int64()); - } else if (property == 'count-visible') { - this.setCountVisible(other[property].get_boolean()); - } if (property == 'progress') { - this.setProgress(other[property].get_double()); - } else if (property == 'progress-visible') { - this.setProgressVisible(other[property].get_boolean()); - } else { - // Not implemented yet - } - } - } - } - } -}; -Signals.addSignalMethods(LauncherEntryRemote.prototype); diff --git a/extensions/dash-to-dock/media/glossy.svg b/extensions/dash-to-dock/media/glossy.svg deleted file mode 100644 index 55b71ba..0000000 --- a/extensions/dash-to-dock/media/glossy.svg +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/extensions/dash-to-dock/media/highlight_stacked_bg.svg b/extensions/dash-to-dock/media/highlight_stacked_bg.svg deleted file mode 100644 index 19be5a9..0000000 --- a/extensions/dash-to-dock/media/highlight_stacked_bg.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/extensions/dash-to-dock/media/highlight_stacked_bg_h.svg b/extensions/dash-to-dock/media/highlight_stacked_bg_h.svg deleted file mode 100644 index eeaa869..0000000 --- a/extensions/dash-to-dock/media/highlight_stacked_bg_h.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/extensions/dash-to-dock/media/logo.svg b/extensions/dash-to-dock/media/logo.svg deleted file mode 100644 index eebd0b1..0000000 --- a/extensions/dash-to-dock/media/logo.svg +++ /dev/null @@ -1,528 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dash to Dock - Michele - - - - - - - - - - - - - - - - - - - - - - diff --git a/extensions/dash-to-dock/meson.build b/extensions/dash-to-dock/meson.build deleted file mode 100644 index 290374f..0000000 --- a/extensions/dash-to-dock/meson.build +++ /dev/null @@ -1,23 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) - -extension_sources += files( - 'appIconIndicators.js', - 'appIcons.js', - 'dash.js', - 'docking.js', - 'extension.js', - 'intellihide.js', - 'launcherAPI.js', - 'prefs.js', - 'Settings.ui', - 'theming.js', - 'utils.js', - 'windowPreview.js' -) -extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') - -install_data(['media/logo.svg', 'media/glossy.svg'], install_dir: join_paths(extensiondir, uuid, 'media')) diff --git a/extensions/dash-to-dock/metadata.json.in b/extensions/dash-to-dock/metadata.json.in deleted file mode 100644 index 641a935..0000000 --- a/extensions/dash-to-dock/metadata.json.in +++ /dev/null @@ -1,12 +0,0 @@ -{ -"extension-id": "@extension_id@", -"uuid": "@uuid@", -"settings-schema": "@gschemaname@", -"gettext-domain": "@gettext_domain@", -"original-author": "micxgx@gmail.com", -"name": "Dash to Dock", -"description": "A dock for the Gnome Shell. This extension moves the dash out of the overview transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops. Side and bottom placement options are available.", -"shell-version": [ "@shell_current@" ], -"version": 66, -"url": "https://micheleg.github.io/dash-to-dock/" -} diff --git a/extensions/dash-to-dock/org.gnome.shell.extensions.dash-to-dock.gschema.xml b/extensions/dash-to-dock/org.gnome.shell.extensions.dash-to-dock.gschema.xml deleted file mode 100644 index 9cf371b..0000000 --- a/extensions/dash-to-dock/org.gnome.shell.extensions.dash-to-dock.gschema.xml +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'LEFT' - Dock position - Dock is shown on the Left, Right, Top or Bottom side of the screen. - - - 0.2 - Animation time - Sets the time duration of the autohide effect. - - - 0.25 - Show delay - Sets the delay after the mouse reaches the screen border before showing the dock. - - - 0.20 - Show delay - Sets the delay after the mouse left the dock before hiding it. - - - false - Set a custom dash background background color - Sets the color for the dash background. - - - "#ffffff" - Dash background color. - Customize the background color of the dash. - - - 'DEFAULT' - Transparency mode for the dock - FIXED: constant transparency. DYNAMIC: dock takes the opaque style only when windows are close to it. - - - 'DEFAULT' - ... - DEFAULT: .... DOTS: .... - - - false - Use application icon dominant color for the indicator color - - - - false - Manually set the min and max opacity - For the dynamic mode, the min/max opacity values will be given by 'min-alpha' and 'max-alpha'. - - - 0.2 - Opacity of the dash background when free-floating - Sets the opacity of the dash background when no windows are close. - - - 0.8 - Opacity of the dash background when windows are close. - Sets the opacity of the dash background when windows are close. - - - 0.8 - Opacity of the dash background - Sets the opacity of the dash background when in autohide mode. - - - true - Dock dodges windows - Enable or disable intellihide mode - - - 'FOCUS_APPLICATION_WINDOWS' - Define which windows are considered for intellihide. - - - - true - Dock shown on mouse over - Enable or disable autohide mode - - - true - Require pressure to show dash - Enable or disable requiring pressure to show the dash - - - 100 - Pressure threshold - Sets how much pressure is needed to show the dash. - - - false - Enable autohide in fullscreen mode. - Enable autohide in fullscreen mode. - - - false - Dock always visible - Dock is always visible - - - true - Switch workspace by scrolling over the dock - Add the possibility to switch workspace by mouse scrolling over the dock. - - - 48 - Maximum dash icon size - Set the allowed maximum dash icon size. Allowed range: 16..64. - - - false - Fixed icon size - Keep the icon size fived by scrolling the dock. - - - false - Apply custom theme - Apply customization to the dash appearance - - - false - TODO - TODO - - - false - Customize the style of the running application indicators. - Customize the style of the running application indicators. - - - "#ffffff" - Running application indicators color - Customize the color of the running application indicators. - - - "#ffffff" - Running application indicators border color. - Customize the border color of the running application indicators. - - - 0 - Running application indicators border width. - Customize the border width of the running application indicators. - - - true - Show running apps - Show or hide running appplications icons in the dash - - - false - Provide workspace isolation - Dash shows only windows from the currentworkspace - - - false - Provide monitor isolation - Dash shows only windows from the monitor - - - true - Show preview of the open windows - Replace open windows list with windows previews - - - true - Show favorites apps - Show or hide favorite appplications icons in the dash - - - true - Show applications button - Show appplications button in the dash - - - false - Show application button at top - Show appplication button at top of the dash - - - true - Animate Show Applications from the desktop - Animate Show Applications from the desktop - - - true - Basic compatibility with bolt extensions - Make the extension work properly when bolt extensions is enabled - - - 0.90 - Dock max height (fraction of available space) - - - false - Extend the dock container to all the available height - - - -1 - Monitor on which putting the dock - Set on which monitor to put the dock, use -1 for the primary one - - - false - Enable multi-monitor docks - Show a dock on every monitor - - - true - Minimize on shift+click - - - true - Activate only one window - - - 'cycle-windows' - Action when clicking on a running app - Set the action that is executed when clicking on the icon of a running application - - - 'do-nothing' - Action when scrolling app - Set the action that is executed when scrolling on the application icon - - - 'minimize' - Action when shift+clicking on a running app - Set the action that is executed when shift+clicking on the icon of a running application - - - 'launch' - Action when clicking on a running app - Set the action that is executed when middle-clicking on the icon of a running application - - - 'launch' - Action when clicking on a running app - Set the action that is executed when shift+middle-clicking on the icon of a running application - - - true - Super Hot-Keys - Launch and switch between dash items using Super+(0-9) - - - true - Show the dock when using the hotkeys - The dock will be quickly shown so that the number-overlay is visible and app activation is easier - - - "<Super>q" - Keybinding to show the dock and the number overlay. - Behavior depends on hotkeys-show-dock and hotkeys-overlay. - - - q']]]> - Keybinding to show the dock and the number overlay. - Behavior depends on hotkeys-show-dock and hotkeys-overlay. - - - 2 - Timeout to hide the dock - Sets the time duration before the dock is hidden again. - - - true - Show the dock when using the hotkeys - The dock will be quickly shown so that the number-overlay is visible and app activation is easier - - - 1']]]> - Keybinding to launch 1st dash app - - Keybinding to launch 1st app. - - - - 2']]]> - Keybinding to launch 2nd dash app - - Keybinding to launch 2nd app. - - - - 3']]]> - Keybinding to launch 3rd dash app - - Keybinding to launch 3rd app. - - - - 4']]]> - Keybinding to launch 4th dash app - - Keybinding to launch 4th app. - - - - 5']]]> - Keybinding to launch 5th dash app - - Keybinding to launch 5th app. - - - - 6']]]> - Keybinding to launch 6th dash app - - Keybinding to launch 6th app. - - - - 7']]]> - Keybinding to launch 7th dash app - - Keybinding to launch 7th app. - - - - 8']]]> - Keybinding to launch 8th dash app - - Keybinding to launch 8th app. - - - - 9']]]> - Keybinding to launch 9th dash app - - Keybinding to launch 9th app. - - - - 0']]]> - Keybinding to launch 10th dash app - - Keybinding to launch 10th app. - - - - 1']]]> - Keybinding to trigger 1st dash app with shift behavior - - Keybinding to trigger 1st app with shift behavior. - - - - 2']]]> - Keybinding to trigger 2nd dash app with shift behavior - - Keybinding to trigger 2nd app with shift behavior. - - - - 3']]]> - Keybinding to trigger 3rd dash app with shift behavior - - Keybinding to trigger 3rd app with shift behavior. - - - - 4']]]> - Keybinding to trigger 4th dash app with shift behavior - - Keybinding to trigger 4th app with shift behavior. - - - - 5']]]> - Keybinding to trigger 5th dash app with shift behavior - - Keybinding to trigger 5th app with shift behavior. - - - - 6']]]> - Keybinding to trigger 6th dash app with shift behavior - - Keybinding to trigger 6th app with shift behavior. - - - - 7']]]> - Keybinding to trigger 7th dash app with shift behavior - - Keybinding to trigger 7th app with shift behavior. - - - - 8']]]> - Keybinding to trigger 8th dash app with shift behavior - - Keybinding to trigger 8th app with shift behavior. - - - - 9']]]> - Keybinding to trigger 9th dash app with shift behavior - - Keybinding to trigger 9th app with shift behavior. - - - - 0']]]> - Keybinding to trigger 10th dash app with shift behavior - - Keybinding to trigger 10th app with shift behavior. - - - - 1']]]> - Keybinding to trigger 1st dash app - - Keybinding to either show or launch the 1st application in the dash. - - - - 2']]]> - Keybinding to trigger 2nd dash app - - Keybinding to either show or launch the 2nd application in the dash. - - - - 3']]]> - Keybinding to trigger 3rd dash app - - Keybinding to either show or launch the 3rd application in the dash. - - - - 4']]]> - Keybinding to trigger 4th dash app - - Keybinding to either show or launch the 4th application in the dash. - - - - 5']]]> - Keybinding to trigger 5th dash app - - Keybinding to either show or launch the 5th application in the dash. - - - - 6']]]> - Keybinding to trigger 6th dash app - - Keybinding to either show or launch the 6th application in the dash. - - - - 7']]]> - Keybinding to trigger 7th dash app - - Keybinding to either show or launch the 7th application in the dash. - - - - 8']]]> - Keybinding to trigger 8th dash app - - Keybinding to either show or launch the 8th application in the dash. - - - - 9']]]> - Keybinding to trigger 9th dash app - - Keybinding to either show or launch the 9th application in the dash. - - - - 0']]]> - Keybinding to trigger 10th dash app - - Keybinding to either show or launch the 10th application in the dash. - - - - false - Force straight corners in dash - Make the borders in the dash non rounded - - - false - Enable unity7 like glossy backlit items - Emulate the unity7 backlit glossy items behaviour - - - diff --git a/extensions/dash-to-dock/prefs.js b/extensions/dash-to-dock/prefs.js deleted file mode 100644 index a72b139..0000000 --- a/extensions/dash-to-dock/prefs.js +++ /dev/null @@ -1,861 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const Gtk = imports.gi.Gtk; -const Gdk = imports.gi.Gdk; -const Mainloop = imports.mainloop; - -// Use __ () and N__() for the extension gettext domain, and reuse -// the shell domain with the default _() and N_() -const Gettext = imports.gettext.domain('dashtodock'); -const __ = Gettext.gettext; -const N__ = function(e) { return e }; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); - -const SCALE_UPDATE_TIMEOUT = 500; -const DEFAULT_ICONS_SIZES = [ 128, 96, 64, 48, 32, 24, 16 ]; - -const TransparencyMode = { - DEFAULT: 0, - FIXED: 1, - DYNAMIC: 3 -}; - -const RunningIndicatorStyle = { - DEFAULT: 0, - DOTS: 1, - SQUARES: 2, - DASHES: 3, - SEGMENTED: 4, - SOLID: 5, - CILIORA: 6, - METRO: 7 -}; - -/** - * This function was copied from the activities-config extension - * https://github.com/nls1729/acme-code/tree/master/activities-config - * by Norman L. Smith. - */ -function cssHexString(css) { - let rrggbb = '#'; - let start; - for (let loop = 0; loop < 3; loop++) { - let end = 0; - let xx = ''; - for (let loop = 0; loop < 2; loop++) { - while (true) { - let x = css.slice(end, end + 1); - if ((x == '(') || (x == ',') || (x == ')')) - break; - end++; - } - if (loop == 0) { - end++; - start = end; - } - } - xx = parseInt(css.slice(start, end)).toString(16); - if (xx.length == 1) - xx = '0' + xx; - rrggbb += xx; - css = css.slice(end); - } - return rrggbb; -} - -function setShortcut(settings) { - let shortcut_text = settings.get_string('shortcut-text'); - let [key, mods] = Gtk.accelerator_parse(shortcut_text); - - if (Gtk.accelerator_valid(key, mods)) { - let shortcut = Gtk.accelerator_name(key, mods); - settings.set_strv('shortcut', [shortcut]); - } - else { - settings.set_strv('shortcut', []); - } -} - -var Settings = class DashToDock_Settings { - - constructor() { - this._settings = ExtensionUtils.getSettings('org.gnome.shell.extensions.dash-to-dock'); - - this._rtl = (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL); - - this._builder = new Gtk.Builder(); - this._builder.set_translation_domain(Me.metadata['gettext-domain']); - this._builder.add_from_file(Me.path + '/Settings.ui'); - - this.widget = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER }); - this._notebook = this._builder.get_object('settings_notebook'); - this.widget.add(this._notebook); - - // Set a reasonable initial window height - this.widget.connect('realize', () => { - let window = this.widget.get_toplevel(); - let [default_width, default_height] = window.get_default_size(); - window.resize(default_width, 650); - }); - - // Timeout to delay the update of the settings - this._dock_size_timeout = 0; - this._icon_size_timeout = 0; - this._opacity_timeout = 0; - - this._bindSettings(); - - this._builder.connect_signals_full(this._connector.bind(this)); - } - - /** - * Connect signals - */ - _connector(builder, object, signal, handler) { - /**init - * Object containing all signals defined in the glade file - */ - const SignalHandler = { - dock_display_combo_changed_cb(combo) { - this._settings.set_int('preferred-monitor', this._monitors[combo.get_active()]); - }, - - position_top_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 0); - }, - - position_right_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 1); - }, - - position_bottom_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 2); - }, - - position_left_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 3); - }, - - icon_size_combo_changed_cb(combo) { - this._settings.set_int('dash-max-icon-size', this._allIconSizes[combo.get_active()]); - }, - - dock_size_scale_format_value_cb(scale, value) { - return Math.round(value * 100) + ' %'; - }, - - dock_size_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._dock_size_timeout > 0) - Mainloop.source_remove(this._dock_size_timeout); - - this._dock_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_double('height-fraction', scale.get_value()); - this._dock_size_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - }, - - icon_size_scale_format_value_cb(scale, value) { - return value + ' px'; - }, - - icon_size_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._icon_size_timeout > 0) - Mainloop.source_remove(this._icon_size_timeout); - - this._icon_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_int('dash-max-icon-size', scale.get_value()); - this._icon_size_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - }, - - custom_opacity_scale_value_changed_cb(scale) { - // Avoid settings the opacity consinuosly as it's change is animated - if (this._opacity_timeout > 0) - Mainloop.source_remove(this._opacity_timeout); - - this._opacity_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_double('background-opacity', scale.get_value()); - this._opacity_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - }, - - min_opacity_scale_value_changed_cb(scale) { - // Avoid settings the opacity consinuosly as it's change is animated - if (this._opacity_timeout > 0) - Mainloop.source_remove(this._opacity_timeout); - - this._opacity_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_double('min-alpha', scale.get_value()); - this._opacity_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - }, - - max_opacity_scale_value_changed_cb(scale) { - // Avoid settings the opacity consinuosly as it's change is animated - if (this._opacity_timeout > 0) - Mainloop.source_remove(this._opacity_timeout); - - this._opacity_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_double('max-alpha', scale.get_value()); - this._opacity_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - }, - - custom_opacity_scale_format_value_cb(scale, value) { - return Math.round(value * 100) + ' %'; - }, - - min_opacity_scale_format_value_cb(scale, value) { - return Math.round(value * 100) + ' %'; - }, - - max_opacity_scale_format_value_cb(scale, value) { - return Math.round(value * 100) + ' %'; - }, - - all_windows_radio_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('intellihide-mode', 0); - }, - - focus_application_windows_radio_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('intellihide-mode', 1); - }, - - maximized_windows_radio_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('intellihide-mode', 2); - } - } - - object.connect(signal, SignalHandler[handler].bind(this)); - } - - _bindSettings() { - // Position and size panel - - // Monitor options - - this._monitors = []; - // Build options based on the number of monitors and the current settings. - let n_monitors = Gdk.Screen.get_default().get_n_monitors(); - let primary_monitor = Gdk.Screen.get_default().get_primary_monitor(); - - let monitor = this._settings.get_int('preferred-monitor'); - - // Add primary monitor with index 0, because in GNOME Shell the primary monitor is always 0 - this._builder.get_object('dock_monitor_combo').append_text(__('Primary monitor')); - this._monitors.push(0); - - // Add connected monitors - let ctr = 0; - for (let i = 0; i < n_monitors; i++) { - if (i !== primary_monitor) { - ctr++; - this._monitors.push(ctr); - this._builder.get_object('dock_monitor_combo').append_text(__('Secondary monitor ') + ctr); - } - } - - // If one of the external monitor is set as preferred, show it even if not attached - if ((monitor >= n_monitors) && (monitor !== primary_monitor)) { - this._monitors.push(monitor) - this._builder.get_object('dock_monitor_combo').append_text(__('Secondary monitor ') + ++ctr); - } - - this._builder.get_object('dock_monitor_combo').set_active(this._monitors.indexOf(monitor)); - - // Position option - let position = this._settings.get_enum('dock-position'); - - switch (position) { - case 0: - this._builder.get_object('position_top_button').set_active(true); - break; - case 1: - this._builder.get_object('position_right_button').set_active(true); - break; - case 2: - this._builder.get_object('position_bottom_button').set_active(true); - break; - case 3: - this._builder.get_object('position_left_button').set_active(true); - break; - } - - if (this._rtl) { - /* Left is Right in rtl as a setting */ - this._builder.get_object('position_left_button').set_label(__('Right')); - this._builder.get_object('position_right_button').set_label(__('Left')); - } - - // Intelligent autohide options - this._settings.bind('dock-fixed', - this._builder.get_object('intelligent_autohide_switch'), - 'active', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('dock-fixed', - this._builder.get_object('intelligent_autohide_button'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('autohide', - this._builder.get_object('autohide_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('autohide-in-fullscreen', - this._builder.get_object('autohide_enable_in_fullscreen_checkbutton'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('require_pressure_checkbutton'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('intellihide', - this._builder.get_object('intellihide_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('animation-time', - this._builder.get_object('animation_duration_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('hide-delay', - this._builder.get_object('hide_timeout_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-delay', - this._builder.get_object('show_timeout_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('pressure-threshold', - this._builder.get_object('pressure_threshold_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - - //this._builder.get_object('animation_duration_spinbutton').set_value(this._settings.get_double('animation-time')); - - // Create dialog for intelligent autohide advanced settings - this._builder.get_object('intelligent_autohide_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ title: __('Intelligent autohide customization'), - transient_for: this.widget.get_toplevel(), - use_header_bar: true, - modal: true }); - - // GTK+ leaves positive values for application-defined response ids. - // Use +1 for the reset action - dialog.add_button(__('Reset to defaults'), 1); - - let box = this._builder.get_object('intelligent_autohide_advanced_settings_box'); - dialog.get_content_area().add(box); - - this._settings.bind('intellihide', - this._builder.get_object('intellihide_mode_box'), - 'sensitive', - Gio.SettingsBindFlags.GET); - - // intellihide mode - - let intellihideModeRadioButtons = [ - this._builder.get_object('all_windows_radio_button'), - this._builder.get_object('focus_application_windows_radio_button'), - this._builder.get_object('maximized_windows_radio_button') - ]; - - intellihideModeRadioButtons[this._settings.get_enum('intellihide-mode')].set_active(true); - - this._settings.bind('autohide', - this._builder.get_object('require_pressure_checkbutton'), - 'sensitive', - Gio.SettingsBindFlags.GET); - - this._settings.bind('autohide', - this._builder.get_object('autohide_enable_in_fullscreen_checkbutton'), - 'sensitive', - Gio.SettingsBindFlags.GET); - - this._settings.bind('require-pressure-to-show', - this._builder.get_object('show_timeout_spinbutton'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('show_timeout_label'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('pressure_threshold_spinbutton'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('pressure_threshold_label'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - dialog.connect('response', (dialog, id) => { - if (id == 1) { - // restore default settings for the relevant keys - let keys = ['intellihide', 'autohide', 'intellihide-mode', 'autohide-in-fullscreen', 'require-pressure-to-show', - 'animation-time', 'show-delay', 'hide-delay', 'pressure-threshold']; - keys.forEach(function(val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - intellihideModeRadioButtons[this._settings.get_enum('intellihide-mode')].set_active(true); - } else { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - } - return; - }); - - dialog.show_all(); - - }); - - // size options - this._builder.get_object('dock_size_scale').set_value(this._settings.get_double('height-fraction')); - this._builder.get_object('dock_size_scale').add_mark(0.9, Gtk.PositionType.TOP, null); - let icon_size_scale = this._builder.get_object('icon_size_scale'); - icon_size_scale.set_range(8, DEFAULT_ICONS_SIZES[0]); - icon_size_scale.set_value(this._settings.get_int('dash-max-icon-size')); - DEFAULT_ICONS_SIZES.forEach(function(val) { - icon_size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); - }); - - // Corrent for rtl languages - if (this._rtl) { - // Flip value position: this is not done automatically - this._builder.get_object('dock_size_scale').set_value_pos(Gtk.PositionType.LEFT); - icon_size_scale.set_value_pos(Gtk.PositionType.LEFT); - // I suppose due to a bug, having a more than one mark and one above a value of 100 - // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable - // and then manually inverting it - icon_size_scale.set_flippable(false); - icon_size_scale.set_inverted(true); - } - - this._settings.bind('icon-size-fixed', this._builder.get_object('icon_size_fixed_checkbutton'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('extend-height', this._builder.get_object('dock_size_extend_checkbutton'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('extend-height', this._builder.get_object('dock_size_scale'), 'sensitive', Gio.SettingsBindFlags.INVERT_BOOLEAN); - - - // Apps panel - - this._settings.bind('show-running', - this._builder.get_object('show_running_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('isolate-workspaces', - this._builder.get_object('application_button_isolation_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('isolate-monitors', - this._builder.get_object('application_button_monitor_isolation_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-windows-preview', - this._builder.get_object('windows_preview_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('multi-monitor', - this._builder.get_object('multi_monitor_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-favorites', - this._builder.get_object('show_favorite_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-show-apps-button', - this._builder.get_object('show_applications_button_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-apps-at-top', - this._builder.get_object('application_button_first_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-show-apps-button', - this._builder.get_object('application_button_first_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('animate-show-apps', - this._builder.get_object('application_button_animation_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-show-apps-button', - this._builder.get_object('application_button_animation_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - - // Behavior panel - - this._settings.bind('hot-keys', - this._builder.get_object('hot_keys_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('hot-keys', - this._builder.get_object('overlay_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('click_action_combo').set_active(this._settings.get_enum('click-action')); - this._builder.get_object('click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('click-action', widget.get_active()); - }); - - this._builder.get_object('scroll_action_combo').set_active(this._settings.get_enum('scroll-action')); - this._builder.get_object('scroll_action_combo').connect('changed', (widget) => { - this._settings.set_enum('scroll-action', widget.get_active()); - }); - - this._builder.get_object('shift_click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('shift-click-action', widget.get_active()); - }); - - this._builder.get_object('middle_click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('middle-click-action', widget.get_active()); - }); - this._builder.get_object('shift_middle_click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('shift-middle-click-action', widget.get_active()); - }); - - // Create dialog for number overlay options - this._builder.get_object('overlay_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ title: __('Show dock and application numbers'), - transient_for: this.widget.get_toplevel(), - use_header_bar: true, - modal: true }); - - // GTK+ leaves positive values for application-defined response ids. - // Use +1 for the reset action - dialog.add_button(__('Reset to defaults'), 1); - - let box = this._builder.get_object('box_overlay_shortcut'); - dialog.get_content_area().add(box); - - this._builder.get_object('overlay_switch').set_active(this._settings.get_boolean('hotkeys-overlay')); - this._builder.get_object('show_dock_switch').set_active(this._settings.get_boolean('hotkeys-show-dock')); - - // We need to update the shortcut 'strv' when the text is modified - this._settings.connect('changed::shortcut-text', () => {setShortcut(this._settings);}); - this._settings.bind('shortcut-text', - this._builder.get_object('shortcut_entry'), - 'text', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('hotkeys-overlay', - this._builder.get_object('overlay_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('hotkeys-show-dock', - this._builder.get_object('show_dock_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('shortcut-timeout', - this._builder.get_object('timeout_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - - dialog.connect('response', (dialog, id) => { - if (id == 1) { - // restore default settings for the relevant keys - let keys = ['shortcut-text', 'hotkeys-overlay', 'hotkeys-show-dock', 'shortcut-timeout']; - keys.forEach(function(val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - } else { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - } - return; - }); - - dialog.show_all(); - }); - - // Create dialog for middle-click options - this._builder.get_object('middle_click_options_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ title: __('Customize middle-click behavior'), - transient_for: this.widget.get_toplevel(), - use_header_bar: true, - modal: true }); - - // GTK+ leaves positive values for application-defined response ids. - // Use +1 for the reset action - dialog.add_button(__('Reset to defaults'), 1); - - let box = this._builder.get_object('box_middle_click_options'); - dialog.get_content_area().add(box); - - this._builder.get_object('shift_click_action_combo').set_active(this._settings.get_enum('shift-click-action')); - - this._builder.get_object('middle_click_action_combo').set_active(this._settings.get_enum('middle-click-action')); - - this._builder.get_object('shift_middle_click_action_combo').set_active(this._settings.get_enum('shift-middle-click-action')); - - this._settings.bind('shift-click-action', - this._builder.get_object('shift_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('middle-click-action', - this._builder.get_object('middle_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('shift-middle-click-action', - this._builder.get_object('shift_middle_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - dialog.connect('response', (dialog, id) => { - if (id == 1) { - // restore default settings for the relevant keys - let keys = ['shift-click-action', 'middle-click-action', 'shift-middle-click-action']; - keys.forEach(function(val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - this._builder.get_object('shift_click_action_combo').set_active(this._settings.get_enum('shift-click-action')); - this._builder.get_object('middle_click_action_combo').set_active(this._settings.get_enum('middle-click-action')); - this._builder.get_object('shift_middle_click_action_combo').set_active(this._settings.get_enum('shift-middle-click-action')); - } else { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - } - return; - }); - - dialog.show_all(); - - }); - - // Appearance Panel - - this._settings.bind('apply-custom-theme', this._builder.get_object('customize_theme'), 'sensitive', Gio.SettingsBindFlags.INVERT_BOOLEAN | Gio.SettingsBindFlags.GET); - this._settings.bind('apply-custom-theme', this._builder.get_object('builtin_theme_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('custom-theme-shrink', this._builder.get_object('shrink_dash_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - - // Running indicators - this._builder.get_object('running_indicators_combo').set_active( - this._settings.get_enum('running-indicator-style') - ); - this._builder.get_object('running_indicators_combo').connect( - 'changed', - (widget) => { - this._settings.set_enum('running-indicator-style', widget.get_active()); - } - ); - - if (this._settings.get_enum('running-indicator-style') == RunningIndicatorStyle.DEFAULT) - this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(false); - - this._settings.connect('changed::running-indicator-style', () => { - if (this._settings.get_enum('running-indicator-style') == RunningIndicatorStyle.DEFAULT) - this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(false); - else - this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(true); - }); - - // Create dialog for running indicators advanced settings - this._builder.get_object('running_indicators_advance_settings_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ title: __('Customize running indicators'), - transient_for: this.widget.get_toplevel(), - use_header_bar: true, - modal: true }); - - let box = this._builder.get_object('running_dots_advance_settings_box'); - dialog.get_content_area().add(box); - - this._settings.bind('running-indicator-dominant-color', - this._builder.get_object('dominant_color_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('custom-theme-customize-running-dots', - this._builder.get_object('dot_style_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('custom-theme-customize-running-dots', - this._builder.get_object('dot_style_settings_box'), - 'sensitive', Gio.SettingsBindFlags.DEFAULT); - - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('custom-theme-running-dots-color')); - this._builder.get_object('dot_color_colorbutton').set_rgba(rgba); - - this._builder.get_object('dot_color_colorbutton').connect('notify::color', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('custom-theme-running-dots-color', hexString); - }); - - rgba.parse(this._settings.get_string('custom-theme-running-dots-border-color')); - this._builder.get_object('dot_border_color_colorbutton').set_rgba(rgba); - - this._builder.get_object('dot_border_color_colorbutton').connect('notify::color', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('custom-theme-running-dots-border-color', hexString); - }); - - this._settings.bind('custom-theme-running-dots-border-width', - this._builder.get_object('dot_border_width_spin_button'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - - - dialog.connect('response', (dialog, id) => { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - return; - }); - - dialog.show_all(); - - }); - - this._settings.bind('custom-background-color', this._builder.get_object('custom_background_color_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('custom-background-color', this._builder.get_object('custom_background_color'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('background-color')); - this._builder.get_object('custom_background_color').set_rgba(rgba); - - this._builder.get_object('custom_background_color').connect('notify::color', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('background-color', hexString); - }); - - // Opacity - this._builder.get_object('customize_opacity_combo').set_active( - this._settings.get_enum('transparency-mode') - ); - this._builder.get_object('customize_opacity_combo').connect( - 'changed', - (widget) => { - this._settings.set_enum('transparency-mode', widget.get_active()); - } - ); - - this._builder.get_object('custom_opacity_scale').set_value(this._settings.get_double('background-opacity')); - - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.FIXED) - this._builder.get_object('custom_opacity_scale').set_sensitive(false); - - this._settings.connect('changed::transparency-mode', () => { - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.FIXED) - this._builder.get_object('custom_opacity_scale').set_sensitive(false); - else - this._builder.get_object('custom_opacity_scale').set_sensitive(true); - }); - - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.DYNAMIC) { - this._builder.get_object('dynamic_opacity_button').set_sensitive(false); - } - - this._settings.connect('changed::transparency-mode', () => { - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.DYNAMIC) { - this._builder.get_object('dynamic_opacity_button').set_sensitive(false); - } - else { - this._builder.get_object('dynamic_opacity_button').set_sensitive(true); - } - }); - - // Create dialog for transparency advanced settings - this._builder.get_object('dynamic_opacity_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ title: __('Cutomize opacity'), - transient_for: this.widget.get_toplevel(), - use_header_bar: true, - modal: true }); - - let box = this._builder.get_object('advanced_transparency_dialog'); - dialog.get_content_area().add(box); - - this._settings.bind( - 'customize-alphas', - this._builder.get_object('customize_alphas_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this._settings.bind( - 'customize-alphas', - this._builder.get_object('min_alpha_scale'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - this._settings.bind( - 'customize-alphas', - this._builder.get_object('max_alpha_scale'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - - this._builder.get_object('min_alpha_scale').set_value( - this._settings.get_double('min-alpha') - ); - this._builder.get_object('max_alpha_scale').set_value( - this._settings.get_double('max-alpha') - ); - - dialog.connect('response', (dialog, id) => { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - return; - }); - - dialog.show_all(); - }); - - - this._settings.bind('unity-backlit-items', - this._builder.get_object('unity_backlit_items_switch'), - 'active', Gio.SettingsBindFlags.DEFAULT - ); - - this._settings.bind('force-straight-corner', - this._builder.get_object('force_straight_corner_switch'), - 'active', Gio.SettingsBindFlags.DEFAULT); - - // About Panel - - this._builder.get_object('extension_version').set_label(Me.metadata.version.toString()); - } -}; - -function init() { - ExtensionUtils.initTranslations(); -} - -function buildPrefsWidget() { - let settings = new Settings(); - let widget = settings.widget; - widget.show_all(); - return widget; -} diff --git a/extensions/dash-to-dock/stylesheet.css b/extensions/dash-to-dock/stylesheet.css deleted file mode 100644 index 26cc960..0000000 --- a/extensions/dash-to-dock/stylesheet.css +++ /dev/null @@ -1,175 +0,0 @@ -/* Shrink the dash by reducing padding and border radius */ -#dashtodockContainer.shrink #dash, -#dashtodockContainer.dashtodock #dash { - border:1px; - padding:0px; -} - -#dashtodockContainer.shrink.left #dash, -#dashtodockContainer.dashtodock.left #dash { - border-left: 0px; - border-radius: 0px 9px 9px 0px; -} - - -#dashtodockContainer.shrink.right #dash, -#dashtodockContainer.dashtodock.right #dash { - border-right: 0px; - border-radius: 9px 0px 0px 9px; -} - - -#dashtodockContainer.shrink.top #dash, -#dashtodockContainer.dashtodock.top #dash { - border-top: 0px; - border-radius: 0px 0px 9px 9px; -} - -#dashtodockContainer.shrink.bottom #dash, -#dashtodockContainer.dashtodock.bottom #dash { - border-bottom: 0px; - border-radius: 9px 9px 0px 0px; -} - -#dashtodockContainer.straight-corner #dash, -#dashtodockContainer.shrink.straight-corner #dash { - border-radius: 0px; -} - -/* Scrollview style */ -.bottom #dashtodockDashScrollview, -.top #dashtodockDashScrollview { - -st-hfade-offset: 24px; -} - -.left #dashtodockDashScrollview, -.right #dashtodockDashScrollview { - -st-vfade-offset: 24px; -} - -#dashtodockContainer.running-dots .dash-item-container > StButton, -#dashtodockContainer.dashtodock .dash-item-container > StButton { - transition-duration: 250; - background-size: contain; -} - -#dashtodockContainer.shrink .dash-item-container > StButton, -#dashtodockContainer.dashtodock .dash-item-container > StButton { - padding: 1px 2px; -} - -/* Dash height extended to the whole available vertical space */ -#dashtodockContainer.extended.top #dash, -#dashtodockContainer.extended.right #dash, -#dashtodockContainer.extended.bottom #dash, -#dashtodockContainer.extended.left #dash { - border-radius: 0; -} - -#dashtodockContainer.extended.top #dash, -#dashtodockContainer.extended.bottom #dash { - border-left:0px; - border-right:0px; -} - -#dashtodockContainer.extended.right #dash, -#dashtodockContainer.extended.left #dash { - border-top:0px; - border-bottom:0px; -} - -/* Running and focused application style */ - -#dashtodockContainer.running-dots .app-well-app.running > .overview-icon, -#dashtodockContainer.dashtodock .app-well-app.running > .overview-icon { - background-image:none; -} - - -#dashtodockContainer.running-dots .app-well-app.focused .overview-icon, -#dashtodockContainer.dashtodock .app-well-app.focused .overview-icon { - background-color: rgba(238, 238, 236, 0.2); -} - -#dashtodockContainer.dashtodock #dash { - background: #2e3436; -} - -/* - * This is applied to a dummy actor. Only the alpha value for the background and border color - * and the transition-duration are used - */ -#dashtodockContainer.dummy-opaque { - background-color: rgba(0, 0, 0, 0.8); - border-color: rgba(0, 0, 0, 0.4); - transition-duration: 300ms; -} - -/* - * This is applied to a dummy actor. Only the alpha value for the background and border color - * and the transition-duration are used - */ -#dashtodockContainer.dummy-transparent { - background-color: rgba(0, 0, 0, 0.2); - border-color: rgba(0, 0, 0, 0.1); - transition-duration: 500ms; -} - -#dashtodockContainer.opaque { -} - -#dashtodockContainer.transparent { -} - -#dashtodockContainer .number-overlay { - color: rgba(255,255,255,1); - background-color: rgba(0,0,0,0.8); - text-align: center; -} - -#dashtodockContainer .notification-badge { - color: rgba(255,255,255,1); - background-color: rgba(255,0,0,1.0); - padding: 0.2em 0.5em; - border-radius: 1em; - font-weight: bold; - text-align: center; - margin: 2px; -} - -#dashtodockPreviewSeparator.popup-separator-menu-item-horizontal { - width: 1px; - height: auto; - border-right-width: 1px; - margin: 32px 0px; -} - -.dashtodock-app-well-preview-menu-item { - padding: 1em 1em 0.5em 1em; -} - -#dashtodockContainer .metro .overview-icon{ - border-radius: 0px; -} - -#dashtodockContainer.bottom .metro.running2.focused, -#dashtodockContainer.bottom .metro.running3.focused, -#dashtodockContainer.bottom .metro.running4.focused, -#dashtodockContainer.top .metro.running2.focused, -#dashtodockContainer.top .metro.running3.focused, -#dashtodockContainer.top .metro.running4.focused { - background-image: url('./media/highlight_stacked_bg.svg'); - background-position: 0px 0px; - background-size: contain; -} - -#dashtodockContainer.left .metro.running2.focused, -#dashtodockContainer.left .metro.running3.focused, -#dashtodockContainer.left .metro.running4.focused, -#dashtodockContainer.right .metro.running2.focused, -#dashtodockContainer.right .metro.running3.focused, -#dashtodockContainer.right .metro.running4.focused { - background-image: url('./media/highlight_stacked_bg_h.svg'); - background-position: 0px 0px; - background-size: contain; -} \ No newline at end of file diff --git a/extensions/dash-to-dock/theming.js b/extensions/dash-to-dock/theming.js deleted file mode 100644 index 596574d..0000000 --- a/extensions/dash-to-dock/theming.js +++ /dev/null @@ -1,569 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const Gtk = imports.gi.Gtk; -const Signals = imports.signals; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; -const Mainloop = imports.mainloop; - -const AppDisplay = imports.ui.appDisplay; -const AppFavorites = imports.ui.appFavorites; -const Dash = imports.ui.dash; -const DND = imports.ui.dnd; -const IconGrid = imports.ui.iconGrid; -const Main = imports.ui.main; -const PopupMenu = imports.ui.popupMenu; -const Tweener = imports.ui.tweener; -const Util = imports.misc.util; -const Workspace = imports.ui.workspace; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Dock = Me.imports.docking; -const Utils = Me.imports.utils; - -/* - * DEFAULT: transparency given by theme - * FIXED: constant transparency chosen by user - * DYNAMIC: apply 'transparent' style when no windows are close to the dock - * */ -const TransparencyMode = { - DEFAULT: 0, - FIXED: 1, - DYNAMIC: 3 -}; - -/** - * Manage theme customization and custom theme support - */ -var ThemeManager = class DashToDock_ThemeManager { - - constructor(settings, dock) { - this._settings = settings; - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._bindSettingsChanges(); - this._actor = dock.actor; - this._dash = dock.dash; - - // initialize colors with generic values - this._customizedBackground = {red: 0, green: 0, blue: 0, alpha: 0}; - this._customizedBorder = {red: 0, green: 0, blue: 0, alpha: 0}; - this._transparency = new Transparency(this._settings, dock); - - this._signalsHandler.add([ - // When theme changes re-obtain default background color - St.ThemeContext.get_for_stage (global.stage), - 'changed', - this.updateCustomTheme.bind(this) - ], [ - // update :overview pseudoclass - Main.overview, - 'showing', - this._onOverviewShowing.bind(this) - ], [ - Main.overview, - 'hiding', - this._onOverviewHiding.bind(this) - ]); - - this._updateCustomStyleClasses(); - - // destroy themeManager when the managed actor is destroyed (e.g. extension unload) - // in order to disconnect signals - this._actor.connect('destroy', this.destroy.bind(this)); - - } - - destroy() { - this._signalsHandler.destroy(); - this._transparency.destroy(); - } - - _onOverviewShowing() { - this._actor.add_style_pseudo_class('overview'); - } - - _onOverviewHiding() { - this._actor.remove_style_pseudo_class('overview'); - } - - _updateDashOpacity() { - let newAlpha = this._settings.get_double('background-opacity'); - - let [backgroundColor, borderColor] = this._getDefaultColors(); - - if (backgroundColor==null) - return; - - // Get the background and border alphas. We check the background alpha - // for a minimum of .001 to prevent division by 0 errors - let backgroundAlpha = Math.max(Math.round(backgroundColor.alpha/2.55)/100, .001); - let borderAlpha = Math.round(borderColor.alpha/2.55)/100; - - // The border and background alphas should remain in sync - // We also limit the borderAlpha to a maximum of 1 (full opacity) - borderAlpha = Math.min((borderAlpha/backgroundAlpha)*newAlpha, 1); - - this._customizedBackground = 'rgba(' + - backgroundColor.red + ',' + - backgroundColor.green + ',' + - backgroundColor.blue + ',' + - newAlpha + ')'; - - this._customizedBorder = 'rgba(' + - borderColor.red + ',' + - borderColor.green + ',' + - borderColor.blue + ',' + - borderAlpha + ')'; - - } - - _getDefaultColors() { - // Prevent shell crash if the actor is not on the stage. - // It happens enabling/disabling repeatedly the extension - if (!this._dash._container.get_stage()) - return [null, null]; - - // Remove custom style - let oldStyle = this._dash._container.get_style(); - this._dash._container.set_style(null); - - let themeNode = this._dash._container.get_theme_node(); - this._dash._container.set_style(oldStyle); - - let backgroundColor = themeNode.get_background_color(); - - // Just in case the theme has different border colors .. - // We want to find the inside border-color of the dock because it is - // the side most visible to the user. We do this by finding the side - // opposite the position - let position = Utils.getPosition(this._settings); - let side = position + 2; - if (side > 3) - side = Math.abs(side - 4); - - let borderColor = themeNode.get_border_color(side); - - return [backgroundColor, borderColor]; - } - - _updateDashColor() { - // Retrieve the color. If needed we will adjust it before passing it to - // this._transparency. - let [backgroundColor, borderColor] = this._getDefaultColors(); - - if (backgroundColor==null) - return; - - if (this._settings.get_boolean('custom-background-color')) { - // When applying a custom color, we need to check the alpha value, - // if not the opacity will always be overridden by the color below. - // Note that if using 'dynamic' transparency modes, - // the opacity will be set by the opaque/transparent styles anyway. - let newAlpha = Math.round(backgroundColor.alpha/2.55)/100; - if (this._settings.get_enum('transparency-mode') == TransparencyMode.FIXED) - newAlpha = this._settings.get_double('background-opacity'); - - backgroundColor = Clutter.color_from_string(this._settings.get_string('background-color'))[1]; - this._customizedBackground = 'rgba(' + - backgroundColor.red + ',' + - backgroundColor.green + ',' + - backgroundColor.blue + ',' + - newAlpha + ')'; - - this._customizedBorder = this._customizedBackground; - } - this._transparency.setColor(backgroundColor); - } - - _updateCustomStyleClasses() { - if (this._settings.get_boolean('apply-custom-theme')) - this._actor.add_style_class_name('dashtodock'); - else - this._actor.remove_style_class_name('dashtodock'); - - if (this._settings.get_boolean('custom-theme-shrink')) - this._actor.add_style_class_name('shrink'); - else - this._actor.remove_style_class_name('shrink'); - - if (this._settings.get_enum('running-indicator-style') !== 0) - this._actor.add_style_class_name('running-dots'); - else - this._actor.remove_style_class_name('running-dots'); - - // If not the built-in theme option is not selected - if (!this._settings.get_boolean('apply-custom-theme')) { - if (this._settings.get_boolean('force-straight-corner')) - this._actor.add_style_class_name('straight-corner'); - else - this._actor.remove_style_class_name('straight-corner'); - } else { - this._actor.remove_style_class_name('straight-corner'); - } - } - - updateCustomTheme() { - this._updateCustomStyleClasses(); - this._updateDashOpacity(); - this._updateDashColor(); - this._adjustTheme(); - this._dash._redisplay(); - } - - /** - * Reimported back and adapted from atomdock - */ - _adjustTheme() { - // Prevent shell crash if the actor is not on the stage. - // It happens enabling/disabling repeatedly the extension - if (!this._dash._container.get_stage()) - return; - - // Remove prior style edits - this._dash._container.set_style(null); - this._transparency.disable(); - - // If built-in theme is enabled do nothing else - if (this._settings.get_boolean('apply-custom-theme')) - return; - - let newStyle = ''; - let position = Utils.getPosition(this._settings); - - if (!this._settings.get_boolean('custom-theme-shrink')) { - // obtain theme border settings - let themeNode = this._dash._container.get_theme_node(); - let borderColor = themeNode.get_border_color(St.Side.TOP); - let borderWidth = themeNode.get_border_width(St.Side.TOP); - let borderRadius = themeNode.get_border_radius(St.Corner.TOPRIGHT); - - // We're copying border and corner styles to left border and top-left - // corner, also removing bottom border and bottom-right corner styles - let borderInner = ''; - let borderRadiusValue = ''; - let borderMissingStyle = ''; - - if (this._rtl && (position != St.Side.RIGHT)) - borderMissingStyle = 'border-right: ' + borderWidth + 'px solid ' + - borderColor.to_string() + ';'; - else if (!this._rtl && (position != St.Side.LEFT)) - borderMissingStyle = 'border-left: ' + borderWidth + 'px solid ' + - borderColor.to_string() + ';'; - - switch (position) { - case St.Side.LEFT: - borderInner = 'border-left'; - borderRadiusValue = '0 ' + borderRadius + 'px ' + borderRadius + 'px 0;'; - break; - case St.Side.RIGHT: - borderInner = 'border-right'; - borderRadiusValue = borderRadius + 'px 0 0 ' + borderRadius + 'px;'; - break; - case St.Side.TOP: - borderInner = 'border-top'; - borderRadiusValue = '0 0 ' + borderRadius + 'px ' + borderRadius + 'px;'; - break; - case St.Side.BOTTOM: - borderInner = 'border-bottom'; - borderRadiusValue = borderRadius + 'px ' + borderRadius + 'px 0 0;'; - break; - } - - newStyle = borderInner + ': none;' + - 'border-radius: ' + borderRadiusValue + - borderMissingStyle; - - // I do call set_style possibly twice so that only the background gets the transition. - // The transition-property css rules seems to be unsupported - this._dash._container.set_style(newStyle); - } - - // Customize background - let fixedTransparency = this._settings.get_enum('transparency-mode') == TransparencyMode.FIXED; - let defaultTransparency = this._settings.get_enum('transparency-mode') == TransparencyMode.DEFAULT; - if (!defaultTransparency && !fixedTransparency) { - this._transparency.enable(); - } - else if (!defaultTransparency || this._settings.get_boolean('custom-background-color')) { - newStyle = newStyle + 'background-color:'+ this._customizedBackground + '; ' + - 'border-color:'+ this._customizedBorder + '; ' + - 'transition-delay: 0s; transition-duration: 0.250s;'; - this._dash._container.set_style(newStyle); - } - } - - _bindSettingsChanges() { - let keys = ['transparency-mode', - 'customize-alphas', - 'min-alpha', - 'max-alpha', - 'background-opacity', - 'custom-background-color', - 'background-color', - 'apply-custom-theme', - 'custom-theme-shrink', - 'custom-theme-running-dots', - 'extend-height', - 'force-straight-corner']; - - keys.forEach(function(key) { - this._signalsHandler.add([ - this._settings, - 'changed::' + key, - this.updateCustomTheme.bind(this) - ]); - }, this); - } -}; - -/** - * The following class is based on the following upstream commit: - * https://git.gnome.org/browse/gnome-shell/commit/?id=447bf55e45b00426ed908b1b1035f472c2466956 - * Transparency when free-floating - */ -var Transparency = class DashToDock_Transparency { - - constructor(settings, dock) { - this._settings = settings; - this._dash = dock.dash; - this._actor = this._dash._container; - this._dockActor = dock.actor; - this._dock = dock; - this._panel = Main.panel; - this._position = Utils.getPosition(this._settings); - - // All these properties are replaced with the ones in the .dummy-opaque and .dummy-transparent css classes - this._backgroundColor = '0,0,0'; - this._transparentAlpha = '0.2'; - this._opaqueAlpha = '1'; - this._transparentAlphaBorder = '0.1'; - this._opaqueAlphaBorder = '0.5'; - this._transparentTransition = '0ms'; - this._opaqueTransition = '0ms'; - this._base_actor_style = ""; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._injectionsHandler = new Utils.InjectionsHandler(); - this._trackedWindows = new Map(); - } - - enable() { - // ensure I never double-register/inject - // although it should never happen - this.disable(); - - this._base_actor_style = this._actor.get_style(); - if (this._base_actor_style == null) { - this._base_actor_style = ""; - } - - this._signalsHandler.addWithLabel('transparency', [ - global.window_group, - 'actor-added', - this._onWindowActorAdded.bind(this) - ], [ - global.window_group, - 'actor-removed', - this._onWindowActorRemoved.bind(this) - ], [ - global.window_manager, - 'switch-workspace', - this._updateSolidStyle.bind(this) - ], [ - Main.overview, - 'hiding', - this._updateSolidStyle.bind(this) - ], [ - Main.overview, - 'showing', - this._updateSolidStyle.bind(this) - ]); - - // Window signals - global.window_group.get_children().filter(function(child) { - // An irrelevant window actor ('Gnome-shell') produces an error when the signals are - // disconnected, therefore do not add signals to it. - return child instanceof Meta.WindowActor && - child.get_meta_window().get_wm_class() !== 'Gnome-shell'; - }).forEach(function(win) { - this._onWindowActorAdded(null, win); - }, this); - - if (this._actor.get_stage()) - this._updateSolidStyle(); - - this._updateStyles(); - this._updateSolidStyle(); - - this.emit('transparency-enabled'); - } - - disable() { - // ensure I never double-register/inject - // although it should never happen - this._signalsHandler.removeWithLabel('transparency'); - - for (let key of this._trackedWindows.keys()) - this._trackedWindows.get(key).forEach(id => { - key.disconnect(id); - }); - this._trackedWindows.clear(); - - this.emit('transparency-disabled'); - } - - destroy() { - this.disable(); - this._signalsHandler.destroy(); - this._injectionsHandler.destroy(); - } - - _onWindowActorAdded(container, metaWindowActor) { - let signalIds = []; - ['allocation-changed', 'notify::visible'].forEach(s => { - signalIds.push(metaWindowActor.connect(s, this._updateSolidStyle.bind(this))); - }); - this._trackedWindows.set(metaWindowActor, signalIds); - } - - _onWindowActorRemoved(container, metaWindowActor) { - if (!this._trackedWindows.get(metaWindowActor)) - return; - - this._trackedWindows.get(metaWindowActor).forEach(id => { - metaWindowActor.disconnect(id); - }); - this._trackedWindows.delete(metaWindowActor); - this._updateSolidStyle(); - } - - _updateSolidStyle() { - let isNear = this._dockIsNear(); - if (isNear) { - this._actor.set_style(this._opaque_style); - this._dockActor.remove_style_class_name('transparent'); - this._dockActor.add_style_class_name('opaque'); - } - else { - this._actor.set_style(this._transparent_style); - this._dockActor.remove_style_class_name('opaque'); - this._dockActor.add_style_class_name('transparent'); - } - - this.emit('solid-style-updated', isNear); - } - - _dockIsNear() { - if (this._dockActor.has_style_pseudo_class('overview')) - return false; - /* Get all the windows in the active workspace that are in the primary monitor and visible */ - let activeWorkspace = global.workspace_manager.get_active_workspace(); - let dash = this._dash; - let windows = activeWorkspace.list_windows().filter(function(metaWindow) { - return metaWindow.get_monitor() === dash._monitorIndex && - metaWindow.showing_on_its_workspace() && - metaWindow.get_window_type() != Meta.WindowType.DESKTOP; - }); - - /* Check if at least one window is near enough to the panel. - * If the dock is hidden, we need to account for the space it would take - * up when it slides out. This is avoid an ugly transition. - * */ - let factor = 0; - if (!this._settings.get_boolean('dock-fixed') && - this._dock.getDockState() == Dock.State.HIDDEN) - factor = 1; - let [leftCoord, topCoord] = this._actor.get_transformed_position(); - let threshold; - if (this._position === St.Side.LEFT) - threshold = leftCoord + this._actor.get_width() * (factor + 1); - else if (this._position === St.Side.RIGHT) - threshold = leftCoord - this._actor.get_width() * factor; - else if (this._position === St.Side.TOP) - threshold = topCoord + this._actor.get_height() * (factor + 1); - else - threshold = topCoord - this._actor.get_height() * factor; - - let scale = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let isNearEnough = windows.some((metaWindow) => { - let coord; - if (this._position === St.Side.LEFT) { - coord = metaWindow.get_frame_rect().x; - return coord < threshold + 5 * scale; - } - else if (this._position === St.Side.RIGHT) { - coord = metaWindow.get_frame_rect().x + metaWindow.get_frame_rect().width; - return coord > threshold - 5 * scale; - } - else if (this._position === St.Side.TOP) { - coord = metaWindow.get_frame_rect().y; - return coord < threshold + 5 * scale; - } - else { - coord = metaWindow.get_frame_rect().y + metaWindow.get_frame_rect().height; - return coord > threshold - 5 * scale; - } - }); - - return isNearEnough; - } - - _updateStyles() { - this._getAlphas(); - - this._transparent_style = this._base_actor_style + - 'background-color: rgba(' + - this._backgroundColor + ', ' + this._transparentAlpha + ');' + - 'border-color: rgba(' + - this._backgroundColor + ', ' + this._transparentAlphaBorder + ');' + - 'transition-duration: ' + this._transparentTransition + 'ms;'; - - this._opaque_style = this._base_actor_style + - 'background-color: rgba(' + - this._backgroundColor + ', ' + this._opaqueAlpha + ');' + - 'border-color: rgba(' + - this._backgroundColor + ',' + this._opaqueAlphaBorder + ');' + - 'transition-duration: ' + this._opaqueTransition + 'ms;'; - - this.emit('styles-updated'); - } - - setColor(color) { - this._backgroundColor = color.red + ',' + color.green + ',' + color.blue; - this._updateStyles(); - } - - _getAlphas() { - // Create dummy object and add to the uiGroup to get it to the stage - let dummyObject = new St.Bin({ - name: 'dashtodockContainer', - }); - Main.uiGroup.add_child(dummyObject); - - dummyObject.add_style_class_name('dummy-opaque'); - let themeNode = dummyObject.get_theme_node(); - this._opaqueAlpha = themeNode.get_background_color().alpha / 255; - this._opaqueAlphaBorder = themeNode.get_border_color(0).alpha / 255; - this._opaqueTransition = themeNode.get_transition_duration(); - - dummyObject.add_style_class_name('dummy-transparent'); - themeNode = dummyObject.get_theme_node(); - this._transparentAlpha = themeNode.get_background_color().alpha / 255; - this._transparentAlphaBorder = themeNode.get_border_color(0).alpha / 255; - this._transparentTransition = themeNode.get_transition_duration(); - - Main.uiGroup.remove_child(dummyObject); - - if (this._settings.get_boolean('customize-alphas')) { - this._opaqueAlpha = this._settings.get_double('max-alpha'); - this._opaqueAlphaBorder = this._opaqueAlpha / 2; - this._transparentAlpha = this._settings.get_double('min-alpha'); - this._transparentAlphaBorder = this._transparentAlpha / 2; - } - } -}; -Signals.addSignalMethods(Transparency.prototype); diff --git a/extensions/dash-to-dock/utils.js b/extensions/dash-to-dock/utils.js deleted file mode 100644 index d315bd9..0000000 --- a/extensions/dash-to-dock/utils.js +++ /dev/null @@ -1,258 +0,0 @@ -const Clutter = imports.gi.Clutter; -const Meta = imports.gi.Meta; -const St = imports.gi.St; - -/** - * Simplify global signals and function injections handling - * abstract class - */ -const BasicHandler = class DashToDock_BasicHandler { - - constructor() { - this._storage = new Object(); - } - - add(/* unlimited 3-long array arguments */) { - // Convert arguments object to array, concatenate with generic - let args = Array.concat('generic', Array.slice(arguments)); - // Call addWithLabel with ags as if they were passed arguments - this.addWithLabel.apply(this, args); - } - - destroy() { - for( let label in this._storage ) - this.removeWithLabel(label); - } - - addWithLabel(label /* plus unlimited 3-long array arguments*/) { - if (this._storage[label] == undefined) - this._storage[label] = new Array(); - - // Skip first element of the arguments - for (let i = 1; i < arguments.length; i++) { - let item = this._storage[label]; - item.push(this._create(arguments[i])); - } - } - - removeWithLabel(label) { - if (this._storage[label]) { - for (let i = 0; i < this._storage[label].length; i++) - this._remove(this._storage[label][i]); - - delete this._storage[label]; - } - } - - // Virtual methods to be implemented by subclass - - /** - * Create single element to be stored in the storage structure - */ - _create(item) { - throw new Error('no implementation of _create in ' + this); - } - - /** - * Correctly delete single element - */ - _remove(item) { - throw new Error('no implementation of _remove in ' + this); - } -}; - -/** - * Manage global signals - */ -var GlobalSignalsHandler = class DashToDock_GlobalSignalHandler extends BasicHandler { - - _create(item) { - let object = item[0]; - let event = item[1]; - let callback = item[2] - let id = object.connect(event, callback); - - return [object, id]; - } - - _remove(item) { - item[0].disconnect(item[1]); - } -}; - -/** - * Color manipulation utilities - */ -var ColorUtils = class DashToDock_ColorUtils { - - // Darken or brigthen color by a fraction dlum - // Each rgb value is modified by the same fraction. - // Return "#rrggbb" string - static ColorLuminance(r, g, b, dlum) { - let rgbString = '#'; - - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2); - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2); - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2); - - return rgbString; - } - - // Convert decimal to an hexadecimal string adding the desired padding - static _decimalToHex(d, padding) { - let hex = d.toString(16); - while (hex.length < padding) - hex = '0'+ hex; - return hex; - } - - // Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]). - // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV - // here with h = [0,1] instead of [0, 360] - // Accept either (h,s,v) independently or {h:h, s:s, v:v} object. - // Return {r:r, g:g, b:b} object. - static HSVtoRGB(h, s, v) { - if (arguments.length === 1) { - s = h.s; - v = h.v; - h = h.h; - } - - let r,g,b; - let c = v*s; - let h1 = h*6; - let x = c*(1 - Math.abs(h1 % 2 - 1)); - let m = v - c; - - if (h1 <=1) - r = c + m, g = x + m, b = m; - else if (h1 <=2) - r = x + m, g = c + m, b = m; - else if (h1 <=3) - r = m, g = c + m, b = x + m; - else if (h1 <=4) - r = m, g = x + m, b = c + m; - else if (h1 <=5) - r = x + m, g = m, b = c + m; - else - r = c + m, g = m, b = x + m; - - return { - r: Math.round(r * 255), - g: Math.round(g * 255), - b: Math.round(b * 255) - }; - } - - // Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]). - // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV - // here with h = [0,1] instead of [0, 360] - // Accept either (r,g,b) independently or {r:r, g:g, b:b} object. - // Return {h:h, s:s, v:v} object. - static RGBtoHSV(r, g, b) { - if (arguments.length === 1) { - r = r.r; - g = r.g; - b = r.b; - } - - let h,s,v; - - let M = Math.max(r, g, b); - let m = Math.min(r, g, b); - let c = M - m; - - if (c == 0) - h = 0; - else if (M == r) - h = ((g-b)/c) % 6; - else if (M == g) - h = (b-r)/c + 2; - else - h = (r-g)/c + 4; - - h = h/6; - v = M/255; - if (M !== 0) - s = c/M; - else - s = 0; - - return { - h: h, - s: s, - v: v - }; - } -}; - -/** - * Manage function injection: both instances and prototype can be overridden - * and restored - */ -var InjectionsHandler = class DashToDock_InjectionsHandler extends BasicHandler { - - _create(item) { - let object = item[0]; - let name = item[1]; - let injectedFunction = item[2]; - let original = object[name]; - - object[name] = injectedFunction; - return [object, name, injectedFunction, original]; - } - - _remove(item) { - let object = item[0]; - let name = item[1]; - let original = item[3]; - object[name] = original; - } -}; - -/** - * Return the actual position reverseing left and right in rtl - */ -function getPosition(settings) { - let position = settings.get_enum('dock-position'); - if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { - if (position == St.Side.LEFT) - position = St.Side.RIGHT; - else if (position == St.Side.RIGHT) - position = St.Side.LEFT; - } - return position; -} - -function drawRoundedLine(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) { - if (height > width) { - y += Math.floor((height - width) / 2.0); - height = width; - } - - height = 2.0 * Math.floor(height / 2.0); - - var leftRadius = isRoundLeft ? height / 2.0 : 0.0; - var rightRadius = isRoundRight ? height / 2.0 : 0.0; - - cr.moveTo(x + width - rightRadius, y); - cr.lineTo(x + leftRadius, y); - if (isRoundLeft) - cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2); - else - cr.lineTo(x, y + height); - cr.lineTo(x + width - rightRadius, y + height); - if (isRoundRight) - cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2); - else - cr.lineTo(x + width, y); - cr.closePath(); - - if (fill != null) { - cr.setSource(fill); - cr.fillPreserve(); - } - if (stroke != null) - cr.setSource(stroke); - cr.stroke(); -} diff --git a/extensions/dash-to-dock/windowPreview.js b/extensions/dash-to-dock/windowPreview.js deleted file mode 100644 index ea98f27..0000000 --- a/extensions/dash-to-dock/windowPreview.js +++ /dev/null @@ -1,578 +0,0 @@ -/* - * Credits: - * This file is based on code from the Dash to Panel extension by Jason DeRose - * and code from the Taskbar extension by Zorin OS - * Some code was also adapted from the upstream Gnome Shell source code. - */ -const Clutter = imports.gi.Clutter; -const GLib = imports.gi.GLib; -const St = imports.gi.St; -const Mainloop = imports.mainloop; -const Main = imports.ui.main; -const Gtk = imports.gi.Gtk; - -const Params = imports.misc.params; -const PopupMenu = imports.ui.popupMenu; -const Tweener = imports.ui.tweener; -const Workspace = imports.ui.workspace; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; - -const PREVIEW_MAX_WIDTH = 250; -const PREVIEW_MAX_HEIGHT = 150; - -var WindowPreviewMenu = class DashToDock_WindowPreviewMenu extends PopupMenu.PopupMenu { - - constructor(source, settings) { - let side = Utils.getPosition(settings); - super(source.actor, 0.5, side); - - this._dtdSettings = settings; - - // We want to keep the item hovered while the menu is up - this.blockSourceEvents = true; - - this._source = source; - this._app = this._source.app; - let monitorIndex = this._source.monitorIndex; - - this.actor.add_style_class_name('app-well-menu'); - this.actor.set_style('max-width: ' + (Main.layoutManager.monitors[monitorIndex].width - 22) + 'px; ' + - 'max-height: ' + (Main.layoutManager.monitors[monitorIndex].height - 22) + 'px;'); - this.actor.hide(); - - // Chain our visibility and lifecycle to that of the source - this._mappedId = this._source.actor.connect('notify::mapped', () => { - if (!this._source.actor.mapped) - this.close(); - }); - this._destroyId = this._source.actor.connect('destroy', this.destroy.bind(this)); - - Main.uiGroup.add_actor(this.actor); - - // Change the initialized side where required. - this._arrowSide = side; - this._boxPointer._arrowSide = side; - this._boxPointer._userArrowSide = side; - - this.connect('destroy', this._onDestroy.bind(this)); - } - - _redisplay() { - if (this._previewBox) - this._previewBox.destroy(); - this._previewBox = new WindowPreviewList(this._source, this._dtdSettings); - this.addMenuItem(this._previewBox); - this._previewBox._redisplay(); - } - - popup() { - let windows = this._source.getInterestingWindows(); - if (windows.length > 0) { - this._redisplay(); - this.open(); - this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); - this._source.emit('sync-tooltip'); - } - } - - _onDestroy() { - if (this._mappedId) - this._source.actor.disconnect(this._mappedId); - - if (this._destroyId) - this._source.actor.disconnect(this._destroyId); - } -}; - -var WindowPreviewList = class DashToDock_WindowPreviewList extends PopupMenu.PopupMenuSection { - - constructor(source, settings) { - super(); - this._dtdSettings = settings; - - this.actor = new St.ScrollView({ name: 'dashtodockWindowScrollview', - hscrollbar_policy: Gtk.PolicyType.NEVER, - vscrollbar_policy: Gtk.PolicyType.NEVER, - enable_mouse_scrolling: true }); - - this.actor.connect('scroll-event', this._onScrollEvent.bind(this)); - - let position = Utils.getPosition(this._dtdSettings); - this.isHorizontal = position == St.Side.BOTTOM || position == St.Side.TOP; - this.box.set_vertical(!this.isHorizontal); - this.box.set_name('dashtodockWindowList'); - this.actor.add_actor(this.box); - this.actor._delegate = this; - - this._shownInitially = false; - - this._source = source; - this.app = source.app; - - this._redisplayId = Main.initializeDeferredWork(this.actor, this._redisplay.bind(this)); - - this.actor.connect('destroy', this._onDestroy.bind(this)); - this._stateChangedId = this.app.connect('windows-changed', - this._queueRedisplay.bind(this)); - } - - _queueRedisplay () { - Main.queueDeferredWork(this._redisplayId); - } - - _onScrollEvent(actor, event) { - // Event coordinates are relative to the stage but can be transformed - // as the actor will only receive events within his bounds. - let stage_x, stage_y, ok, event_x, event_y, actor_w, actor_h; - [stage_x, stage_y] = event.get_coords(); - [ok, event_x, event_y] = actor.transform_stage_point(stage_x, stage_y); - [actor_w, actor_h] = actor.get_size(); - - // If the scroll event is within a 1px margin from - // the relevant edge of the actor, let the event propagate. - if (event_y >= actor_h - 2) - return Clutter.EVENT_PROPAGATE; - - // Skip to avoid double events mouse - if (event.is_pointer_emulated()) - return Clutter.EVENT_STOP; - - let adjustment, delta; - - if (this.isHorizontal) - adjustment = this.actor.get_hscroll_bar().get_adjustment(); - else - adjustment = this.actor.get_vscroll_bar().get_adjustment(); - - let increment = adjustment.step_increment; - - switch ( event.get_scroll_direction() ) { - case Clutter.ScrollDirection.UP: - delta = -increment; - break; - case Clutter.ScrollDirection.DOWN: - delta = +increment; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - delta = dy*increment; - delta += dx*increment; - break; - - } - - adjustment.set_value(adjustment.get_value() + delta); - - return Clutter.EVENT_STOP; - } - - _onDestroy() { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; - } - - _createPreviewItem(window) { - let preview = new WindowPreviewMenuItem(window); - return preview; - } - - _redisplay () { - let children = this._getMenuItems().filter(function(actor) { - return actor._window; - }); - - // Windows currently on the menu - let oldWin = children.map(function(actor) { - return actor._window; - }); - - // All app windows with a static order - let newWin = this._source.getInterestingWindows().sort(function(a, b) { - return a.get_stable_sequence() > b.get_stable_sequence(); - }); - - let addedItems = []; - let removedActors = []; - - let newIndex = 0; - let oldIndex = 0; - - while (newIndex < newWin.length || oldIndex < oldWin.length) { - // No change at oldIndex/newIndex - if (oldWin[oldIndex] && - oldWin[oldIndex] == newWin[newIndex]) { - oldIndex++; - newIndex++; - continue; - } - - // Window removed at oldIndex - if (oldWin[oldIndex] && - newWin.indexOf(oldWin[oldIndex]) == -1) { - removedActors.push(children[oldIndex]); - oldIndex++; - continue; - } - - // Window added at newIndex - if (newWin[newIndex] && - oldWin.indexOf(newWin[newIndex]) == -1) { - addedItems.push({ item: this._createPreviewItem(newWin[newIndex]), - pos: newIndex }); - newIndex++; - continue; - } - - // Window moved - let insertHere = newWin[newIndex + 1] && - newWin[newIndex + 1] == oldWin[oldIndex]; - let alreadyRemoved = removedActors.reduce(function(result, actor) { - let removedWin = actor._window; - return result || removedWin == newWin[newIndex]; - }, false); - - if (insertHere || alreadyRemoved) { - addedItems.push({ item: this._createPreviewItem(newWin[newIndex]), - pos: newIndex + removedActors.length }); - newIndex++; - } else { - removedActors.push(children[oldIndex]); - oldIndex++; - } - } - - for (let i = 0; i < addedItems.length; i++) - this.addMenuItem(addedItems[i].item, - addedItems[i].pos); - - for (let i = 0; i < removedActors.length; i++) { - let item = removedActors[i]; - if (this._shownInitially) - item._animateOutAndDestroy(); - else - item.actor.destroy(); - } - - // Skip animations on first run when adding the initial set - // of items, to avoid all items zooming in at once - let animate = this._shownInitially; - - if (!this._shownInitially) - this._shownInitially = true; - - for (let i = 0; i < addedItems.length; i++) - addedItems[i].item.show(animate); - - // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 - // Without it, StBoxLayout may use a stale size cache - this.box.queue_relayout(); - - if (newWin.length < 1) - this._getTopMenu().close(~0); - - // As for upstream: - // St.ScrollView always requests space horizontally for a possible vertical - // scrollbar if in AUTOMATIC mode. Doing better would require implementation - // of width-for-height in St.BoxLayout and St.ScrollView. This looks bad - // when we *don't* need it, so turn off the scrollbar when that's true. - // Dynamic changes in whether we need it aren't handled properly. - let needsScrollbar = this._needsScrollbar(); - let scrollbar_policy = needsScrollbar ? Gtk.PolicyType.AUTOMATIC : Gtk.PolicyType.NEVER; - if (this.isHorizontal) - this.actor.hscrollbar_policy = scrollbar_policy; - else - this.actor.vscrollbar_policy = scrollbar_policy; - - if (needsScrollbar) - this.actor.add_style_pseudo_class('scrolled'); - else - this.actor.remove_style_pseudo_class('scrolled'); - } - - _needsScrollbar() { - let topMenu = this._getTopMenu(); - let topThemeNode = topMenu.actor.get_theme_node(); - if (this.isHorizontal) { - let [topMinWidth, topNaturalWidth] = topMenu.actor.get_preferred_width(-1); - let topMaxWidth = topThemeNode.get_max_width(); - return topMaxWidth >= 0 && topNaturalWidth >= topMaxWidth; - } else { - let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1); - let topMaxHeight = topThemeNode.get_max_height(); - return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight; - } - - } - - isAnimatingOut() { - return this.actor.get_children().reduce(function(result, actor) { - return result || actor.animatingOut; - }, false); - } -}; - -var WindowPreviewMenuItem = class DashToDock_WindowPreviewMenuItem extends PopupMenu.PopupBaseMenuItem { - - constructor(window, params) { - super(params); - - this._window = window; - this._destroyId = 0; - this._windowAddedId = 0; - - // We don't want this: it adds spacing on the left of the item. - this.actor.remove_child(this._ornamentLabel); - this.actor.add_style_class_name('dashtodock-app-well-preview-menu-item'); - - this._cloneBin = new St.Bin(); - this._cloneBin.set_size(PREVIEW_MAX_WIDTH, PREVIEW_MAX_HEIGHT); - - // TODO: improve the way the closebutton is layout. Just use some padding - // for the moment. - this._cloneBin.set_style('padding-bottom: 0.5em'); - - this.closeButton = new St.Button({ style_class: 'window-close', - x_expand: true, - y_expand: true}); - this.closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); - this.closeButton.set_x_align(Clutter.ActorAlign.END); - this.closeButton.set_y_align(Clutter.ActorAlign.START); - - - this.closeButton.opacity = 0; - this.closeButton.connect('clicked', this._closeWindow.bind(this)); - - let overlayGroup = new Clutter.Actor({layout_manager: new Clutter.BinLayout() }); - - overlayGroup.add_actor(this._cloneBin); - overlayGroup.add_actor(this.closeButton); - - let label = new St.Label({ text: window.get_title()}); - label.set_style('max-width: '+PREVIEW_MAX_WIDTH +'px'); - let labelBin = new St.Bin({ child: label, - x_align: St.Align.MIDDLE}); - - this._windowTitleId = this._window.connect('notify::title', () => { - label.set_text(this._window.get_title()); - }); - - let box = new St.BoxLayout({ vertical: true, - reactive:true, - x_expand:true }); - box.add(overlayGroup); - box.add(labelBin); - this.actor.add_actor(box); - - this.actor.connect('enter-event', - this._onEnter.bind(this)); - this.actor.connect('leave-event', - this._onLeave.bind(this)); - this.actor.connect('key-focus-in', - this._onEnter.bind(this)); - this.actor.connect('key-focus-out', - this._onLeave.bind(this)); - - this._cloneTexture(window); - - } - - _cloneTexture(metaWin){ - - let mutterWindow = metaWin.get_compositor_private(); - - // Newly-created windows are added to a workspace before - // the compositor finds out about them... - // Moreover sometimes they return an empty texture, thus as a workarounf also check for it size - if (!mutterWindow || !mutterWindow.get_texture() || !mutterWindow.get_texture().get_size()[0]) { - let id = Mainloop.idle_add(() => { - // Check if there's still a point in getting the texture, - // otherwise this could go on indefinitely - if (this.actor && metaWin.get_workspace()) - this._cloneTexture(metaWin); - return GLib.SOURCE_REMOVE; - }); - GLib.Source.set_name_by_id(id, '[dash-to-dock] this._cloneTexture'); - return; - } - - let windowTexture = mutterWindow.get_texture(); - let [width, height] = windowTexture.get_size(); - - let scale = Math.min(1.0, PREVIEW_MAX_WIDTH/width, PREVIEW_MAX_HEIGHT/height); - - let clone = new Clutter.Clone ({ source: windowTexture, - reactive: true, - width: width * scale, - height: height * scale }); - - // when the source actor is destroyed, i.e. the window closed, first destroy the clone - // and then destroy the menu item (do this animating out) - this._destroyId = mutterWindow.connect('destroy', () => { - clone.destroy(); - this._destroyId = 0; // avoid to try to disconnect this signal from mutterWindow in _onDestroy(), - // as the object was just destroyed - this._animateOutAndDestroy(); - }); - - this._clone = clone; - this._mutterWindow = mutterWindow; - this._cloneBin.set_child(this._clone); - } - - _windowCanClose() { - return this._window.can_close() && - !this._hasAttachedDialogs(); - } - - _closeWindow(actor) { - this._workspace = this._window.get_workspace(); - - // This mechanism is copied from the workspace.js upstream code - // It forces window activation if the windows don't get closed, - // for instance because asking user confirmation, by monitoring the opening of - // such additional confirmation window - this._windowAddedId = this._workspace.connect('window-added', - this._onWindowAdded.bind(this)); - - this.deleteAllWindows(); - } - - deleteAllWindows() { - // Delete all windows, starting from the bottom-most (most-modal) one - //let windows = this._window.get_compositor_private().get_children(); - let windows = this._clone.get_children(); - for (let i = windows.length - 1; i >= 1; i--) { - let realWindow = windows[i].source; - let metaWindow = realWindow.meta_window; - - metaWindow.delete(global.get_current_time()); - } - - this._window.delete(global.get_current_time()); - } - - _onWindowAdded(workspace, win) { - let metaWindow = this._window; - - if (win.get_transient_for() == metaWindow) { - workspace.disconnect(this._windowAddedId); - this._windowAddedId = 0; - - // use an idle handler to avoid mapping problems - - // see comment in Workspace._windowAdded - let id = Mainloop.idle_add(() => { - this.emit('activate'); - return GLib.SOURCE_REMOVE; - }); - GLib.Source.set_name_by_id(id, '[dash-to-dock] this.emit'); - } - } - - _hasAttachedDialogs() { - // count trasient windows - let n=0; - this._window.foreach_transient(function(){n++;}); - return n>0; - } - - _onEnter() { - this._showCloseButton(); - return Clutter.EVENT_PROPAGATE; - } - - _onLeave() { - if (!this._cloneBin.has_pointer && - !this.closeButton.has_pointer) - this._hideCloseButton(); - - return Clutter.EVENT_PROPAGATE; - } - - _idleToggleCloseButton() { - this._idleToggleCloseId = 0; - - if (!this._cloneBin.has_pointer && - !this.closeButton.has_pointer) - this._hideCloseButton(); - - return GLib.SOURCE_REMOVE; - } - - _showCloseButton() { - - if (this._windowCanClose()) { - this.closeButton.show(); - Tweener.addTween(this.closeButton, - { opacity: 255, - time: Workspace.CLOSE_BUTTON_FADE_TIME, - transition: 'easeOutQuad' }); - } - } - - _hideCloseButton() { - Tweener.addTween(this.closeButton, - { opacity: 0, - time: Workspace.CLOSE_BUTTON_FADE_TIME, - transition: 'easeInQuad' }); - } - - show(animate) { - let fullWidth = this.actor.get_width(); - - this.actor.opacity = 0; - this.actor.set_width(0); - - let time = animate ? 0.25 : 0; - Tweener.addTween(this.actor, - { opacity: 255, - width: fullWidth, - time: time, - transition: 'easeInOutQuad' - }); - } - - _animateOutAndDestroy() { - Tweener.addTween(this.actor, - { opacity: 0, - time: 0.25, - }); - - Tweener.addTween(this.actor, - { height: 0, - width: 0, - time: 0.25, - delay: 0.25, - onCompleteScope: this, - onComplete() { - this.actor.destroy(); - } - }); - } - - activate() { - this._getTopMenu().close(); - Main.activateWindow(this._window); - } - - _onDestroy() { - super._onDestroy(); - - if (this._windowAddedId > 0) { - this._workspace.disconnect(this._windowAddedId); - this._windowAddedId = 0; - } - - if (this._destroyId > 0) { - this._mutterWindow.disconnect(this._destroyId); - this._destroyId = 0; - } - - if (this._windowTitleId > 0) { - this._window.disconnect(this._windowTitleId); - this._windowTitleId = 0; - } - } -}; - diff --git a/extensions/desktop-icons/createFolderDialog.js b/extensions/desktop-icons/createFolderDialog.js deleted file mode 100644 index f3e40e9..0000000 --- a/extensions/desktop-icons/createFolderDialog.js +++ /dev/null @@ -1,164 +0,0 @@ -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2019 Andrea Azzaronea - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const { Clutter, GObject, GLib, Gio, St } = imports.gi; - -const Signals = imports.signals; - -const Dialog = imports.ui.dialog; -const Gettext = imports.gettext.domain('desktop-icons'); -const ModalDialog = imports.ui.modalDialog; -const ShellEntry = imports.ui.shellEntry; -const Tweener = imports.ui.tweener; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const DesktopIconsUtil = Me.imports.desktopIconsUtil; -const Extension = Me.imports.extension; - -const _ = Gettext.gettext; - -const DIALOG_GROW_TIME = 0.1; - -var CreateFolderDialog = class extends ModalDialog.ModalDialog { - - constructor() { - super({ styleClass: 'create-folder-dialog' }); - - this._buildLayout(); - } - - _buildLayout() { - let label = new St.Label({ style_class: 'create-folder-dialog-label', - text: _('New folder name') }); - this.contentLayout.add(label, { x_align: St.Align.START }); - - this._entry = new St.Entry({ style_class: 'create-folder-dialog-entry', - can_focus: true }); - this._entry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); - this._entry.clutter_text.connect('text-changed', this._onTextChanged.bind(this)); - ShellEntry.addContextMenu(this._entry); - this.contentLayout.add(this._entry); - this.setInitialKeyFocus(this._entry); - - this._errorBox = new St.BoxLayout({ style_class: 'create-folder-dialog-error-box', - visible: false }); - this.contentLayout.add(this._errorBox, { expand: true }); - - this._errorMessage = new St.Label({ style_class: 'create-folder-dialog-error-label' }); - this._errorMessage.clutter_text.line_wrap = true; - this._errorBox.add(this._errorMessage, { expand: true, - x_align: St.Align.START, - x_fill: false, - y_align: St.Align.MIDDLE, - y_fill: false }); - - this._createButton = this.addButton({ action: this._onCreateButton.bind(this), - label: _('Create') }); - this.addButton({ action: this.close.bind(this), - label: _('Cancel'), - key: Clutter.Escape }); - this._onTextChanged(); - } - - _showError(message) { - this._errorMessage.set_text(message); - - if (!this._errorBox.visible) { - let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1); - let parentActor = this._errorBox.get_parent(); - - Tweener.addTween(parentActor, - { height: parentActor.height + errorBoxNaturalHeight, - time: DIALOG_GROW_TIME, - transition: 'easeOutQuad', - onComplete: () => { - parentActor.set_height(-1); - this._errorBox.show(); - } - }); - } - } - - _hideError() { - if (this._errorBox.visible) { - let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1); - let parentActor = this._errorBox.get_parent(); - - Tweener.addTween(parentActor, - { height: parentActor.height - errorBoxNaturalHeight, - time: DIALOG_GROW_TIME, - transition: 'easeOutQuad', - onComplete: () => { - parentActor.set_height(-1); - this._errorBox.hide(); - this._errorMessage.set_text(''); - } - }); - } - } - - _onCreateButton() { - this._onEntryActivate(); - } - - _onEntryActivate() { - if (!this._createButton.reactive) - return; - - this.emit('response', this._entry.get_text()); - this.close(); - } - - _onTextChanged() { - let text = this._entry.get_text(); - let is_valid = true; - - let found_name = false; - for(let name of Extension.desktopManager.getDesktopFileNames()) { - if (name === text) { - found_name = true; - break; - } - } - - if (text.trim().length == 0) { - is_valid = false; - this._hideError(); - } else if (text.includes('/')) { - is_valid = false; - this._showError(_('Folder names cannot contain “/”.')); - } else if (text === '.') { - is_valid = false; - this._showError(_('A folder cannot be called “.”.')); - } else if (text === '..') { - is_valid = false; - this._showError(_('A folder cannot be called “..”.')); - } else if (text.startsWith('.')) { - this._showError(_('Folders with “.” at the beginning of their name are hidden.')); - } else if (found_name) { - this._showError(_('There is already a file or folder with that name.')); - is_valid = false; - } else { - this._hideError(); - } - - this._createButton.reactive = is_valid; - } -}; -Signals.addSignalMethods(CreateFolderDialog.prototype); diff --git a/extensions/desktop-icons/createThumbnail.js b/extensions/desktop-icons/createThumbnail.js deleted file mode 100755 index 212f6b7..0000000 --- a/extensions/desktop-icons/createThumbnail.js +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/gjs - -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2018 Sergio Costas - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const GnomeDesktop = imports.gi.GnomeDesktop; -const Gio = imports.gi.Gio; - -let thumbnailFactory = GnomeDesktop.DesktopThumbnailFactory.new(GnomeDesktop.DesktopThumbnailSize.LARGE); - -let file = Gio.File.new_for_path(ARGV[0]); -let fileUri = file.get_uri(); - -let fileInfo = file.query_info('standard::content-type,time::modified', Gio.FileQueryInfoFlags.NONE, null); -let modifiedTime = fileInfo.get_attribute_uint64('time::modified'); -let thumbnailPixbuf = thumbnailFactory.generate_thumbnail(fileUri, fileInfo.get_content_type()); -if (thumbnailPixbuf == null) - thumbnailFactory.create_failed_thumbnail(fileUri, modifiedTime); -else - thumbnailFactory.save_thumbnail(thumbnailPixbuf, fileUri, modifiedTime); diff --git a/extensions/desktop-icons/dbusUtils.js b/extensions/desktop-icons/dbusUtils.js deleted file mode 100644 index 19fe987..0000000 --- a/extensions/desktop-icons/dbusUtils.js +++ /dev/null @@ -1,103 +0,0 @@ -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -var NautilusFileOperationsProxy; -var FreeDesktopFileManagerProxy; - -const NautilusFileOperationsInterface = ` - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; - -const NautilusFileOperationsProxyInterface = Gio.DBusProxy.makeProxyWrapper(NautilusFileOperationsInterface); - -const FreeDesktopFileManagerInterface = ` - - - - - - - - - - -`; - -const FreeDesktopFileManagerProxyInterface = Gio.DBusProxy.makeProxyWrapper(FreeDesktopFileManagerInterface); - -function init() { - NautilusFileOperationsProxy = new NautilusFileOperationsProxyInterface( - Gio.DBus.session, - 'org.gnome.Nautilus', - '/org/gnome/Nautilus', - (proxy, error) => { - if (error) { - log('Error connecting to Nautilus'); - } - } - ); - - FreeDesktopFileManagerProxy = new FreeDesktopFileManagerProxyInterface( - Gio.DBus.session, - 'org.freedesktop.FileManager1', - '/org/freedesktop/FileManager1', - (proxy, error) => { - if (error) { - log('Error connecting to Nautilus'); - } - } - ); -} - -function openFileWithOtherApplication(filePath) { - let fdList = new Gio.UnixFDList(); - let channel = GLib.IOChannel.new_file(filePath, "r"); - fdList.append(channel.unix_get_fd()); - channel.set_close_on_unref(true); - let builder = GLib.VariantBuilder.new(GLib.VariantType.new("a{sv}")); - let options = builder.end(); - let parameters = GLib.Variant.new_tuple([GLib.Variant.new_string("0"), - GLib.Variant.new_handle(0), - options]); - Gio.bus_get(Gio.BusType.SESSION, null, - (source, result) => { - let dbus_connection = Gio.bus_get_finish(result); - dbus_connection.call_with_unix_fd_list("org.freedesktop.portal.Desktop", - "/org/freedesktop/portal/desktop", - "org.freedesktop.portal.OpenURI", - "OpenFile", - parameters, - GLib.VariantType.new("o"), - Gio.DBusCallFlags.NONE, - -1, - fdList, - null, - null); - } - ); -} diff --git a/extensions/desktop-icons/desktopGrid.js b/extensions/desktop-icons/desktopGrid.js deleted file mode 100644 index a2d1f12..0000000 --- a/extensions/desktop-icons/desktopGrid.js +++ /dev/null @@ -1,692 +0,0 @@ -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2017 Carlos Soriano - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const Gtk = imports.gi.Gtk; -const Clutter = imports.gi.Clutter; -const St = imports.gi.St; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const Shell = imports.gi.Shell; - -const Signals = imports.signals; - -const Layout = imports.ui.layout; -const Main = imports.ui.main; -const BoxPointer = imports.ui.boxpointer; -const PopupMenu = imports.ui.popupMenu; -const GrabHelper = imports.ui.grabHelper; -const Config = imports.misc.config; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const CreateFolderDialog = Me.imports.createFolderDialog; -const Extension = Me.imports.extension; -const FileItem = Me.imports.fileItem; -const Prefs = Me.imports.prefs; -const DBusUtils = Me.imports.dbusUtils; -const DesktopIconsUtil = Me.imports.desktopIconsUtil; -const Util = imports.misc.util; - -const Clipboard = St.Clipboard.get_default(); -const CLIPBOARD_TYPE = St.ClipboardType.CLIPBOARD; -const Gettext = imports.gettext.domain('desktop-icons'); - -const _ = Gettext.gettext; - - -/* From NautilusFileUndoManagerState */ -var UndoStatus = { - NONE: 0, - UNDO: 1, - REDO: 2, -}; - -var StoredCoordinates = { - PRESERVE: 0, - OVERWRITE:1, - ASSIGN:2, -}; - -class Placeholder extends St.Bin { - constructor() { - super(); - } -} - -var DesktopGrid = class { - - constructor(bgManager) { - this._bgManager = bgManager; - - this._fileItemHandlers = new Map(); - this._fileItems = []; - - this.layout = new Clutter.GridLayout({ - orientation: Clutter.Orientation.VERTICAL, - column_homogeneous: true, - row_homogeneous: true - }); - - this._actorLayout = new Clutter.BinLayout({ - x_align: Clutter.BinAlignment.FIXED, - y_align: Clutter.BinAlignment.FIXED - }); - - this.actor = new St.Widget({ - layout_manager: this._actorLayout - }); - this.actor._delegate = this; - - this._grid = new St.Widget({ - name: 'DesktopGrid', - layout_manager: this.layout, - reactive: true, - x_expand: true, - y_expand: true, - can_focus: true, - opacity: 255 - }); - this.actor.add_child(this._grid); - - this._renamePopup = new RenamePopup(this); - this.actor.add_child(this._renamePopup.actor); - - this._bgManager._container.add_child(this.actor); - - this.actor.connect('destroy', () => this._onDestroy()); - - let monitorIndex = bgManager._monitorIndex; - this._monitorConstraint = new Layout.MonitorConstraint({ - index: monitorIndex, - work_area: true - }); - this.actor.add_constraint(this._monitorConstraint); - - this._addDesktopBackgroundMenu(); - - this._bgDestroyedId = bgManager.backgroundActor.connect('destroy', - () => this._backgroundDestroyed()); - - this._grid.connect('button-press-event', (actor, event) => this._onPressButton(actor, event)); - - this._grid.connect('key-press-event', this._onKeyPress.bind(this)); - - this._grid.connect('allocation-changed', () => Extension.desktopManager.scheduleReLayoutChildren()); - } - - _onKeyPress(actor, event) { - if (global.stage.get_key_focus() != actor) - return Clutter.EVENT_PROPAGATE; - - let symbol = event.get_key_symbol(); - let isCtrl = (event.get_state() & Clutter.ModifierType.CONTROL_MASK) != 0; - let isShift = (event.get_state() & Clutter.ModifierType.SHIFT_MASK) != 0; - if (isCtrl && isShift && [Clutter.Z, Clutter.z].indexOf(symbol) > -1) { - this._doRedo(); - return Clutter.EVENT_STOP; - } - else if (isCtrl && [Clutter.Z, Clutter.z].indexOf(symbol) > -1) { - this._doUndo(); - return Clutter.EVENT_STOP; - } - else if (isCtrl && [Clutter.C, Clutter.c].indexOf(symbol) > -1) { - Extension.desktopManager.doCopy(); - return Clutter.EVENT_STOP; - } - else if (isCtrl && [Clutter.X, Clutter.x].indexOf(symbol) > -1) { - Extension.desktopManager.doCut(); - return Clutter.EVENT_STOP; - } - else if (isCtrl && [Clutter.V, Clutter.v].indexOf(symbol) > -1) { - this._doPaste(); - return Clutter.EVENT_STOP; - } - else if (symbol == Clutter.Return) { - Extension.desktopManager.doOpen(); - return Clutter.EVENT_STOP; - } - else if (symbol == Clutter.Delete) { - Extension.desktopManager.doTrash(); - return Clutter.EVENT_STOP; - } else if (symbol == Clutter.F2) { - // Support renaming other grids file items. - Extension.desktopManager.doRename(); - return Clutter.EVENT_STOP; - } - - return Clutter.EVENT_PROPAGATE; - } - - _backgroundDestroyed() { - this._bgDestroyedId = 0; - if (this._bgManager == null) - return; - - if (this._bgManager._backgroundSource) { - this._bgDestroyedId = this._bgManager.backgroundActor.connect('destroy', - () => this._backgroundDestroyed()); - } else { - this.actor.destroy(); - } - } - - _onDestroy() { - if (this._bgDestroyedId && this._bgManager.backgroundActor != null) - this._bgManager.backgroundActor.disconnect(this._bgDestroyedId); - this._bgDestroyedId = 0; - this._bgManager = null; - } - - _onNewFolderClicked() { - - let dialog = new CreateFolderDialog.CreateFolderDialog(); - - dialog.connect('response', (dialog, name) => { - let dir = DesktopIconsUtil.getDesktopDir().get_child(name); - DBusUtils.NautilusFileOperationsProxy.CreateFolderRemote(dir.get_uri(), - (result, error) => { - if (error) - throw new Error('Error creating new folder: ' + error.message); - } - ); - }); - - dialog.open(); - } - - _parseClipboardText(text) { - if (text === null) - return [false, false, null]; - - let lines = text.split('\n'); - let [mime, action, ...files] = lines; - - if (mime != 'x-special/nautilus-clipboard') - return [false, false, null]; - - if (!(['copy', 'cut'].includes(action))) - return [false, false, null]; - let isCut = action == 'cut'; - - /* Last line is empty due to the split */ - if (files.length <= 1) - return [false, false, null]; - /* Remove last line */ - files.pop(); - - return [true, isCut, files]; - } - - _doPaste() { - Clipboard.get_text(CLIPBOARD_TYPE, - (clipboard, text) => { - let [valid, is_cut, files] = this._parseClipboardText(text); - if (!valid) - return; - - let desktopDir = `${DesktopIconsUtil.getDesktopDir().get_uri()}`; - if (is_cut) { - DBusUtils.NautilusFileOperationsProxy.MoveURIsRemote(files, desktopDir, - (result, error) => { - if (error) - throw new Error('Error moving files: ' + error.message); - } - ); - } else { - DBusUtils.NautilusFileOperationsProxy.CopyURIsRemote(files, desktopDir, - (result, error) => { - if (error) - throw new Error('Error copying files: ' + error.message); - } - ); - } - } - ); - } - - _onPasteClicked() { - this._doPaste(); - } - - _doUndo() { - DBusUtils.NautilusFileOperationsProxy.UndoRemote( - (result, error) => { - if (error) - throw new Error('Error performing undo: ' + error.message); - } - ); - } - - _onUndoClicked() { - this._doUndo(); - } - - _doRedo() { - DBusUtils.NautilusFileOperationsProxy.RedoRemote( - (result, error) => { - if (error) - throw new Error('Error performing redo: ' + error.message); - } - ); - } - - _onRedoClicked() { - this._doRedo(); - } - - _onOpenDesktopInFilesClicked() { - Gio.AppInfo.launch_default_for_uri_async(DesktopIconsUtil.getDesktopDir().get_uri(), - null, null, - (source, result) => { - try { - Gio.AppInfo.launch_default_for_uri_finish(result); - } catch (e) { - log('Error opening Desktop in Files: ' + e.message); - } - } - ); - } - - _onOpenTerminalClicked() { - let desktopPath = DesktopIconsUtil.getDesktopDir().get_path(); - DesktopIconsUtil.launchTerminal(desktopPath); - } - - _syncUndoRedo() { - this._undoMenuItem.actor.visible = DBusUtils.NautilusFileOperationsProxy.UndoStatus == UndoStatus.UNDO; - this._redoMenuItem.actor.visible = DBusUtils.NautilusFileOperationsProxy.UndoStatus == UndoStatus.REDO; - } - - _undoStatusChanged(proxy, properties, test) { - if ('UndoStatus' in properties.deep_unpack()) - this._syncUndoRedo(); - } - - _createDesktopBackgroundMenu() { - let menu = new PopupMenu.PopupMenu(Main.layoutManager.dummyCursor, - 0, St.Side.TOP); - menu.addAction(_("New Folder"), () => this._onNewFolderClicked()); - menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this._pasteMenuItem = menu.addAction(_("Paste"), () => this._onPasteClicked()); - this._undoMenuItem = menu.addAction(_("Undo"), () => this._onUndoClicked()); - this._redoMenuItem = menu.addAction(_("Redo"), () => this._onRedoClicked()); - menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - menu.addAction(_("Show Desktop in Files"), () => this._onOpenDesktopInFilesClicked()); - menu.addAction(_("Open in Terminal"), () => this._onOpenTerminalClicked()); - menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - menu.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop'); - menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - menu.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop'); - menu.addSettingsAction(_("Settings"), 'gnome-control-center.desktop'); - - menu.actor.add_style_class_name('background-menu'); - - Main.layoutManager.uiGroup.add_child(menu.actor); - menu.actor.hide(); - - menu._propertiesChangedId = DBusUtils.NautilusFileOperationsProxy.connect('g-properties-changed', - this._undoStatusChanged.bind(this)); - this._syncUndoRedo(); - - menu.connect('destroy', - () => DBusUtils.NautilusFileOperationsProxy.disconnect(menu._propertiesChangedId)); - menu.connect('open-state-changed', - (popupm, isOpen) => { - if (isOpen) { - Clipboard.get_text(CLIPBOARD_TYPE, - (clipBoard, text) => { - let [valid, is_cut, files] = this._parseClipboardText(text); - this._pasteMenuItem.setSensitive(valid); - } - ); - } - } - ); - this._pasteMenuItem.setSensitive(false); - - return menu; - } - - _openMenu(x, y) { - Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0); - this.actor._desktopBackgroundMenu.open(BoxPointer.PopupAnimation.NONE); - /* Since the handler is in the press event it needs to ignore the release event - * to not immediately close the menu on release - */ - this.actor._desktopBackgroundManager.ignoreRelease(); - } - - _addFileItemTo(fileItem, column, row, coordinatesAction) { - let placeholder = this.layout.get_child_at(column, row); - placeholder.child = fileItem.actor; - this._fileItems.push(fileItem); - let selectedId = fileItem.connect('selected', this._onFileItemSelected.bind(this)); - let renameId = fileItem.connect('rename-clicked', this.doRename.bind(this)); - this._fileItemHandlers.set(fileItem, [selectedId, renameId]); - - /* If this file is new in the Desktop and hasn't yet - * fixed coordinates, store the new possition to ensure - * that the next time it will be shown in the same possition. - * Also store the new possition if it has been moved by the user, - * and not triggered by a screen change. - */ - if ((fileItem.savedCoordinates == null) || (coordinatesAction == StoredCoordinates.OVERWRITE)) { - let [fileX, fileY] = placeholder.get_transformed_position(); - fileItem.savedCoordinates = [Math.round(fileX), Math.round(fileY)]; - } - } - - addFileItemCloseTo(fileItem, x, y, coordinatesAction) { - let [column, row] = this._getEmptyPlaceClosestTo(x, y, coordinatesAction); - this._addFileItemTo(fileItem, column, row, coordinatesAction); - } - - _getEmptyPlaceClosestTo(x, y, coordinatesAction) { - let maxColumns = this._getMaxColumns(); - let maxRows = this._getMaxRows(); - - let [actorX, actorY] = this._grid.get_transformed_position(); - let actorWidth = this._grid.allocation.x2 - this._grid.allocation.x1; - let actorHeight = this._grid.allocation.y2 - this._grid.allocation.y1; - let placeX = Math.round((x - actorX) * maxColumns / actorWidth); - let placeY = Math.round((y - actorY) * maxRows / actorHeight); - - placeX = DesktopIconsUtil.clamp(placeX, 0, maxColumns - 1); - placeY = DesktopIconsUtil.clamp(placeY, 0, maxRows - 1); - if (this.layout.get_child_at(placeX, placeY).child == null) - return [placeX, placeY]; - let found = false; - let resColumn = null; - let resRow = null; - let minDistance = Infinity; - for (let column = 0; column < maxColumns; column++) { - for (let row = 0; row < maxRows; row++) { - let placeholder = this.layout.get_child_at(column, row); - if (placeholder.child != null) - continue; - - let [proposedX, proposedY] = placeholder.get_transformed_position(); - if (coordinatesAction == StoredCoordinates.ASSIGN) - return [column, row]; - let distance = DesktopIconsUtil.distanceBetweenPoints(proposedX, proposedY, x, y); - if (distance < minDistance) { - found = true; - minDistance = distance; - resColumn = column; - resRow = row; - } - } - } - - if (!found) - throw new Error(`Not enough place at monitor ${this._bgManager._monitorIndex}`); - - return [resColumn, resRow]; - } - - removeFileItem(fileItem) { - let index = this._fileItems.indexOf(fileItem); - if (index > -1) - this._fileItems.splice(index, 1); - else - throw new Error('Error removing children from container'); - - let [column, row] = this._getPosOfFileItem(fileItem); - let placeholder = this.layout.get_child_at(column, row); - placeholder.child = null; - let [selectedId, renameId] = this._fileItemHandlers.get(fileItem); - fileItem.disconnect(selectedId); - fileItem.disconnect(renameId); - this._fileItemHandlers.delete(fileItem); - } - - _fillPlaceholders() { - for (let column = 0; column < this._getMaxColumns(); column++) { - for (let row = 0; row < this._getMaxRows(); row++) { - this.layout.attach(new Placeholder(), column, row, 1, 1); - } - } - } - - reset() { - let tmpFileItemsCopy = this._fileItems.slice(); - for (let fileItem of tmpFileItemsCopy) - this.removeFileItem(fileItem); - this._grid.remove_all_children(); - - this._fillPlaceholders(); - } - - _onStageMotion(actor, event) { - if (this._drawingRubberBand) { - let [x, y] = event.get_coords(); - this._updateRubberBand(x, y); - this._selectFromRubberband(x, y); - } - return Clutter.EVENT_PROPAGATE; - } - - _onPressButton(actor, event) { - let button = event.get_button(); - let [x, y] = event.get_coords(); - - this._grid.grab_key_focus(); - - if (button == 1) { - let shiftPressed = !!(event.get_state() & Clutter.ModifierType.SHIFT_MASK); - let controlPressed = !!(event.get_state() & Clutter.ModifierType.CONTROL_MASK); - if (!shiftPressed && !controlPressed) - Extension.desktopManager.clearSelection(); - let [gridX, gridY] = this._grid.get_transformed_position(); - Extension.desktopManager.startRubberBand(x, y, gridX, gridY); - return Clutter.EVENT_STOP; - } - - if (button == 3) { - this._openMenu(x, y); - - return Clutter.EVENT_STOP; - } - - return Clutter.EVENT_PROPAGATE; - } - - _addDesktopBackgroundMenu() { - this.actor._desktopBackgroundMenu = this._createDesktopBackgroundMenu(); - this.actor._desktopBackgroundManager = new PopupMenu.PopupMenuManager({ actor: this.actor }); - this.actor._desktopBackgroundManager.addMenu(this.actor._desktopBackgroundMenu); - - this.actor.connect('destroy', () => { - this.actor._desktopBackgroundMenu.destroy(); - this.actor._desktopBackgroundMenu = null; - this.actor._desktopBackgroundManager = null; - }); - } - - _getMaxColumns() { - let gridWidth = this._grid.allocation.x2 - this._grid.allocation.x1; - return Math.floor(gridWidth / Prefs.get_desired_width(St.ThemeContext.get_for_stage(global.stage).scale_factor)); - } - - _getMaxRows() { - let gridHeight = this._grid.allocation.y2 - this._grid.allocation.y1; - return Math.floor(gridHeight / Prefs.get_desired_height(St.ThemeContext.get_for_stage(global.stage).scale_factor)); - } - - acceptDrop(source, actor, x, y, time) { - /* Coordinates are relative to the grid, we want to transform them to - * absolute coordinates to work across monitors */ - let [gridX, gridY] = this.actor.get_transformed_position(); - let [absoluteX, absoluteY] = [x + gridX, y + gridY]; - return Extension.desktopManager.acceptDrop(absoluteX, absoluteY); - } - - _getPosOfFileItem(itemToFind) { - if (itemToFind == null) - throw new Error('Error at _getPosOfFileItem: child cannot be null'); - - let found = false; - let maxColumns = this._getMaxColumns(); - let maxRows = this._getMaxRows(); - let column = 0; - let row = 0; - for (column = 0; column < maxColumns; column++) { - for (row = 0; row < maxRows; row++) { - let item = this.layout.get_child_at(column, row); - if (item.child && item.child._delegate.file.equal(itemToFind.file)) { - found = true; - break; - } - } - - if (found) - break; - } - - if (!found) - throw new Error('Position of file item was not found'); - - return [column, row]; - } - - _onFileItemSelected(fileItem, keepCurrentSelection, addToSelection) { - this._grid.grab_key_focus(); - } - - doRename(fileItem) { - this._renamePopup.onFileItemRenameClicked(fileItem); - } -}; - -var RenamePopup = class { - - constructor(grid) { - this._source = null; - this._isOpen = false; - - this._renameEntry = new St.Entry({ hint_text: _("Enter file name…"), - can_focus: true, - x_expand: true }); - this._renameEntry.clutter_text.connect('activate', this._onRenameAccepted.bind(this)); - this._renameOkButton= new St.Button({ label: _("OK"), - style_class: 'app-view-control button', - button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, - reactive: true, - can_focus: true, - x_expand: true }); - this._renameCancelButton = new St.Button({ label: _("Cancel"), - style_class: 'app-view-control button', - button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, - reactive: true, - can_focus: true, - x_expand: true }); - this._renameCancelButton.connect('clicked', () => { this._onRenameCanceled(); }); - this._renameOkButton.connect('clicked', () => { this._onRenameAccepted(); }); - let renameButtonsBoxLayout = new Clutter.BoxLayout({ homogeneous: true }); - let renameButtonsBox = new St.Widget({ layout_manager: renameButtonsBoxLayout, - x_expand: true }); - renameButtonsBox.add_child(this._renameCancelButton); - renameButtonsBox.add_child(this._renameOkButton); - - let renameContentLayout = new Clutter.BoxLayout({ spacing: 6, - orientation: Clutter.Orientation.VERTICAL }); - let renameContent = new St.Widget({ style_class: 'rename-popup', - layout_manager: renameContentLayout, - x_expand: true }); - renameContent.add_child(this._renameEntry); - renameContent.add_child(renameButtonsBox); - - this._boxPointer = new BoxPointer.BoxPointer(St.Side.TOP, { can_focus: false, x_expand: false }); - this.actor = this._boxPointer.actor; - this.actor.style_class = 'popup-menu-boxpointer'; - this.actor.add_style_class_name('popup-menu'); - this.actor.visible = false; - this._boxPointer.bin.set_child(renameContent); - - this._grabHelper = new GrabHelper.GrabHelper(grid.actor, { actionMode: Shell.ActionMode.POPUP }); - this._grabHelper.addActor(this.actor); - } - - _popup() { - if (this._isOpen) - return; - - this._isOpen = this._grabHelper.grab({ actor: this.actor, - onUngrab: this._popdown.bind(this) }); - - if (!this._isOpen) { - this._grabHelper.ungrab({ actor: this.actor }); - return; - } - - this._boxPointer.setPosition(this._source.actor, 0.5); - if (ExtensionUtils.versionCheck(['3.28', '3.30'], Config.PACKAGE_VERSION)) - this._boxPointer.show(BoxPointer.PopupAnimation.FADE | - BoxPointer.PopupAnimation.SLIDE); - else - this._boxPointer.open(BoxPointer.PopupAnimation.FADE | - BoxPointer.PopupAnimation.SLIDE); - - this.emit('open-state-changed', true); - } - - _popdown() { - if (!this._isOpen) - return; - - this._grabHelper.ungrab({ actor: this.actor }); - - if (ExtensionUtils.versionCheck(['3.28', '3.30'], Config.PACKAGE_VERSION)) - this._boxPointer.hide(BoxPointer.PopupAnimation.FADE | - BoxPointer.PopupAnimation.SLIDE); - else - this._boxPointer.close(BoxPointer.PopupAnimation.FADE | - BoxPointer.PopupAnimation.SLIDE); - - this._isOpen = false; - this.emit('open-state-changed', false); - } - - onFileItemRenameClicked(fileItem) { - this._source = fileItem; - - this._renameEntry.text = fileItem.displayName; - - this._popup(); - this._renameEntry.grab_key_focus(); - this._renameEntry.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); - let extensionOffset = DesktopIconsUtil.getFileExtensionOffset(fileItem.displayName, fileItem.isDirectory); - this._renameEntry.clutter_text.set_selection(0, extensionOffset); - } - - _onRenameAccepted() { - this._popdown(); - DBusUtils.NautilusFileOperationsProxy.RenameFileRemote(this._source.file.get_uri(), - this._renameEntry.get_text(), - (result, error) => { - if (error) - throw new Error('Error renaming file: ' + error.message); - } - ); - } - - _onRenameCanceled() { - this._popdown(); - } -}; -Signals.addSignalMethods(RenamePopup.prototype); diff --git a/extensions/desktop-icons/desktopIconsUtil.js b/extensions/desktop-icons/desktopIconsUtil.js deleted file mode 100644 index 0aea654..0000000 --- a/extensions/desktop-icons/desktopIconsUtil.js +++ /dev/null @@ -1,123 +0,0 @@ -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2017 Carlos Soriano - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const Gtk = imports.gi.Gtk; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Prefs = Me.imports.prefs; - -const TERMINAL_SCHEMA = 'org.gnome.desktop.default-applications.terminal'; -const EXEC_KEY = 'exec'; - -var DEFAULT_ATTRIBUTES = 'metadata::*,standard::*,access::*,time::modified,unix::mode'; - -function getDesktopDir() { - let desktopPath = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP); - return Gio.File.new_for_commandline_arg(desktopPath); -} - -function clamp(value, min, max) { - return Math.max(Math.min(value, max), min); -}; - -function launchTerminal(workdir) { - let terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA }); - let exec = terminalSettings.get_string(EXEC_KEY); - let argv = [exec, `--working-directory=${workdir}`]; - - /* The following code has been extracted from GNOME Shell's - * source code in Misc.Util.trySpawn function and modified to - * set the working directory. - * - * https://gitlab.gnome.org/GNOME/gnome-shell/blob/gnome-3-30/js/misc/util.js - */ - - var success, pid; - try { - [success, pid] = GLib.spawn_async(workdir, argv, null, - GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, - null); - } catch (err) { - /* Rewrite the error in case of ENOENT */ - if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) { - throw new GLib.SpawnError({ code: GLib.SpawnError.NOENT, - message: _("Command not found") }); - } else if (err instanceof GLib.Error) { - // The exception from gjs contains an error string like: - // Error invoking GLib.spawn_command_line_async: Failed to - // execute child process "foo" (No such file or directory) - // We are only interested in the part in the parentheses. (And - // we can't pattern match the text, since it gets localized.) - let message = err.message.replace(/.*\((.+)\)/, '$1'); - throw new (err.constructor)({ code: err.code, - message: message }); - } else { - throw err; - } - } - // Dummy child watch; we don't want to double-fork internally - // because then we lose the parent-child relationship, which - // can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275 - GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, () => {}); -} - -function distanceBetweenPoints(x, y, x2, y2) { - return (Math.pow(x - x2, 2) + Math.pow(y - y2, 2)); -} - -function getExtraFolders() { - let extraFolders = new Array(); - if (Prefs.settings.get_boolean('show-home')) { - extraFolders.push([Gio.File.new_for_commandline_arg(GLib.get_home_dir()), Prefs.FileType.USER_DIRECTORY_HOME]); - } - if (Prefs.settings.get_boolean('show-trash')) { - extraFolders.push([Gio.File.new_for_uri('trash:///'), Prefs.FileType.USER_DIRECTORY_TRASH]); - } - return extraFolders; -} - -function getFileExtensionOffset(filename, isDirectory) { - let offset = filename.length; - - if (!isDirectory) { - let doubleExtensions = ['.gz', '.bz2', '.sit', '.Z', '.bz', '.xz']; - for (let extension of doubleExtensions) { - if (filename.endsWith(extension)) { - offset -= extension.length; - filename = filename.substring(0, offset); - break; - } - } - let lastDot = filename.lastIndexOf('.'); - if (lastDot > 0) - offset = lastDot; - } - return offset; -} - -function getGtkClassBackgroundColor(classname, state) { - let widget = new Gtk.WidgetPath(); - widget.append_type(Gtk.Widget); - - let context = new Gtk.StyleContext(); - context.set_path(widget); - context.add_class(classname); - return context.get_background_color(state); -} diff --git a/extensions/desktop-icons/desktopManager.js b/extensions/desktop-icons/desktopManager.js deleted file mode 100644 index d8f548f..0000000 --- a/extensions/desktop-icons/desktopManager.js +++ /dev/null @@ -1,752 +0,0 @@ -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2017 Carlos Soriano - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const Gtk = imports.gi.Gtk; -const Clutter = imports.gi.Clutter; -const GObject = imports.gi.GObject; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const St = imports.gi.St; -const Mainloop = imports.mainloop; -const Meta = imports.gi.Meta; - -const Animation = imports.ui.animation; -const Background = imports.ui.background; -const DND = imports.ui.dnd; -const Main = imports.ui.main; -const GrabHelper = imports.ui.grabHelper; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Extension = Me.imports.extension; -const DesktopGrid = Me.imports.desktopGrid; -const FileItem = Me.imports.fileItem; -const Prefs = Me.imports.prefs; -const DBusUtils = Me.imports.dbusUtils; -const DesktopIconsUtil = Me.imports.desktopIconsUtil; - -const Clipboard = St.Clipboard.get_default(); -const CLIPBOARD_TYPE = St.ClipboardType.CLIPBOARD; - -var S_IWOTH = 0x00002; - -function getDpy() { - return global.screen || global.display; -} - -function findMonitorIndexForPos(x, y) { - return getDpy().get_monitor_index_for_rect(new Meta.Rectangle({x, y})); -} - - -var DesktopManager = GObject.registerClass({ - Properties: { - 'writable-by-others': GObject.ParamSpec.boolean( - 'writable-by-others', - 'WritableByOthers', - 'Whether the desktop\'s directory can be written by others (o+w unix permission)', - GObject.ParamFlags.READABLE, - false - ) - } -}, class DesktopManager extends GObject.Object { - _init(params) { - super._init(params); - - this._layoutChildrenId = 0; - this._deleteChildrenId = 0; - this._monitorDesktopDir = null; - this._desktopMonitorCancellable = null; - this._desktopGrids = {}; - this._fileItemHandlers = new Map(); - this._fileItems = new Map(); - this._dragCancelled = false; - this._queryFileInfoCancellable = null; - this._unixMode = null; - this._writableByOthers = null; - - this._monitorsChangedId = Main.layoutManager.connect('monitors-changed', () => this._recreateDesktopIcons()); - this._rubberBand = new St.Widget({ style_class: 'rubber-band' }); - this._rubberBand.hide(); - Main.layoutManager._backgroundGroup.add_child(this._rubberBand); - this._grabHelper = new GrabHelper.GrabHelper(global.stage); - - this._addDesktopIcons(); - this._monitorDesktopFolder(); - - this.settingsId = Prefs.settings.connect('changed', () => this._recreateDesktopIcons()); - this.gtkSettingsId = Prefs.gtkSettings.connect('changed', (obj, key) => { - if (key == 'show-hidden') - this._recreateDesktopIcons(); - }); - - this._selection = new Set(); - this._currentSelection = new Set(); - this._inDrag = false; - this._dragXStart = Number.POSITIVE_INFINITY; - this._dragYStart = Number.POSITIVE_INFINITY; - } - - startRubberBand(x, y) { - this._rubberBandInitialX = x; - this._rubberBandInitialY = y; - this._initRubberBandColor(); - this._updateRubberBand(x, y); - this._rubberBand.show(); - this._grabHelper.grab({ actor: global.stage }); - Extension.lockActivitiesButton = true; - this._stageReleaseEventId = global.stage.connect('button-release-event', (actor, event) => { - this.endRubberBand(); - }); - this._rubberBandId = global.stage.connect('motion-event', (actor, event) => { - /* In some cases, when the user starts a rubberband selection and ends it - * (by releasing the left button) over a window instead of doing it over - * the desktop, the stage doesn't receive the "button-release" event. - * This happens currently with, at least, Dash to Dock extension, but - * it probably also happens with other applications or extensions. - * To fix this, we also end the rubberband selection if we detect mouse - * motion in the stage without the left button pressed during a - * rubberband selection. - * */ - let button = event.get_state(); - if (!(button & Clutter.ModifierType.BUTTON1_MASK)) { - this.endRubberBand(); - return; - } - [x, y] = event.get_coords(); - this._updateRubberBand(x, y); - let x0, y0, x1, y1; - if (x >= this._rubberBandInitialX) { - x0 = this._rubberBandInitialX; - x1 = x; - } else { - x1 = this._rubberBandInitialX; - x0 = x; - } - if (y >= this._rubberBandInitialY) { - y0 = this._rubberBandInitialY; - y1 = y; - } else { - y1 = this._rubberBandInitialY; - y0 = y; - } - for (let [fileUri, fileItem] of this._fileItems) { - fileItem.emit('selected', true, true, - fileItem.intersectsWith(x0, y0, x1 - x0, y1 - y0)); - } - }); - } - - endRubberBand() { - this._rubberBand.hide(); - Extension.lockActivitiesButton = false; - this._grabHelper.ungrab(); - global.stage.disconnect(this._rubberBandId); - global.stage.disconnect(this._stageReleaseEventId); - this._rubberBandId = 0; - this._stageReleaseEventId = 0; - - this._selection = new Set([...this._selection, ...this._currentSelection]); - this._currentSelection.clear(); - } - - _updateRubberBand(currentX, currentY) { - let x = this._rubberBandInitialX < currentX ? this._rubberBandInitialX - : currentX; - let y = this._rubberBandInitialY < currentY ? this._rubberBandInitialY - : currentY; - let width = Math.abs(this._rubberBandInitialX - currentX); - let height = Math.abs(this._rubberBandInitialY - currentY); - /* TODO: Convert to gobject.set for 3.30 */ - this._rubberBand.set_position(x, y); - this._rubberBand.set_size(width, height); - } - - _recreateDesktopIcons() { - this._destroyDesktopIcons(); - this._addDesktopIcons(); - } - - _addDesktopIcons() { - forEachBackgroundManager(bgManager => { - let newGrid = new DesktopGrid.DesktopGrid(bgManager); - newGrid.actor.connect('destroy', (actor) => { - // if a grid loses its actor, remove it from the grid list - for (let grid in this._desktopGrids) - if (this._desktopGrids[grid].actor == actor) { - delete this._desktopGrids[grid]; - break; - } - }); - this._desktopGrids[bgManager._monitorIndex] = newGrid; - }); - - this._scanFiles(); - } - - _destroyDesktopIcons() { - Object.values(this._desktopGrids).forEach(grid => grid.actor.destroy()); - this._desktopGrids = {}; - } - - /** - * Initialize rubberband color from the GTK rubberband class - * */ - _initRubberBandColor() { - let rgba = DesktopIconsUtil.getGtkClassBackgroundColor('rubberband', Gtk.StateFlags.NORMAL); - let background_color = - 'rgba(' + rgba.red * 255 + ', ' + rgba.green * 255 + ', ' + rgba.blue * 255 + ', 0.4)'; - this._rubberBand.set_style('background-color: ' + background_color); - } - - async _scanFiles() { - for (let [fileItem, id] of this._fileItemHandlers) - fileItem.disconnect(id); - this._fileItemHandlers = new Map(); - - if (!this._unixMode) { - let desktopDir = DesktopIconsUtil.getDesktopDir(); - let fileInfo = desktopDir.query_info(Gio.FILE_ATTRIBUTE_UNIX_MODE, - Gio.FileQueryInfoFlags.NONE, - null); - this._unixMode = fileInfo.get_attribute_uint32(Gio.FILE_ATTRIBUTE_UNIX_MODE); - this._setWritableByOthers((this._unixMode & S_IWOTH) != 0); - } - - try { - let tmpFileItems = new Map(); - for (let [file, info, extra] of await this._enumerateDesktop()) { - let fileItem = new FileItem.FileItem(file, info, extra); - tmpFileItems.set(fileItem.file.get_uri(), fileItem); - let id = fileItem.connect('selected', - this._onFileItemSelected.bind(this)); - - this._fileItemHandlers.set(fileItem, id); - } - this._fileItems = tmpFileItems; - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - log(`Error loading desktop files ${e.message}`); - return; - } - - this.scheduleReLayoutChildren(); - } - - getDesktopFileNames () { - let fileList = []; - for (let [uri, item] of this._fileItems) { - fileList.push(item.fileName); - } - return fileList; - } - - _enumerateDesktop() { - return new Promise((resolve, reject) => { - if (this._desktopEnumerateCancellable) - this._desktopEnumerateCancellable.cancel(); - - this._desktopEnumerateCancellable = new Gio.Cancellable(); - - let desktopDir = DesktopIconsUtil.getDesktopDir(); - desktopDir.enumerate_children_async(DesktopIconsUtil.DEFAULT_ATTRIBUTES, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, - this._desktopEnumerateCancellable, - (source, result) => { - try { - let fileEnum = source.enumerate_children_finish(result); - let resultGenerator = function *() { - let info; - for (let [newFolder, extras] of DesktopIconsUtil.getExtraFolders()) { - yield [newFolder, newFolder.query_info(DesktopIconsUtil.DEFAULT_ATTRIBUTES, Gio.FileQueryInfoFlags.NONE, this._desktopEnumerateCancellable), extras]; - } - while ((info = fileEnum.next_file(null))) - yield [fileEnum.get_child(info), info, Prefs.FileType.NONE]; - }.bind(this); - resolve(resultGenerator()); - } catch (e) { - reject(e); - } - }); - }); - } - - _monitorDesktopFolder() { - if (this._monitorDesktopDir) { - this._monitorDesktopDir.cancel(); - this._monitorDesktopDir = null; - } - - let desktopDir = DesktopIconsUtil.getDesktopDir(); - this._monitorDesktopDir = desktopDir.monitor_directory(Gio.FileMonitorFlags.WATCH_MOVES, null); - this._monitorDesktopDir.set_rate_limit(1000); - this._monitorDesktopDir.connect('changed', (obj, file, otherFile, eventType) => this._updateDesktopIfChanged(file, otherFile, eventType)); - } - - checkIfSpecialFilesAreSelected() { - for (let fileItem of this._selection) { - if (fileItem.isSpecial) - return true; - } - return false; - } - - getNumberOfSelectedItems() { - return this._selection.size; - } - - get writableByOthers() { - return this._writableByOthers; - } - - _setWritableByOthers(value) { - if (value == this._writableByOthers) - return; - - this._writableByOthers = value - this.notify('writable-by-others'); - } - - _updateDesktopIfChanged (file, otherFile, eventType) { - let { - DELETED, MOVED_IN, MOVED_OUT, CREATED, RENAMED, CHANGES_DONE_HINT, ATTRIBUTE_CHANGED - } = Gio.FileMonitorEvent; - - let fileUri = file.get_uri(); - let fileItem = null; - if (this._fileItems.has(fileUri)) - fileItem = this._fileItems.get(fileUri); - switch(eventType) { - case RENAMED: - this._fileItems.delete(fileUri); - this._fileItems.set(otherFile.get_uri(), fileItem); - fileItem.onFileRenamed(otherFile); - return; - case CHANGES_DONE_HINT: - case ATTRIBUTE_CHANGED: - /* a file changed, rather than the desktop itself */ - let desktopDir = DesktopIconsUtil.getDesktopDir(); - if (file.get_uri() != desktopDir.get_uri()) - return; - - if (this._queryFileInfoCancellable) - this._queryFileInfoCancellable.cancel(); - - file.query_info_async(Gio.FILE_ATTRIBUTE_UNIX_MODE, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, - this._queryFileInfoCancellable, - (source, result) => { - try { - let info = source.query_info_finish(result); - this._queryFileInfoCancellable = null; - - this._unixMode = info.get_attribute_uint32(Gio.FILE_ATTRIBUTE_UNIX_MODE); - this._setWritableByOthers((this._unixMode & S_IWOTH) != 0); - - if (this._writableByOthers) - log(`desktop-icons: Desktop is writable by others - will not allow launching any desktop files`); - } catch(error) { - if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - global.log('Error getting desktop unix mode: ' + error); - } - }); - - return; - } - - // Only get a subset of events we are interested in. - // Note that CREATED will emit a CHANGES_DONE_HINT - if (![DELETED, MOVED_IN, MOVED_OUT, CREATED].includes(eventType)) - return; - - this._recreateDesktopIcons(); - } - - _setupDnD() { - this._draggableContainer = new St.Widget({ - visible: true, - width: 1, - height: 1, - x: 0, - y: 0, - style_class: 'draggable' - }); - this._draggableContainer._delegate = this; - this._draggable = DND.makeDraggable(this._draggableContainer, - { - manualMode: true, - dragActorOpacity: 100 - }); - - this._draggable.connect('drag-cancelled', () => this._onDragCancelled()); - this._draggable.connect('drag-end', () => this._onDragEnd()); - - this._draggable._dragActorDropped = event => this._dragActorDropped(event); - } - - dragStart() { - if (this._inDrag) { - return; - } - - this._setupDnD(); - let event = Clutter.get_current_event(); - let [x, y] = event.get_coords(); - [this._dragXStart, this._dragYStart] = event.get_coords(); - this._inDrag = true; - - for (let fileItem of this._selection) { - let clone = new Clutter.Clone({ - source: fileItem.actor, - reactive: false - }); - clone.x = fileItem.actor.get_transformed_position()[0]; - clone.y = fileItem.actor.get_transformed_position()[1]; - this._draggableContainer.add_child(clone); - } - - Main.layoutManager.uiGroup.add_child(this._draggableContainer); - this._draggable.startDrag(x, y, global.get_current_time(), event.get_event_sequence()); - } - - _onDragCancelled() { - let event = Clutter.get_current_event(); - let [x, y] = event.get_coords(); - this._dragCancelled = true; - } - - _onDragEnd() { - this._inDrag = false; - Main.layoutManager.uiGroup.remove_child(this._draggableContainer); - } - - _dragActorDropped(event) { - let [dropX, dropY] = event.get_coords(); - let target = this._draggable._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, - dropX, dropY); - - // We call observers only once per motion with the innermost - // target actor. If necessary, the observer can walk the - // parent itself. - let dropEvent = { - dropActor: this._draggable._dragActor, - targetActor: target, - clutterEvent: event - }; - for (let dragMonitor of DND.dragMonitors) { - let dropFunc = dragMonitor.dragDrop; - if (dropFunc) - switch (dropFunc(dropEvent)) { - case DragDropResult.FAILURE: - case DragDropResult.SUCCESS: - return true; - case DragDropResult.CONTINUE: - continue; - } - } - - // At this point it is too late to cancel a drag by destroying - // the actor, the fate of which is decided by acceptDrop and its - // side-effects - this._draggable._dragCancellable = false; - - let destroyActor = false; - while (target) { - if (target._delegate && target._delegate.acceptDrop) { - let [r, targX, targY] = target.transform_stage_point(dropX, dropY); - if (target._delegate.acceptDrop(this._draggable.actor._delegate, - this._draggable._dragActor, - targX, - targY, - event.get_time())) { - // If it accepted the drop without taking the actor, - // handle it ourselves. - if (this._draggable._dragActor.get_parent() == Main.uiGroup) { - if (this._draggable._restoreOnSuccess) { - this._draggable._restoreDragActor(event.get_time()); - return true; - } - else { - // We need this in order to make sure drag-end is fired - destroyActor = true; - } - } - - this._draggable._dragInProgress = false; - getDpy().set_cursor(Meta.Cursor.DEFAULT); - this._draggable.emit('drag-end', event.get_time(), true); - if (destroyActor) { - this._draggable._dragActor.destroy(); - } - this._draggable._dragComplete(); - - return true; - } - } - target = target.get_parent(); - } - - this._draggable._cancelDrag(event.get_time()); - - return true; - } - - acceptDrop(xEnd, yEnd) { - let savedCoordinates = new Map(); - let [xDiff, yDiff] = [xEnd - this._dragXStart, yEnd - this._dragYStart]; - /* Remove all items before dropping new ones, so we can freely reposition - * them. - */ - for (let item of this._selection) { - let [itemX, itemY] = item.actor.get_transformed_position(); - let monitorIndex = findMonitorIndexForPos(itemX, itemY); - savedCoordinates.set(item, [itemX, itemY]); - this._desktopGrids[monitorIndex].removeFileItem(item); - } - - for (let item of this._selection) { - let [itemX, itemY] = savedCoordinates.get(item); - /* Set the new ideal position where the item drop should happen */ - let newFileX = Math.round(xDiff + itemX); - let newFileY = Math.round(yDiff + itemY); - let monitorIndex = findMonitorIndexForPos(newFileX, newFileY); - this._desktopGrids[monitorIndex].addFileItemCloseTo(item, newFileX, newFileY, DesktopGrid.StoredCoordinates.OVERWRITE); - } - - return true; - } - - selectionDropOnFileItem (fileItemDestination) { - if (!fileItemDestination.isDirectory) - return false; - - let droppedUris = []; - for (let fileItem of this._selection) { - if (fileItem.isSpecial) - return false; - if (fileItemDestination.file.get_uri() == fileItem.file.get_uri()) - return false; - droppedUris.push(fileItem.file.get_uri()); - } - - if (droppedUris.length == 0) - return true; - - DBusUtils.NautilusFileOperationsProxy.MoveURIsRemote(droppedUris, - fileItemDestination.file.get_uri(), - (result, error) => { - if (error) - throw new Error('Error moving files: ' + error.message); - } - ); - for (let fileItem of this._selection) { - fileItem.state = FileItem.State.GONE; - } - - this._recreateDesktopIcons(); - - return true; - } - - _resetGridsAndScheduleLayout() { - this._deleteChildrenId = 0; - - Object.values(this._desktopGrids).forEach((grid) => grid.reset()); - - this._layoutChildrenId = GLib.idle_add(GLib.PRIORITY_LOW, () => this._layoutChildren()); - - return GLib.SOURCE_REMOVE; - } - - scheduleReLayoutChildren() { - if (this._deleteChildrenId != 0) - return; - - if (this._layoutChildrenId != 0) { - GLib.source_remove(this._layoutChildrenId); - this._layoutChildrenId = 0; - } - - - this._deleteChildrenId = GLib.idle_add(GLib.PRIORITY_LOW, () => this._resetGridsAndScheduleLayout()); - } - - _addFileItemCloseTo(item) { - let coordinates; - let x = 0; - let y = 0; - let coordinatesAction = DesktopGrid.StoredCoordinates.ASSIGN; - if (item.savedCoordinates != null) { - [x, y] = item.savedCoordinates; - coordinatesAction = DesktopGrid.StoredCoordinates.PRESERVE; - } - let monitorIndex = findMonitorIndexForPos(x, y); - let desktopGrid = this._desktopGrids[monitorIndex]; - try { - desktopGrid.addFileItemCloseTo(item, x, y, coordinatesAction); - } catch (e) { - log(`Error adding children to desktop: ${e.message}`); - } - } - - _layoutChildren() { - let showHidden = Prefs.gtkSettings.get_boolean('show-hidden'); - /* - * Paint the icons in two passes: - * * first pass paints those that have their coordinates defined in the metadata - * * second pass paints those new files that still don't have their definitive coordinates - */ - for (let [fileUri, fileItem] of this._fileItems) { - if (fileItem.savedCoordinates == null) - continue; - if (fileItem.state != FileItem.State.NORMAL) - continue; - if (!showHidden && fileItem.isHidden) - continue; - this._addFileItemCloseTo(fileItem); - } - - for (let [fileUri, fileItem] of this._fileItems) { - if (fileItem.savedCoordinates !== null) - continue; - if (fileItem.state != FileItem.State.NORMAL) - continue; - if (!showHidden && fileItem.isHidden) - continue; - this._addFileItemCloseTo(fileItem); - } - - this._layoutChildrenId = 0; - return GLib.SOURCE_REMOVE; - } - - doRename() { - if (this._selection.size != 1) - return; - - let item = [...this._selection][0]; - if (item.canRename()) - item.doRename(); - } - - doOpen() { - for (let fileItem of this._selection) - fileItem.doOpen(); - } - - doTrash() { - DBusUtils.NautilusFileOperationsProxy.TrashFilesRemote([...this._selection].map((x) => { return x.file.get_uri(); }), - (source, error) => { - if (error) - throw new Error('Error trashing files on the desktop: ' + error.message); - } - ); - } - - doEmptyTrash() { - DBusUtils.NautilusFileOperationsProxy.EmptyTrashRemote( (source, error) => { - if (error) - throw new Error('Error trashing files on the desktop: ' + error.message); - }); - } - - _onFileItemSelected(fileItem, keepCurrentSelection, rubberBandSelection, addToSelection) { - - if (!keepCurrentSelection && !this._inDrag) - this.clearSelection(); - - let selection = keepCurrentSelection && rubberBandSelection ? this._currentSelection : this._selection; - if (addToSelection) - selection.add(fileItem); - else - selection.delete(fileItem); - - for (let [fileUri, fileItem] of this._fileItems) - fileItem.isSelected = this._currentSelection.has(fileItem) || this._selection.has(fileItem); - } - - clearSelection() { - for (let [fileUri, fileItem] of this._fileItems) - fileItem.isSelected = false; - this._selection = new Set(); - this._currentSelection = new Set(); - } - - _getClipboardText(isCopy) { - let action = isCopy ? 'copy' : 'cut'; - let text = `x-special/nautilus-clipboard\n${action}\n${ - [...this._selection].map(s => s.file.get_uri()).join('\n') - }\n`; - - return text; - } - - doCopy() { - Clipboard.set_text(CLIPBOARD_TYPE, this._getClipboardText(true)); - } - - doCut() { - Clipboard.set_text(CLIPBOARD_TYPE, this._getClipboardText(false)); - } - - destroy() { - if (this._monitorDesktopDir) - this._monitorDesktopDir.cancel(); - this._monitorDesktopDir = null; - - if (this.settingsId) - Prefs.settings.disconnect(this.settingsId); - this.settingsId = 0; - if (this.gtkSettingsId) - Prefs.gtkSettings.disconnect(this.gtkSettingsId); - this.gtkSettingsId = 0; - - if (this._layoutChildrenId) - GLib.source_remove(this._layoutChildrenId); - this._layoutChildrenId = 0; - - if (this._deleteChildrenId) - GLib.source_remove(this._deleteChildrenId); - this._deleteChildrenId = 0; - - if (this._monitorsChangedId) - Main.layoutManager.disconnect(this._monitorsChangedId); - this._monitorsChangedId = 0; - if (this._stageReleaseEventId) - global.stage.disconnect(this._stageReleaseEventId); - this._stageReleaseEventId = 0; - - if (this._rubberBandId) - global.stage.disconnect(this._rubberBandId); - this._rubberBandId = 0; - - this._rubberBand.destroy(); - - if (this._queryFileInfoCancellable) - this._queryFileInfoCancellable.cancel(); - - Object.values(this._desktopGrids).forEach(grid => grid.actor.destroy()); - this._desktopGrids = {} - } -}); - -function forEachBackgroundManager(func) { - Main.layoutManager._bgManagers.forEach(func); -} diff --git a/extensions/desktop-icons/extension.js b/extensions/desktop-icons/extension.js deleted file mode 100644 index 4b960ab..0000000 --- a/extensions/desktop-icons/extension.js +++ /dev/null @@ -1,71 +0,0 @@ -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2017 Carlos Soriano - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const Main = imports.ui.main; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Prefs = Me.imports.prefs; -const { DesktopManager } = Me.imports.desktopManager; -const DBusUtils = Me.imports.dbusUtils; - -var desktopManager = null; -var addBackgroundMenuOrig = null; -var _startupPreparedId; -var lockActivitiesButton = false; - -var oldShouldToggleByCornerOrButtonFunction = null; - -function init() { - addBackgroundMenuOrig = Main.layoutManager._addBackgroundMenu; - - Prefs.initTranslations(); -} - -function newShouldToggleByCornerOrButton() { - if (lockActivitiesButton) - return false; - else - return oldShouldToggleByCornerOrButtonFunction.bind(Main.overview); -} - -function enable() { - // register a new function to allow to lock the Activities button when doing a rubberband selection - oldShouldToggleByCornerOrButtonFunction = Main.overview.shouldToggleByCornerOrButton; - Main.overview.shouldToggleByCornerOrButton = newShouldToggleByCornerOrButton; - // wait until the startup process has ended - if (Main.layoutManager._startingUp) - _startupPreparedId = Main.layoutManager.connect('startup-complete', () => innerEnable(true)); - else - innerEnable(false); -} - -function innerEnable(disconnectSignal) { - if (disconnectSignal) - Main.layoutManager.disconnect(_startupPreparedId); - DBusUtils.init(); - Prefs.init(); - Main.layoutManager._addBackgroundMenu = function() {}; - desktopManager = new DesktopManager(); -} - -function disable() { - desktopManager.destroy(); - Main.layoutManager._addBackgroundMenu = addBackgroundMenuOrig; - Main.overview.shouldToggleByCornerOrButton = oldShouldToggleByCornerOrButtonFunction; -} diff --git a/extensions/desktop-icons/fileItem.js b/extensions/desktop-icons/fileItem.js deleted file mode 100644 index e6f4f2c..0000000 --- a/extensions/desktop-icons/fileItem.js +++ /dev/null @@ -1,800 +0,0 @@ -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2017 Carlos Soriano - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const Gtk = imports.gi.Gtk; -const Clutter = imports.gi.Clutter; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const St = imports.gi.St; -const Pango = imports.gi.Pango; -const Meta = imports.gi.Meta; -const GdkPixbuf = imports.gi.GdkPixbuf; -const Cogl = imports.gi.Cogl; -const GnomeDesktop = imports.gi.GnomeDesktop; - -const Mainloop = imports.mainloop; -const Signals = imports.signals; - -const Background = imports.ui.background; -const Main = imports.ui.main; -const PopupMenu = imports.ui.popupMenu; -const Util = imports.misc.util; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Extension = Me.imports.extension; -const Prefs = Me.imports.prefs; -const DBusUtils = Me.imports.dbusUtils; -const DesktopIconsUtil = Me.imports.desktopIconsUtil; - -const Gettext = imports.gettext.domain('desktop-icons'); - -const _ = Gettext.gettext; - -const DRAG_TRESHOLD = 8; - -var S_IXUSR = 0o00100; -var S_IWOTH = 0o00002; - -var State = { - NORMAL: 0, - GONE: 1, -}; - -var FileItem = class { - - constructor(file, fileInfo, fileExtra) { - this._fileExtra = fileExtra; - this._loadThumbnailDataCancellable = null; - this._thumbnailScriptWatch = 0; - this._setMetadataCancellable = null; - this._queryFileInfoCancellable = null; - this._isSpecial = this._fileExtra != Prefs.FileType.NONE; - - this._file = file; - - this._savedCoordinates = null; - let savedCoordinates = fileInfo.get_attribute_as_string('metadata::nautilus-icon-position'); - if (savedCoordinates != null) - this._savedCoordinates = savedCoordinates.split(',').map(x => Number(x)); - - this._state = State.NORMAL; - - this.actor = new St.Bin({ visible: true }); - this.actor.set_fill(true, true); - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - this.actor.set_height(Prefs.get_desired_height(scaleFactor)); - this.actor.set_width(Prefs.get_desired_width(scaleFactor)); - this.actor._delegate = this; - this.actor.connect('destroy', () => this._onDestroy()); - - this._container = new St.BoxLayout({ reactive: true, - track_hover: true, - can_focus: true, - style_class: 'file-item', - x_expand: true, - y_expand: true, - x_align: Clutter.ActorAlign.FILL, - vertical: true }); - this.actor.set_child(this._container); - this._icon = new St.Bin(); - this._icon.set_height(Prefs.get_icon_size() * scaleFactor); - - this._iconContainer = new St.Bin({ visible: true }); - this._iconContainer.child = this._icon; - this._container.add_child(this._iconContainer); - - this._label = new St.Label({ - style_class: 'name-label' - }); - - this._container.add_child(this._label); - let clutterText = this._label.get_clutter_text(); - /* TODO: Convert to gobject.set for 3.30 */ - clutterText.set_line_wrap(true); - clutterText.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR); - clutterText.set_ellipsize(Pango.EllipsizeMode.END); - - this._container.connect('button-press-event', (actor, event) => this._onPressButton(actor, event)); - this._container.connect('motion-event', (actor, event) => this._onMotion(actor, event)); - this._container.connect('leave-event', (actor, event) => this._onLeave(actor, event)); - this._container.connect('button-release-event', (actor, event) => this._onReleaseButton(actor, event)); - - /* Set the metadata and update relevant UI */ - this._updateMetadataFromFileInfo(fileInfo); - - if (this._isDesktopFile) { - /* watch for the executable bit being removed or added */ - this._monitorDesktopFile = this._file.monitor_file(Gio.FileMonitorFlags.NONE, null); - this._monitorDesktopFileId = this._monitorDesktopFile.connect('changed', - (obj, file, otherFile, eventType) => { - switch(eventType) { - case Gio.FileMonitorEvent.ATTRIBUTE_CHANGED: - this._refreshMetadataAsync(true); - break; - } - }); - } - - this._createMenu(); - this._updateIcon(); - - this._isSelected = false; - this._primaryButtonPressed = false; - if (this._attributeCanExecute && !this._isDesktopFile) - this._execLine = this.file.get_path(); - if (fileExtra == Prefs.FileType.USER_DIRECTORY_TRASH) { - // if this icon is the trash, monitor the state of the directory to update the icon - this._trashChanged = false; - this._trashInitializeCancellable = null; - this._scheduleTrashRefreshId = 0; - this._monitorTrashDir = this._file.monitor_directory(Gio.FileMonitorFlags.WATCH_MOVES, null); - this._monitorTrashId = this._monitorTrashDir.connect('changed', (obj, file, otherFile, eventType) => { - switch(eventType) { - case Gio.FileMonitorEvent.DELETED: - case Gio.FileMonitorEvent.MOVED_OUT: - case Gio.FileMonitorEvent.CREATED: - case Gio.FileMonitorEvent.MOVED_IN: - if (this._queryTrashInfoCancellable || this._scheduleTrashRefreshId) { - if (this._scheduleTrashRefreshId) - GLib.source_remove(this._scheduleTrashRefreshId); - this._scheduleTrashRefreshId = Mainloop.timeout_add(200, () => this._refreshTrashIcon()); - } else { - this._refreshTrashIcon(); - } - break; - } - }); - } - - Extension.desktopManager.connect('notify::writable-by-others', () => { - if (!this._isDesktopFile) - return; - this._refreshMetadataAsync(true); - }); - } - - _onDestroy() { - /* Regular file data */ - if (this._setMetadataCancellable) - this._setMetadataCancellable.cancel(); - if (this._queryFileInfoCancellable) - this._queryFileInfoCancellable.cancel(); - - /* Thumbnailing */ - if (this._thumbnailScriptWatch) - GLib.source_remove(this._thumbnailScriptWatch); - if (this._loadThumbnailDataCancellable) - this._loadThumbnailDataCancellable.cancel(); - - /* Desktop file */ - if (this._monitorDesktopFileId) { - this._monitorDesktopFile.disconnect(this._monitorDesktopFileId); - this._monitorDesktopFile.cancel(); - } - - /* Trash */ - if (this._monitorTrashDir) { - this._monitorTrashDir.disconnect(this._monitorTrashId); - this._monitorTrashDir.cancel(); - } - if (this._queryTrashInfoCancellable) - this._queryTrashInfoCancellable.cancel(); - if (this._scheduleTrashRefreshId) - GLib.source_remove(this._scheduleTrashRefreshId); - } - - _refreshMetadataAsync(rebuild) { - if (this._queryFileInfoCancellable) - this._queryFileInfoCancellable.cancel(); - this._queryFileInfoCancellable = new Gio.Cancellable(); - this._file.query_info_async(DesktopIconsUtil.DEFAULT_ATTRIBUTES, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, - this._queryFileInfoCancellable, - (source, result) => { - try { - let newFileInfo = source.query_info_finish(result); - this._queryFileInfoCancellable = null; - this._updateMetadataFromFileInfo(newFileInfo); - if (rebuild) { - this._createMenu(); - this._updateIcon(); - } - } catch(error) { - if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - global.log("Error getting the file info: " + error); - } - }); - } - - _updateMetadataFromFileInfo(fileInfo) { - this._fileInfo = fileInfo; - - let oldLabelText = this._label.text; - - this._displayName = fileInfo.get_attribute_as_string('standard::display-name'); - this._attributeCanExecute = fileInfo.get_attribute_boolean('access::can-execute'); - this._unixmode = fileInfo.get_attribute_uint32('unix::mode') - this._writableByOthers = (this._unixmode & S_IWOTH) != 0; - this._trusted = fileInfo.get_attribute_as_string('metadata::trusted') == 'true'; - this._attributeContentType = fileInfo.get_content_type(); - this._isDesktopFile = this._attributeContentType == 'application/x-desktop'; - - if (this._isDesktopFile && this._writableByOthers) - log(`desktop-icons: File ${this._displayName} is writable by others - will not allow launching`); - - if (this._isDesktopFile) { - this._desktopFile = Gio.DesktopAppInfo.new_from_filename(this._file.get_path()); - if (!this._desktopFile) { - log(`Couldn’t parse ${this._displayName} as a desktop file, will treat it as a regular file.`); - this._isDesktopFile = false; - } - } - - if (this.displayName != oldLabelText) { - this._label.text = this.displayName; - } - - this._fileType = fileInfo.get_file_type(); - this._isDirectory = this._fileType == Gio.FileType.DIRECTORY; - this._isSpecial = this._fileExtra != Prefs.FileType.NONE; - this._isHidden = fileInfo.get_is_hidden() | fileInfo.get_is_backup(); - this._isSymlink = fileInfo.get_is_symlink(); - this._modifiedTime = this._fileInfo.get_attribute_uint64("time::modified"); - /* - * This is a glib trick to detect broken symlinks. If a file is a symlink, the filetype - * points to the final file, unless it is broken; thus if the file type is SYMBOLIC_LINK, - * it must be a broken link. - * https://developer.gnome.org/gio/stable/GFile.html#g-file-query-info - */ - this._isBrokenSymlink = this._isSymlink && this._fileType == Gio.FileType.SYMBOLIC_LINK - } - - onFileRenamed(file) { - this._file = file; - this._refreshMetadataAsync(false); - } - - _updateIcon() { - if (this._fileExtra == Prefs.FileType.USER_DIRECTORY_TRASH) { - this._icon.child = this._createEmblemedStIcon(this._fileInfo.get_icon(), null); - return; - } - - let thumbnailFactory = GnomeDesktop.DesktopThumbnailFactory.new(GnomeDesktop.DesktopThumbnailSize.LARGE); - if (thumbnailFactory.can_thumbnail(this._file.get_uri(), - this._attributeContentType, - this._modifiedTime)) { - let thumbnail = thumbnailFactory.lookup(this._file.get_uri(), this._modifiedTime); - if (thumbnail == null) { - if (!thumbnailFactory.has_valid_failed_thumbnail(this._file.get_uri(), - this._modifiedTime)) { - let argv = []; - argv.push(GLib.build_filenamev([ExtensionUtils.getCurrentExtension().path, - 'createThumbnail.js'])); - argv.push(this._file.get_path()); - let [success, pid] = GLib.spawn_async(null, argv, null, - GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, null); - if (this._thumbnailScriptWatch) - GLib.source_remove(this._thumbnailScriptWatch); - this._thumbnailScriptWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, - pid, - (pid, exitCode) => { - if (exitCode == 0) - this._updateIcon(); - else - global.log('Failed to generate thumbnail for ' + this._filePath); - GLib.spawn_close_pid(pid); - return false; - } - ); - } - } else { - if (this._loadThumbnailDataCancellable) - this._loadThumbnailDataCancellable.cancel(); - this._loadThumbnailDataCancellable = new Gio.Cancellable(); - let thumbnailFile = Gio.File.new_for_path(thumbnail); - thumbnailFile.load_bytes_async(this._loadThumbnailDataCancellable, - (source, result) => { - try { - let [thumbnailData, etag_out] = source.load_bytes_finish(result); - let thumbnailStream = Gio.MemoryInputStream.new_from_bytes(thumbnailData); - let thumbnailPixbuf = GdkPixbuf.Pixbuf.new_from_stream(thumbnailStream, null); - - if (thumbnailPixbuf != null) { - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let thumbnailImage = new Clutter.Image(); - thumbnailImage.set_data(thumbnailPixbuf.get_pixels(), - thumbnailPixbuf.has_alpha ? Cogl.PixelFormat.RGBA_8888 : Cogl.PixelFormat.RGB_888, - thumbnailPixbuf.width, - thumbnailPixbuf.height, - thumbnailPixbuf.rowstride - ); - let icon = new Clutter.Actor(); - icon.set_content(thumbnailImage); - let width = Prefs.get_desired_width(scaleFactor); - let height = Prefs.get_icon_size() * scaleFactor; - let aspectRatio = thumbnailPixbuf.width / thumbnailPixbuf.height; - if ((width / height) > aspectRatio) - icon.set_size(height * aspectRatio, height); - else - icon.set_size(width, width / aspectRatio); - this._icon.child = icon; - } - } catch (error) { - if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { - global.log('Error while loading thumbnail: ' + error); - this._icon.child = this._createEmblemedStIcon(this._fileInfo.get_icon(), null); - } - } - } - ); - } - } - - if (this._isBrokenSymlink) { - this._icon.child = this._createEmblemedStIcon(null, 'text-x-generic'); - } else { - if (this.trustedDesktopFile && this._desktopFile.has_key('Icon')) - this._icon.child = this._createEmblemedStIcon(null, this._desktopFile.get_string('Icon')); - else - this._icon.child = this._createEmblemedStIcon(this._fileInfo.get_icon(), null); - } - } - - _refreshTrashIcon() { - if (this._queryTrashInfoCancellable) - this._queryTrashInfoCancellable.cancel(); - this._queryTrashInfoCancellable = new Gio.Cancellable(); - - this._file.query_info_async(DesktopIconsUtil.DEFAULT_ATTRIBUTES, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, - this._queryTrashInfoCancellable, - (source, result) => { - try { - this._fileInfo = source.query_info_finish(result); - this._queryTrashInfoCancellable = null; - this._updateIcon(); - } catch(error) { - if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - global.log('Error getting the number of files in the trash: ' + error); - } - }); - - this._scheduleTrashRefreshId = 0; - return false; - } - - get file() { - return this._file; - } - - get isHidden() { - return this._isHidden; - } - - _createEmblemedStIcon(icon, iconName) { - if (icon == null) { - if (GLib.path_is_absolute(iconName)) { - let iconFile = Gio.File.new_for_commandline_arg(iconName); - icon = new Gio.FileIcon({ file: iconFile }); - } else { - icon = Gio.ThemedIcon.new_with_default_fallbacks(iconName); - } - } - let itemIcon = Gio.EmblemedIcon.new(icon, null); - - if (this._isSymlink) { - if (this._isBrokenSymlink) - itemIcon.add_emblem(Gio.Emblem.new(Gio.ThemedIcon.new('emblem-unreadable'))); - else - itemIcon.add_emblem(Gio.Emblem.new(Gio.ThemedIcon.new('emblem-symbolic-link'))); - } else if (this.trustedDesktopFile) { - itemIcon.add_emblem(Gio.Emblem.new(Gio.ThemedIcon.new('emblem-symbolic-link'))); - } - - return new St.Icon({ gicon: itemIcon, - icon_size: Prefs.get_icon_size() - }); - } - - doRename() { - if (!this.canRename()) { - log (`Error: ${this.file.get_uri()} cannot be renamed`); - return; - } - - this.emit('rename-clicked'); - } - - doOpen() { - if (this._isBrokenSymlink) { - log(`Error: Can’t open ${this.file.get_uri()} because it is a broken symlink.`); - return; - } - - if (this.trustedDesktopFile) { - this._desktopFile.launch_uris_as_manager([], null, GLib.SpawnFlags.SEARCH_PATH, null, null); - return; - } - - if (this._attributeCanExecute && !this._isDirectory && !this._isDesktopFile) { - if (this._execLine) - Util.spawnCommandLine(this._execLine); - return; - } - - Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), - null, null, - (source, result) => { - try { - Gio.AppInfo.launch_default_for_uri_finish(result); - } catch (e) { - log('Error opening file ' + this.file.get_uri() + ': ' + e.message); - } - } - ); - } - - _onCopyClicked() { - Extension.desktopManager.doCopy(); - } - - _onCutClicked() { - Extension.desktopManager.doCut(); - } - - _onShowInFilesClicked() { - - DBusUtils.FreeDesktopFileManagerProxy.ShowItemsRemote([this.file.get_uri()], '', - (result, error) => { - if (error) - log('Error showing file on desktop: ' + error.message); - } - ); - } - - _onPropertiesClicked() { - - DBusUtils.FreeDesktopFileManagerProxy.ShowItemPropertiesRemote([this.file.get_uri()], '', - (result, error) => { - if (error) - log('Error showing properties: ' + error.message); - } - ); - } - - _onMoveToTrashClicked() { - Extension.desktopManager.doTrash(); - } - - _onEmptyTrashClicked() { - Extension.desktopManager.doEmptyTrash(); - } - - get _allowLaunchingText() { - if (this.trustedDesktopFile) - return _("Don’t Allow Launching"); - - return _("Allow Launching"); - } - - get metadataTrusted() { - return this._trusted; - } - - set metadataTrusted(value) { - this._trusted = value; - - let info = new Gio.FileInfo(); - info.set_attribute_string('metadata::trusted', - value ? 'true' : 'false'); - this._file.set_attributes_async(info, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_LOW, - null, - (source, result) => { - try { - source.set_attributes_finish(result); - this._refreshMetadataAsync(true); - } catch(e) { - log(`Failed to set metadata::trusted: ${e.message}`); - } - }); - } - - _onAllowDisallowLaunchingClicked() { - this.metadataTrusted = !this.trustedDesktopFile; - - /* - * we're marking as trusted, make the file executable too. note that we - * do not ever remove the executable bit, since we don't know who set - * it. - */ - if (this.metadataTrusted && !this._attributeCanExecute) { - let info = new Gio.FileInfo(); - let newUnixMode = this._unixmode | S_IXUSR; - info.set_attribute_uint32(Gio.FILE_ATTRIBUTE_UNIX_MODE, newUnixMode); - this._file.set_attributes_async(info, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_LOW, - null, - (source, result) => { - try { - source.set_attributes_finish (result); - } catch(e) { - log(`Failed to set unix mode: ${e.message}`); - } - }); - } - } - - canRename() { - return !this.trustedDesktopFile && this._fileExtra == Prefs.FileType.NONE; - } - - _doOpenWith() { - DBusUtils.openFileWithOtherApplication(this.file.get_path()); - } - - _getSelectionStyle() { - let rgba = DesktopIconsUtil.getGtkClassBackgroundColor('view', Gtk.StateFlags.SELECTED); - let background_color = - 'rgba(' + rgba.red * 255 + ', ' + rgba.green * 255 + ', ' + rgba.blue * 255 + ', 0.6)'; - let border_color = - 'rgba(' + rgba.red * 255 + ', ' + rgba.green * 255 + ', ' + rgba.blue * 255 + ', 0.8)'; - - return 'background-color: ' + background_color + ';' + - 'border-color: ' + border_color + ';' - } - - _createMenu() { - this._menuManager = new PopupMenu.PopupMenuManager({ actor: this.actor }); - let side = St.Side.LEFT; - if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) - side = St.Side.RIGHT; - this._menu = new PopupMenu.PopupMenu(this.actor, 0.5, side); - this._menu.addAction(_('Open'), () => this.doOpen()); - switch (this._fileExtra) { - case Prefs.FileType.NONE: - if (!this._isDirectory) - this._actionOpenWith = this._menu.addAction(_('Open With Other Application'), () => this._doOpenWith()); - else - this._actionOpenWith = null; - this._menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this._actionCut = this._menu.addAction(_('Cut'), () => this._onCutClicked()); - this._actionCopy = this._menu.addAction(_('Copy'), () => this._onCopyClicked()); - if (this.canRename()) - this._menu.addAction(_('Rename…'), () => this.doRename()); - this._actionTrash = this._menu.addAction(_('Move to Trash'), () => this._onMoveToTrashClicked()); - if (this._isDesktopFile && !Extension.desktopManager.writableByOthers && !this._writableByOthers) { - this._menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this._allowLaunchingMenuItem = this._menu.addAction(this._allowLaunchingText, - () => this._onAllowDisallowLaunchingClicked()); - - } - break; - case Prefs.FileType.USER_DIRECTORY_TRASH: - this._menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this._menu.addAction(_('Empty Trash'), () => this._onEmptyTrashClicked()); - break; - default: - break; - } - this._menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this._menu.addAction(_('Properties'), () => this._onPropertiesClicked()); - this._menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this._menu.addAction(_('Show in Files'), () => this._onShowInFilesClicked()); - if (this._isDirectory && this.file.get_path() != null) - this._actionOpenInTerminal = this._menu.addAction(_('Open in Terminal'), () => this._onOpenTerminalClicked()); - - this._menuManager.addMenu(this._menu); - - Main.layoutManager.uiGroup.add_child(this._menu.actor); - this._menu.actor.hide(); - } - - _onOpenTerminalClicked () { - DesktopIconsUtil.launchTerminal(this.file.get_path()); - } - - _onPressButton(actor, event) { - let button = event.get_button(); - if (button == 3) { - if (!this.isSelected) - this.emit('selected', false, false, true); - this._menu.toggle(); - if (this._actionOpenWith) { - let allowOpenWith = (Extension.desktopManager.getNumberOfSelectedItems() == 1); - this._actionOpenWith.setSensitive(allowOpenWith); - } - let specialFilesSelected = Extension.desktopManager.checkIfSpecialFilesAreSelected(); - if (this._actionCut) - this._actionCut.setSensitive(!specialFilesSelected); - if (this._actionCopy) - this._actionCopy.setSensitive(!specialFilesSelected); - if (this._actionTrash) - this._actionTrash.setSensitive(!specialFilesSelected); - return Clutter.EVENT_STOP; - } else if (button == 1) { - if (event.get_click_count() == 1) { - let [x, y] = event.get_coords(); - this._primaryButtonPressed = true; - this._buttonPressInitialX = x; - this._buttonPressInitialY = y; - let shiftPressed = !!(event.get_state() & Clutter.ModifierType.SHIFT_MASK); - let controlPressed = !!(event.get_state() & Clutter.ModifierType.CONTROL_MASK); - if (!this.isSelected) { - this.emit('selected', shiftPressed || controlPressed, false, true); - } - } - return Clutter.EVENT_STOP; - } - - return Clutter.EVENT_PROPAGATE; - } - - _onLeave(actor, event) { - this._primaryButtonPressed = false; - } - - _onMotion(actor, event) { - let [x, y] = event.get_coords(); - if (this._primaryButtonPressed) { - let xDiff = x - this._buttonPressInitialX; - let yDiff = y - this._buttonPressInitialY; - let distance = Math.sqrt(Math.pow(xDiff, 2) + Math.pow(yDiff, 2)); - if (distance > DRAG_TRESHOLD) { - // Don't need to track anymore this if we start drag, and also - // avoids reentrance here - this._primaryButtonPressed = false; - let event = Clutter.get_current_event(); - let [x, y] = event.get_coords(); - Extension.desktopManager.dragStart(); - } - } - - return Clutter.EVENT_PROPAGATE; - } - - _onReleaseButton(actor, event) { - let button = event.get_button(); - if (button == 1) { - // primaryButtonPressed is TRUE only if the user has pressed the button - // over an icon, and if (s)he has not started a drag&drop operation - if (this._primaryButtonPressed) { - this._primaryButtonPressed = false; - let shiftPressed = !!(event.get_state() & Clutter.ModifierType.SHIFT_MASK); - let controlPressed = !!(event.get_state() & Clutter.ModifierType.CONTROL_MASK); - if ((event.get_click_count() == 1) && Prefs.CLICK_POLICY_SINGLE && !shiftPressed && !controlPressed) - this.doOpen(); - this.emit('selected', shiftPressed || controlPressed, false, true); - return Clutter.EVENT_STOP; - } - if ((event.get_click_count() == 2) && (!Prefs.CLICK_POLICY_SINGLE)) - this.doOpen(); - } - return Clutter.EVENT_PROPAGATE; - } - - get savedCoordinates() { - return this._savedCoordinates; - } - - _onSetMetadataFileFinished(source, result) { - try { - let [success, info] = source.set_attributes_finish(result); - } catch (error) { - if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - log('Error setting metadata to desktop files ', error); - } - } - - set savedCoordinates(pos) { - if (this._setMetadataCancellable) - this._setMetadataCancellable.cancel(); - - this._setMetadataCancellable = new Gio.Cancellable(); - this._savedCoordinates = [pos[0], pos[1]]; - let info = new Gio.FileInfo(); - info.set_attribute_string('metadata::nautilus-icon-position', - `${pos[0]},${pos[1]}`); - this.file.set_attributes_async(info, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, - this._setMetadataCancellable, - (source, result) => this._onSetMetadataFileFinished(source, result) - ); - } - - intersectsWith(argX, argY, argWidth, argHeight) { - let rect = new Meta.Rectangle({ x: argX, y: argY, width: argWidth, height: argHeight }); - let [containerX, containerY] = this._container.get_transformed_position(); - let boundingBox = new Meta.Rectangle({ x: containerX, - y: containerY, - width: this._container.allocation.x2 - this._container.allocation.x1, - height: this._container.allocation.y2 - this._container.allocation.y1 }); - let [intersects, _] = rect.intersect(boundingBox); - - return intersects; - } - - set isSelected(isSelected) { - isSelected = !!isSelected; - if (isSelected == this._isSelected) - return; - - if (isSelected) { - this._container.set_style(this._getSelectionStyle()); - } else { - this._container.set_style('background-color: transparent'); - this._container.set_style('border-color: transparent'); - } - - this._isSelected = isSelected; - } - - get isSelected() { - return this._isSelected; - } - - get isSpecial() { - return this._isSpecial; - } - - get state() { - return this._state; - } - - set state(state) { - if (state == this._state) - return; - - this._state = state; - } - - get isDirectory() { - return this._isDirectory; - } - - get trustedDesktopFile() { - return this._isDesktopFile && - this._attributeCanExecute && - this.metadataTrusted && - !Extension.desktopManager.writableByOthers && - !this._writableByOthers; - } - - get fileName() { - return this._fileInfo.get_name(); - } - - get displayName() { - if (this.trustedDesktopFile) - return this._desktopFile.get_name(); - - return this._displayName || null; - } - - acceptDrop() { - return Extension.desktopManager.selectionDropOnFileItem(this); - } -}; -Signals.addSignalMethods(FileItem.prototype); diff --git a/extensions/desktop-icons/meson.build b/extensions/desktop-icons/meson.build deleted file mode 100644 index 8431af6..0000000 --- a/extensions/desktop-icons/meson.build +++ /dev/null @@ -1,19 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) - -extension_schemas += files(join_paths('schemas', metadata_conf.get('gschemaname') + '.gschema.xml')) - -extension_sources += files( - 'createFolderDialog.js', - 'createThumbnail.js', - 'dbusUtils.js', - 'desktopGrid.js', - 'desktopIconsUtil.js', - 'desktopManager.js', - 'extension.js', - 'fileItem.js', - 'prefs.js' -) diff --git a/extensions/desktop-icons/metadata.json.in b/extensions/desktop-icons/metadata.json.in deleted file mode 100644 index 78cabf0..0000000 --- a/extensions/desktop-icons/metadata.json.in +++ /dev/null @@ -1,11 +0,0 @@ -{ -"extension-id": "@extension_id@", -"uuid": "@uuid@", -"settings-schema": "@gschemaname@", -"gettext-domain": "@gettext_domain@", -"name": "Desktop Icons", -"description": "Provide desktop icons support for classic mode", -"original-authors": [ "csoriano@redhat.com" ], -"shell-version": [ "@shell_current@" ], -"url": "@url@" -} diff --git a/extensions/desktop-icons/po/LINGUAS b/extensions/desktop-icons/po/LINGUAS deleted file mode 100644 index 65b7521..0000000 --- a/extensions/desktop-icons/po/LINGUAS +++ /dev/null @@ -1,19 +0,0 @@ -cs -da -de -es -fi -fr -fur -hr -hu -id -it -ja -nl -pl -pt_BR -ru -sv -tr -zh_TW diff --git a/extensions/desktop-icons/po/POTFILES.in b/extensions/desktop-icons/po/POTFILES.in deleted file mode 100644 index 7c2ebd3..0000000 --- a/extensions/desktop-icons/po/POTFILES.in +++ /dev/null @@ -1,4 +0,0 @@ -prefs.js -desktopGrid.js -fileItem.js -schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml \ No newline at end of file diff --git a/extensions/desktop-icons/po/cs.po b/extensions/desktop-icons/po/cs.po deleted file mode 100644 index f5f9db4..0000000 --- a/extensions/desktop-icons/po/cs.po +++ /dev/null @@ -1,195 +0,0 @@ -# Czech translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Marek Černocký , 2018. -# Milan Zink , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:49+0000\n" -"PO-Revision-Date: 2019-03-02 18:02+0100\n" -"Last-Translator: Daniel Rusek \n" -"Language-Team: Czech \n" -"Language: cs\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Poedit 2.2.1\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Název nové složky" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Vytvořit" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Zrušit" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Názvy složek nesmí obsahovat „/“." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Složka se nemůže jmenovat „.“." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Složka se nemůže jmenovat „..“." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Složky s „.“ na začátku jejich názvu jsou skryty." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Soubor nebo složka s tímto názvem již existuje." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Velikost ikon na pracovní ploše" - -#: prefs.js:102 -msgid "Small" -msgstr "malé" - -#: prefs.js:102 -msgid "Standard" -msgstr "standardní" - -#: prefs.js:102 -msgid "Large" -msgstr "velké" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Zobrazovat osobní složku na pracovní ploše" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Zobrazovat ikonu koše na pracovní ploše" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Nová složka" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Vložit" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Zpět" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Znovu" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Zobrazit plochu v Souborech" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Otevřít v terminálu" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Změnit pozadí…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Zobrazit nastavení" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Nastavení" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Zadejte název souboru…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "Budiž" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Nepovolit spouštění" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Povolit spouštění" - -#: fileItem.js:574 -msgid "Open" -msgstr "Otevřít" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Otevřít pomocí jiné aplikace" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Vyjmout" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Kopírovat" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Přejmenovat…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Přesunout do koše" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Vyprázdnit koš" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Vlastnosti" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Zobrazit v Souborech" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Velikost ikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Nastavit velikost pro ikony na pracovní ploše." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Zobrazovat osobní složku" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Zobrazovat osobní složku na pracovní ploše." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Zobrazovat koš" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Zobrazovat ikonu koše na pracovní ploše." - -#~ msgid "Huge" -#~ msgstr "obrovské" - -#~ msgid "Ok" -#~ msgstr "Ok" diff --git a/extensions/desktop-icons/po/da.po b/extensions/desktop-icons/po/da.po deleted file mode 100644 index d3f51f0..0000000 --- a/extensions/desktop-icons/po/da.po +++ /dev/null @@ -1,159 +0,0 @@ -# Danish translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Alan Mortensen , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-01-15 10:59+0000\n" -"PO-Revision-Date: 2019-02-09 11:35+0100\n" -"Last-Translator: Alan Mortensen \n" -"Language-Team: Danish \n" -"Language: da\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Størrelsen på skrivebordsikoner" - -#: prefs.js:102 -msgid "Small" -msgstr "Små" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standard" - -#: prefs.js:102 -msgid "Large" -msgstr "Store" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Vis den personlige mappe på skrivebordet" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Vis papirkurvsikonet på skrivebordet" - -#: desktopGrid.js:187 desktopGrid.js:306 -msgid "New Folder" -msgstr "Ny mappe" - -#: desktopGrid.js:308 -msgid "Paste" -msgstr "Indsæt" - -#: desktopGrid.js:309 -msgid "Undo" -msgstr "Fortryd" - -#: desktopGrid.js:310 -msgid "Redo" -msgstr "Omgør" - -#: desktopGrid.js:312 -msgid "Show Desktop in Files" -msgstr "Vis skrivebordet i Filer" - -#: desktopGrid.js:313 fileItem.js:586 -msgid "Open in Terminal" -msgstr "Åbn i terminal" - -#: desktopGrid.js:315 -msgid "Change Background…" -msgstr "Skift baggrund …" - -#: desktopGrid.js:317 -msgid "Display Settings" -msgstr "Skærmindstillinger" - -#: desktopGrid.js:318 -msgid "Settings" -msgstr "Indstillinger" - -#: desktopGrid.js:559 -msgid "Enter file name…" -msgstr "Indtast filnavn …" - -#: desktopGrid.js:563 -msgid "OK" -msgstr "OK" - -#: desktopGrid.js:569 -msgid "Cancel" -msgstr "Annullér" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Tillad ikke opstart" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Tillad opstart" - -#: fileItem.js:559 -msgid "Open" -msgstr "Åbn" - -#: fileItem.js:562 -msgid "Cut" -msgstr "Klip" - -#: fileItem.js:563 -msgid "Copy" -msgstr "Kopiér" - -#: fileItem.js:565 -msgid "Rename…" -msgstr "Omdøb …" - -#: fileItem.js:566 -msgid "Move to Trash" -msgstr "Flyt til papirkurven" - -#: fileItem.js:576 -msgid "Empty Trash" -msgstr "Tøm papirkurven" - -#: fileItem.js:582 -msgid "Properties" -msgstr "Egenskaber" - -#: fileItem.js:584 -msgid "Show in Files" -msgstr "Vis i Filer" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Ikonstørrelse" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Angiv størrelsen på skrivebordsikoner." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Vis personlig mappe" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Vis den personlige mappe på skrivebordet." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Vis papirkurvsikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Vis papirkurvsikonet på skrivebordet." - -#~ msgid "Huge" -#~ msgstr "Enorme" diff --git a/extensions/desktop-icons/po/de.po b/extensions/desktop-icons/po/de.po deleted file mode 100644 index ed5a257..0000000 --- a/extensions/desktop-icons/po/de.po +++ /dev/null @@ -1,192 +0,0 @@ -# German translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Mario Blättermann , 2018. -# rugk , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-07 22:46+0000\n" -"PO-Revision-Date: 2019-03-09 15:42+0100\n" -"Last-Translator: Tim Sabsch \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Neuer Ordner" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Erstellen" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Abbrechen" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Ordnernamen dürfen kein »/« enthalten." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Ein Ordner darf nicht ».« genannt werden." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Ein Ordner darf nicht »..« genannt werden." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Ordner mit ».« am Anfang sind verborgen." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Es gibt bereits eine Datei oder einen Ordner mit diesem Namen." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Größe der Arbeitsflächensymbole" - -#: prefs.js:102 -msgid "Small" -msgstr "Klein" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standard" - -#: prefs.js:102 -msgid "Large" -msgstr "Groß" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Den persönlichen Ordner auf der Arbeitsfläche anzeigen" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Papierkorb-Symbol auf der Arbeitsfläche anzeigen" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Neuer Ordner" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Einfügen" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Rückgängig" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Wiederholen" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Schreibtisch in Dateien anzeigen" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Im Terminal öffnen" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Hintergrund ändern …" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Anzeigeeinstellungen" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Einstellungen" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Dateinamen eingeben …" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "OK" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Start nicht erlauben" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Start erlauben" - -#: fileItem.js:574 -msgid "Open" -msgstr "Öffnen" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Mit anderer Anwendung öffnen" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Ausschneiden" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Kopieren" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Umbenennen …" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "In den Papierkorb verschieben" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Papierkorb leeren" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Eigenschaften" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "In Dateiverwaltung anzeigen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Symbolgröße" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Die Größe der Arbeitsflächensymbole festlegen." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Persönlichen Ordner anzeigen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Den persönlichen Ordner auf der Arbeitsfläche anzeigen." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Papierkorb-Symbol anzeigen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Das Papierkorb-Symbol auf der Arbeitsfläche anzeigen." - -#~ msgid "Huge" -#~ msgstr "Riesig" diff --git a/extensions/desktop-icons/po/es.po b/extensions/desktop-icons/po/es.po deleted file mode 100644 index 8cc87da..0000000 --- a/extensions/desktop-icons/po/es.po +++ /dev/null @@ -1,218 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# Sergio Costas , 2018. -# Daniel Mustieles , 2018-2019. -# -msgid "" -msgstr "" -"Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-04 10:37+0100\n" -"Last-Translator: Daniel Mustieles \n" -"Language-Team: es \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 3.31.90\n" - -#: createFolderDialog.js:48 -#| msgid "New Folder" -msgid "New folder name" -msgstr "Nombre de la nueva carpeta" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Crear" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Cancelar" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Los nombres de carpetas no pueden contener «/»." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Una carpeta no se puede llamar «.»." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Una carpeta no se puede llamar «..»." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Las carpetas cuyo nombre empieza por «.» están ocultas." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Ya hay un archivo o carpeta con ese nombre." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Tamaño de los iconos del escritorio" - -#: prefs.js:102 -msgid "Small" -msgstr "Pequeño" - -#: prefs.js:102 -msgid "Standard" -msgstr "Estándar" - -#: prefs.js:102 -msgid "Large" -msgstr "Grande" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Mostrar la carpeta personal en el escritorio" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Mostrar la papelera en el escritorio" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Nueva carpeta" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Pegar" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Deshacer" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Rehacer" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Mostrar el escritorio en Archivos" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Abrir en una terminal" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Cambiar el fondo..." - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Configuración de pantalla" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Configuración" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Introduzca el nombre del archivo…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "Aceptar" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "No permitir lanzar" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Permitir lanzar" - -#: fileItem.js:574 -msgid "Open" -msgstr "Abrir" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Abrir con otra aplicación" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Cortar" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Copiar" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Renombrar…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Mover a la papelera" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Vaciar la papelera" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Propiedades" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Mostrar en Files" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Tamaño de los iconos" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Establece el tamaño de los iconos del escritorio." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Mostrar la carpeta personal" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Mostrar la carpeta personal en el escritorio." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Mostrar la papelera" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Mostrar la papelera en el escritorio." - -#~ msgid "Huge" -#~ msgstr "Inmenso" - -#~ msgid "Ok" -#~ msgstr "Aceptar" - -#~ msgid "huge" -#~ msgstr "inmenso" - -#~ msgid "Maximum width for the icons and filename." -#~ msgstr "Ancho máximo de los iconos y el nombre de fichero." - -#~ msgid "Shows the Documents folder in the desktop." -#~ msgstr "Muestra la carpeta Documentos en el escritorio." - -#~ msgid "Shows the Downloads folder in the desktop." -#~ msgstr "Muestra la carpeta Descargas en el escritorio." - -#~ msgid "Shows the Music folder in the desktop." -#~ msgstr "Muestra la carpeta Música en el escritorio." - -#~ msgid "Shows the Pictures folder in the desktop." -#~ msgstr "Muestra la carpeta Imágenes en el escritorio." - -#~ msgid "Shows the Videos folder in the desktop." -#~ msgstr "Muestra la carpeta Vídeos en el escritorio." diff --git a/extensions/desktop-icons/po/fi.po b/extensions/desktop-icons/po/fi.po deleted file mode 100644 index 71ac40d..0000000 --- a/extensions/desktop-icons/po/fi.po +++ /dev/null @@ -1,191 +0,0 @@ -# Finnish translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Jiri Grönroos , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-02 11:29+0200\n" -"Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" -"Language: fi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Uusi kansion nimi" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Luo" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Peru" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Kansion nimi ei voi sisältää merkkiä “/”." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Kansion nimi ei voi olla “.”." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Kansion nimi ei voi olla “..”." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Kansiot, joiden nimi alkaa merkillä “.”, ovat piilotettuja." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Nimi on jo toisen tiedoston tai kansion käytössä." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Työpöytäkuvakkeiden koko" - -#: prefs.js:102 -msgid "Small" -msgstr "Pieni" - -#: prefs.js:102 -msgid "Standard" -msgstr "Normaali" - -#: prefs.js:102 -msgid "Large" -msgstr "Suuri" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Näytä kotikansio työpöydällä" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Näytä roskakorin kuvake työpöydällä" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Uusi kansio" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Liitä" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Kumoa" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Tee uudeleen" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Näytä työpöytä tiedostonhallinnassa" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Avaa päätteessä" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Vaihda taustakuvaa…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Näytön asetukset" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Asetukset" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Anna tiedostonimi…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "OK" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Älä salli käynnistämistä" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Salli käynnistäminen" - -#: fileItem.js:574 -msgid "Open" -msgstr "Avaa" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Avaa toisella sovelluksella" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Leikkaa" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Kopioi" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Nimeä uudelleen…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Siirrä roskakoriin" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Tyhjennä roskakori" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Ominaisuudet" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Näytä tiedostonhallinnassa" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Kuvakekoko" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Aseta työpöytäkuvakkeiden koko." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Näytä kotikansio" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Näytä kotikansio työpöydällä." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Näytä roskakorin kuvake" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Näytä roskakorin kuvake työpöydällä." - -#~ msgid "Huge" -#~ msgstr "Valtava" diff --git a/extensions/desktop-icons/po/fr.po b/extensions/desktop-icons/po/fr.po deleted file mode 100644 index 13e8f3a..0000000 --- a/extensions/desktop-icons/po/fr.po +++ /dev/null @@ -1,164 +0,0 @@ -# French translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# ghentdebian , 2018. -# Charles Monzat , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-12-14 09:12+0000\n" -"PO-Revision-Date: 2018-12-16 17:47+0100\n" -"Last-Translator: Charles Monzat \n" -"Language-Team: GNOME French Team \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" -"X-Generator: Gtranslator 3.30.0\n" - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Taille des icônes du bureau" - -#: prefs.js:102 -msgid "Small" -msgstr "Petite" - -#: prefs.js:102 -msgid "Standard" -msgstr "Normale" - -#: prefs.js:102 -msgid "Large" -msgstr "Grande" - -#: prefs.js:102 -msgid "Huge" -msgstr "Immense" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Montrer le dossier personnel sur le bureau" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Montrer la corbeille sur le bureau" - -#: desktopGrid.js:182 desktopGrid.js:301 -msgid "New Folder" -msgstr "Nouveau dossier" - -#: desktopGrid.js:303 -msgid "Paste" -msgstr "Coller" - -#: desktopGrid.js:304 -msgid "Undo" -msgstr "Annuler" - -#: desktopGrid.js:305 -msgid "Redo" -msgstr "Refaire" - -#: desktopGrid.js:307 -msgid "Open Desktop in Files" -msgstr "Ouvrir le bureau dans Fichiers" - -#: desktopGrid.js:308 -msgid "Open Terminal" -msgstr "Ouvrir un terminal" - -#: desktopGrid.js:310 -msgid "Change Background…" -msgstr "Changer l’arrière-plan…" - -#: desktopGrid.js:311 -msgid "Display Settings" -msgstr "Configuration d’affichage" - -#: desktopGrid.js:312 -msgid "Settings" -msgstr "Paramètres" - -#: desktopGrid.js:568 -msgid "Enter file name…" -msgstr "Saisir un nom de fichier…" - -#: desktopGrid.js:572 -msgid "OK" -msgstr "Valider" - -#: desktopGrid.js:578 -msgid "Cancel" -msgstr "Annuler" - -#: fileItem.js:485 -msgid "Don’t Allow Launching" -msgstr "Ne pas autoriser le lancement" - -#: fileItem.js:487 -msgid "Allow Launching" -msgstr "Autoriser le lancement" - -#: fileItem.js:550 -msgid "Open" -msgstr "Ouvrir" - -#: fileItem.js:553 -msgid "Cut" -msgstr "Couper" - -#: fileItem.js:554 -msgid "Copy" -msgstr "Copier" - -#: fileItem.js:556 -msgid "Rename" -msgstr "Renommer" - -#: fileItem.js:557 -msgid "Move to Trash" -msgstr "Mettre à la corbeille" - -#: fileItem.js:567 -msgid "Empty Trash" -msgstr "Vider la corbeille" - -#: fileItem.js:573 -msgid "Properties" -msgstr "Propriétés" - -#: fileItem.js:575 -msgid "Show in Files" -msgstr "Montrer dans Fichiers" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Taille d’icônes" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Définir la taille des icônes du bureau." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Montrer le dossier personnel" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Montrer le dossier personnel sur le bureau." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Montrer l’icône de la corbeille" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Montrer la corbeille sur le bureau." - -#~ msgid "Ok" -#~ msgstr "Valider" diff --git a/extensions/desktop-icons/po/fur.po b/extensions/desktop-icons/po/fur.po deleted file mode 100644 index 3ab6129..0000000 --- a/extensions/desktop-icons/po/fur.po +++ /dev/null @@ -1,187 +0,0 @@ -# Friulian translation for desktop-icons. -# Copyright (C) 2019 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Fabio Tomat , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-05 22:20+0100\n" -"Last-Translator: Fabio Tomat \n" -"Language-Team: Friulian \n" -"Language: fur\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Gnûf non de cartele" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Cree" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Anule" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "I nons des cartelis no puedin contignî il caratar “/”" - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Une cartele no pues jessi clamade “.”." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Une cartele no pues jessi clamade “..”." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Lis cartelis cul “.” al inizi dal lôr non a son platadis." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Un file o une cartele cul stes non e esist za." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Dimension pes iconis dal scritori" - -#: prefs.js:102 -msgid "Small" -msgstr "Piçule" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standard" - -#: prefs.js:102 -msgid "Large" -msgstr "Largje" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Mostre la cartele personâl intal scritori" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Mostre la icone de scovacere intal scritori" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Gnove cartele" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Tache" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Anule" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Torne fâ" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Mostre Scritori in File" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Vierç in Terminâl" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Cambie sfont…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Impostazions visôr" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Impostazions" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Inserìs il non dal file…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "Va ben" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "No sta permeti inviament" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Permet inviament" - -#: fileItem.js:574 -msgid "Open" -msgstr "Vierç" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Vierç cuntune altre aplicazion" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Taie" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Copie" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Cambie non..." - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Sposte te scovacere" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Disvuede scovacere" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Propietâts" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Mostre in File" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Dimension icone" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Stabilìs la dimension pes iconis dal scritori." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Mostre cartele personâl" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Mostre la cartele personâl intal scritori." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Mostre la icone de scovacere" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Mostre la icone de scovacere intal scritori." diff --git a/extensions/desktop-icons/po/hr.po b/extensions/desktop-icons/po/hr.po deleted file mode 100644 index 0d26696..0000000 --- a/extensions/desktop-icons/po/hr.po +++ /dev/null @@ -1,186 +0,0 @@ -# Croatian translation for gnome-shell-extension-desktop-icons -# Copyright (c) 2019 Rosetta Contributors and Canonical Ltd 2019 -# This file is distributed under the same license as the gnome-shell-extension-desktop-icons package. -# FIRST AUTHOR , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: gnome-shell-extension-desktop-icons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2019-03-05 11:27+0000\n" -"PO-Revision-Date: 2019-03-23 16:03+0000\n" -"Last-Translator: gogo \n" -"Language-Team: Croatian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2019-03-27 09:36+0000\n" -"X-Generator: Launchpad (build 18910)\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Novi naziv mape" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Stvori" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Odustani" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Naziv mape ne može sadržavati “/”." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Mapa se ne može nazvati “.”." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Mapa se ne može nazvati “..”." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Mape sa “.” na početku njihovih naziva su skrivene." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Već postoji datoteka ili mapa s tim nazivom." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Veličina ikona radne površine" - -#: prefs.js:102 -msgid "Small" -msgstr "Male" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standardne" - -#: prefs.js:102 -msgid "Large" -msgstr "Velike" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Prikaži osobnu mapu na radnoj površini" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Prikaži mapu smeća na radnoj površini" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Nova mapa" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Zalijepi" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Poništi" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Ponovi" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Prikaži radnu površinu u Datotekama" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Otvori u Terminalu" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Promijeni pozadinu…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Postavke zaslona" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Postavke" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Upiši naziv datoteke…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "U redu" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Ne dopuštaj pokretanje" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Dopusti pokretanje" - -#: fileItem.js:574 -msgid "Open" -msgstr "Otvori" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Otvori s drugom aplikacijom" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Izreži" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Kopiraj" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Preimenuj…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Premjesti u smeće" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Isprazni smeće" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Svojstva" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Prikaži u Datotekama" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Veličina ikona" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Postavi veličinu ikona radne površine." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Prikaži osobnu mapu" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Prikaži osobnu mapu na radnoj površini." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Prikaži ikonu smeća" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Prikaži ikonu smeća na radnoj površini." diff --git a/extensions/desktop-icons/po/hu.po b/extensions/desktop-icons/po/hu.po deleted file mode 100644 index a350dd1..0000000 --- a/extensions/desktop-icons/po/hu.po +++ /dev/null @@ -1,190 +0,0 @@ -# Hungarian translation for desktop-icons. -# Copyright (C) 2019 The Free Software Foundation, inc. -# This file is distributed under the same license as the desktop-icons package. -# -# Balázs Úr , 2019. -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-i" -"cons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-07 23:45+0100\n" -"Last-Translator: Balázs Úr \n" -"Language-Team: Hungarian \n" -"Language: hu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Lokalize 2.0\n" - -#: createFolderDialog.js:48 -#| msgid "New Folder" -msgid "New folder name" -msgstr "Új mappa neve" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Létrehozás" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Mégse" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "A mappanevek nem tartalmazhatnak „/” karaktert." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Egy mappának nem lehet „.” a neve." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Egy mappának nem lehet „..” a neve." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "A „.” karakterrel kezdődő nevű mappák rejtettek." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Már van egy fájl vagy mappa azzal a névvel." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Az asztali ikonok mérete" - -#: prefs.js:102 -msgid "Small" -msgstr "Kicsi" - -#: prefs.js:102 -msgid "Standard" -msgstr "Szabványos" - -#: prefs.js:102 -msgid "Large" -msgstr "Nagy" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "A személyes mappa megjelenítése az asztalon" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "A kuka ikon megjelenítése az asztalon" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Új mappa" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Beillesztés" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Visszavonás" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Újra" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Asztal megjelenítése a Fájlokban" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Megnyitás terminálban" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Háttér megváltoztatása…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Megjelenítés beállításai" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Beállítások" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Adjon meg egy fájlnevet…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "Rendben" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Ne engedélyezzen indítást" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Indítás engedélyezése" - -#: fileItem.js:574 -msgid "Open" -msgstr "Megnyitás" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Megnyitás egyéb alkalmazással" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Kivágás" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Másolás" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Átnevezés…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Áthelyezés a Kukába" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Kuka ürítése" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Tulajdonságok" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Megjelenítés a Fájlokban" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Ikonméret" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Az asztali ikonok méretének beállítása." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Személyes mappa megjelenítése" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "A személyes mappa megjelenítése az asztalon." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Kuka ikon megjelenítése" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "A kuka ikon megjelenítése az asztalon." - diff --git a/extensions/desktop-icons/po/id.po b/extensions/desktop-icons/po/id.po deleted file mode 100644 index b809c3d..0000000 --- a/extensions/desktop-icons/po/id.po +++ /dev/null @@ -1,190 +0,0 @@ -# Indonesian translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Kukuh Syafaat , 2018, 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-02 19:13+0700\n" -"Last-Translator: Kukuh Syafaat \n" -"Language-Team: Indonesian \n" -"Language: id\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Nama folder baru" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Buat" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Batal" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Nama folder tak boleh memuat \"/\"." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Sebuah folder tak bisa dinamai \".\"." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Sebuah folder tak bisa dinamai \"..\"." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Folder dengan \".\" di awal nama mereka disembunyikan." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Folder dengan nama itu sudah ada." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Ukuran untuk ikon destop" - -#: prefs.js:102 -msgid "Small" -msgstr "Kecil" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standar" - -#: prefs.js:102 -msgid "Large" -msgstr "Besar" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Tampilkan folder pribadi di destop" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Tampilkan ikon tong sampah di destop" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Folder Baru" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Tempel" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Tak Jadi" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Jadi Lagi" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Tampilkan Destop pada Berkas" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Buka dalam Terminal" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Ubah Latar Belakang…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Pengaturan Tampilan" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Pengaturan" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Masukkan nama berkas…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "OK" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Jangan Izinkan Peluncuran" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Izinkan Peluncuran" - -#: fileItem.js:574 -msgid "Open" -msgstr "Buka" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Buka Dengan Aplikasi Lain" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Potong" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Salin" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Ganti Nama…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Pindahkan ke Tong Sampah" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Kosongkan Tong Sampah" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Properti" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Tampilkan pada Berkas" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Ukuran ikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Set ukuran untuk ikon destop." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Tampilkan folder pribadi" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Tampilkan folder pribadi di destop." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Tampilkan ikon tong sampah" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Tampilkan ikon tong sampah di destop." - -#~ msgid "Huge" -#~ msgstr "Sangat besar" diff --git a/extensions/desktop-icons/po/it.po b/extensions/desktop-icons/po/it.po deleted file mode 100644 index 5001da4..0000000 --- a/extensions/desktop-icons/po/it.po +++ /dev/null @@ -1,189 +0,0 @@ -# Italian translation for desktop-icons. -# Copyright (C) 2019 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Massimo Branchini , 2019. -# Milo Casagrande , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-12 09:51+0100\n" -"Last-Translator: Milo Casagrande \n" -"Language-Team: Italian \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Nuova cartella" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Crea" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Annulla" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "I nomi di cartelle non possono contenere il carattere «/»" - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Una cartella non può essere chiamata «.»." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Una cartella non può essere chiamata «..»." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Cartelle il cui nome inizia con «.» sono nascoste." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Esiste già un file o una cartella con quel nome." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Dimensione delle icone della scrivania" - -#: prefs.js:102 -msgid "Small" -msgstr "Piccola" - -#: prefs.js:102 -msgid "Standard" -msgstr "Normale" - -#: prefs.js:102 -msgid "Large" -msgstr "Grande" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Mostra la cartella personale sulla scrivania" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Mostra il cestino sulla scrivania" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Nuova cartella" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Incolla" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Annulla" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Ripeti" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Mostra la scrivania in File" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Apri in Terminale" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Cambia lo sfondo…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Impostazioni dello schermo" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Impostazioni" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Indicare un nome per il file…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "Ok" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Non permettere l'esecuzione" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Permetti l'esecuzione" - -#: fileItem.js:574 -msgid "Open" -msgstr "Apri" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Apri con altra applicazione" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Taglia" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Copia" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Rinomina…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Sposta nel cestino" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Svuota il cestino" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Proprietà" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Mostra in File" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Dimensione dell'icona" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Imposta la grandezza delle icone della scrivania." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Mostra la cartella personale" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Mostra la cartella personale sulla scrivania." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Mostra il cestino" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Mostra il cestino sulla scrivania." diff --git a/extensions/desktop-icons/po/ja.po b/extensions/desktop-icons/po/ja.po deleted file mode 100644 index 3b103e0..0000000 --- a/extensions/desktop-icons/po/ja.po +++ /dev/null @@ -1,187 +0,0 @@ -# Japanese translation for desktop-icons. -# Copyright (C) 2019 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# sicklylife , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-14 12:56+0000\n" -"PO-Revision-Date: 2019-03-15 06:30+0000\n" -"Last-Translator: sicklylife \n" -"Language-Team: Japanese \n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "新しいフォルダー名" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "作成" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "キャンセル" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "“/”は、フォルダー名に含められません。" - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "“.”という名前をフォルダーに付けられません。" - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "“..”という名前をフォルダーに付けられません。" - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "名前が“.”で始まるフォルダーは、隠しフォルダーになります。" - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "その名前のファイルかフォルダーがすでに存在します。" - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "デスクトップアイコンのサイズ" - -#: prefs.js:102 -msgid "Small" -msgstr "小さい" - -#: prefs.js:102 -msgid "Standard" -msgstr "標準" - -#: prefs.js:102 -msgid "Large" -msgstr "大きい" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "デスクトップにホームフォルダーを表示する" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "デスクトップにゴミ箱を表示する" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "新しいフォルダー" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "貼り付け" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "元に戻す" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "やり直す" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "“ファイル”でデスクトップを表示する" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "端末を開く" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "背景を変更する…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "ディスプレイの設定" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "設定" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "ファイル名を入力してください…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "OK" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "起動を許可しない" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "起動を許可する" - -#: fileItem.js:574 -msgid "Open" -msgstr "開く" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "別のアプリケーションで開く" - -#: fileItem.js:582 -msgid "Cut" -msgstr "切り取り" - -#: fileItem.js:583 -msgid "Copy" -msgstr "コピー" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "名前の変更…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "ゴミ箱へ移動する" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "ゴミ箱を空にする" - -#: fileItem.js:602 -msgid "Properties" -msgstr "プロパティ" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "“ファイル”で表示する" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "アイコンサイズ" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "デスクトップのアイコンサイズを設定します。" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "ホームフォルダーを表示する" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "デスクトップにホームフォルダーを表示します。" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "ゴミ箱アイコンを表示する" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "デスクトップにゴミ箱のアイコンを表示します。" diff --git a/extensions/desktop-icons/po/meson.build b/extensions/desktop-icons/po/meson.build deleted file mode 100644 index b2e9e42..0000000 --- a/extensions/desktop-icons/po/meson.build +++ /dev/null @@ -1 +0,0 @@ -i18n.gettext (meson.project_name (), preset: 'glib') diff --git a/extensions/desktop-icons/po/nl.po b/extensions/desktop-icons/po/nl.po deleted file mode 100644 index b2f7dab..0000000 --- a/extensions/desktop-icons/po/nl.po +++ /dev/null @@ -1,188 +0,0 @@ -# Dutch translation for desktop-icons. -# Copyright (C) 2019 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Nathan Follens , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-04 19:46+0100\n" -"Last-Translator: Nathan Follens \n" -"Language-Team: Dutch \n" -"Language: nl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Nieuwe mapnaam" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Aanmaken" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Annuleren" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Mapnamen kunnen geen ‘/’ bevatten." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Een map kan niet ‘.’ worden genoemd." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Een map kan niet ‘..’ worden genoemd." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Mappen waarvan de naam begint met ‘.’ zijn verborgen." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Er bestaat al een bestand of map met die naam." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Grootte van bureaubladpictogrammen" - -#: prefs.js:102 -msgid "Small" -msgstr "Klein" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standaard" - -#: prefs.js:102 -msgid "Large" -msgstr "Groot" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Toon de persoonlijke map op het bureaublad" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Toon het prullenbakpictogram op het bureaublad" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Nieuwe map" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Plakken" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Ongedaan maken" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Opnieuw" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Bureaublad tonen in Bestanden" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Openen in terminalvenster" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Achtergrond aanpassen…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Scherminstellingen" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Instellingen" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Voer bestandsnaam in…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "Oké" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Toepassingen starten niet toestaan" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Toepassingen starten toestaan" - -#: fileItem.js:574 -msgid "Open" -msgstr "Openen" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Met andere toepassing openen" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Knippen" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Kopiëren" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Hernoemen…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Verplaatsen naar prullenbak" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Prullenbak legen" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Eigenschappen" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Tonen in Bestanden" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Pictogramgrootte" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Stel de grootte van de bureaubladpictogrammen in." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Persoonlijke map tonen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Toon de persoonlijke map op het bureaublad." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Prullenbakpictogram tonen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Toon het prullenbakpictogram op het bureaublad." diff --git a/extensions/desktop-icons/po/pl.po b/extensions/desktop-icons/po/pl.po deleted file mode 100644 index f57b3be..0000000 --- a/extensions/desktop-icons/po/pl.po +++ /dev/null @@ -1,193 +0,0 @@ -# Polish translation for desktop-icons. -# Copyright © 2018-2019 the desktop-icons authors. -# This file is distributed under the same license as the desktop-icons package. -# Piotr Drąg , 2018-2019. -# Aviary.pl , 2018-2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-04-29 14:11+0000\n" -"PO-Revision-Date: 2019-05-01 13:03+0200\n" -"Last-Translator: Piotr Drąg \n" -"Language-Team: Polish \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Nazwa nowego katalogu" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Utwórz" - -#: createFolderDialog.js:74 desktopGrid.js:592 -msgid "Cancel" -msgstr "Anuluj" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Nazwy katalogów nie mogą zawierać znaku „/”." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Katalog nie może mieć nazwy „.”." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Katalog nie może mieć nazwy „..”." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Katalogi z „.” na początku nazwy są ukryte." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Plik lub katalog o tej nazwie już istnieje." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Rozmiar ikon na pulpicie" - -#: prefs.js:102 -msgid "Small" -msgstr "Mały" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standardowy" - -#: prefs.js:102 -msgid "Large" -msgstr "Duży" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Katalog domowy na pulpicie" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Kosz na pulpicie" - -#: desktopGrid.js:323 -msgid "New Folder" -msgstr "Nowy katalog" - -#: desktopGrid.js:325 -msgid "Paste" -msgstr "Wklej" - -#: desktopGrid.js:326 -msgid "Undo" -msgstr "Cofnij" - -#: desktopGrid.js:327 -msgid "Redo" -msgstr "Ponów" - -#: desktopGrid.js:329 -msgid "Show Desktop in Files" -msgstr "Wyświetl pulpit w menedżerze plików" - -#: desktopGrid.js:330 fileItem.js:610 -msgid "Open in Terminal" -msgstr "Otwórz w terminalu" - -#: desktopGrid.js:332 -msgid "Change Background…" -msgstr "Zmień tło…" - -#: desktopGrid.js:334 -msgid "Display Settings" -msgstr "Ustawienia ekranu" - -#: desktopGrid.js:335 -msgid "Settings" -msgstr "Ustawienia" - -#: desktopGrid.js:582 -msgid "Enter file name…" -msgstr "Nazwa pliku…" - -#: desktopGrid.js:586 -msgid "OK" -msgstr "OK" - -#: desktopIconsUtil.js:61 -msgid "Command not found" -msgstr "Nie odnaleziono polecenia" - -#: fileItem.js:494 -msgid "Don’t Allow Launching" -msgstr "Nie zezwalaj na uruchamianie" - -#: fileItem.js:496 -msgid "Allow Launching" -msgstr "Zezwól na uruchamianie" - -#: fileItem.js:578 -msgid "Open" -msgstr "Otwórz" - -#: fileItem.js:582 -msgid "Open With Other Application" -msgstr "Otwórz za pomocą innego programu" - -#: fileItem.js:586 -msgid "Cut" -msgstr "Wytnij" - -#: fileItem.js:587 -msgid "Copy" -msgstr "Skopiuj" - -#: fileItem.js:589 -msgid "Rename…" -msgstr "Zmień nazwę…" - -#: fileItem.js:590 -msgid "Move to Trash" -msgstr "Przenieś do kosza" - -#: fileItem.js:600 -msgid "Empty Trash" -msgstr "Opróżnij kosz" - -#: fileItem.js:606 -msgid "Properties" -msgstr "Właściwości" - -#: fileItem.js:608 -msgid "Show in Files" -msgstr "Wyświetl w menedżerze plików" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Rozmiar ikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Ustawia rozmiar ikon na pulpicie." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Katalog domowy" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Wyświetla katalog domowy na pulpicie." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Kosz" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Wyświetla kosz na pulpicie." diff --git a/extensions/desktop-icons/po/pt_BR.po b/extensions/desktop-icons/po/pt_BR.po deleted file mode 100644 index 8d61c72..0000000 --- a/extensions/desktop-icons/po/pt_BR.po +++ /dev/null @@ -1,199 +0,0 @@ -# Brazilian Portuguese translation for desktop-icons. -# Copyright (C) 2019 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Enrico Nicoletto , 2018. -# Rafael Fontenelle , 2018-2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-04-29 14:11+0000\n" -"PO-Revision-Date: 2019-04-29 17:35-0300\n" -"Last-Translator: Rafael Fontenelle \n" -"Language-Team: Brazilian Portuguese \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" -"X-Generator: Gtranslator 3.32.0\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Nome da nova pasta" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Criar" - -#: createFolderDialog.js:74 desktopGrid.js:592 -msgid "Cancel" -msgstr "Cancelar" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Nomes de pastas não podem conter “/”." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Uma pasta não pode ser chamada “.”." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Uma pasta não pode ser chamada “..”." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Pastas com “.” no começo de seus nomes são ocultas." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Já existe um arquivo ou uma pasta com esse nome." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Tamanho para os ícones da área de trabalho" - -#: prefs.js:102 -msgid "Small" -msgstr "Pequeno" - -#: prefs.js:102 -msgid "Standard" -msgstr "Padrão" - -#: prefs.js:102 -msgid "Large" -msgstr "Grande" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Mostrar a pasta pessoal na área de trabalho" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Mostrar o ícone da lixeira na área de trabalho" - -#: desktopGrid.js:323 -msgid "New Folder" -msgstr "Nova pasta" - -#: desktopGrid.js:325 -msgid "Paste" -msgstr "Colar" - -#: desktopGrid.js:326 -msgid "Undo" -msgstr "Desfazer" - -#: desktopGrid.js:327 -msgid "Redo" -msgstr "Refazer" - -#: desktopGrid.js:329 -msgid "Show Desktop in Files" -msgstr "Mostrar a área de trabalho no Arquivos" - -#: desktopGrid.js:330 fileItem.js:610 -msgid "Open in Terminal" -msgstr "Abrir no terminal" - -#: desktopGrid.js:332 -msgid "Change Background…" -msgstr "Alterar plano de fundo…" - -#: desktopGrid.js:334 -msgid "Display Settings" -msgstr "Configurações de exibição" - -#: desktopGrid.js:335 -msgid "Settings" -msgstr "Configurações" - -#: desktopGrid.js:582 -msgid "Enter file name…" -msgstr "Insira um nome de arquivo…" - -#: desktopGrid.js:586 -msgid "OK" -msgstr "OK" - -#: desktopIconsUtil.js:61 -msgid "Command not found" -msgstr "Comando não encontrado" - -#: fileItem.js:494 -msgid "Don’t Allow Launching" -msgstr "Não permitir iniciar" - -#: fileItem.js:496 -msgid "Allow Launching" -msgstr "Permitir iniciar" - -#: fileItem.js:578 -msgid "Open" -msgstr "Abrir" - -#: fileItem.js:582 -msgid "Open With Other Application" -msgstr "Abrir com outro aplicativo" - -#: fileItem.js:586 -msgid "Cut" -msgstr "Recortar" - -#: fileItem.js:587 -msgid "Copy" -msgstr "Copiar" - -#: fileItem.js:589 -msgid "Rename…" -msgstr "Renomear…" - -#: fileItem.js:590 -msgid "Move to Trash" -msgstr "Mover para a lixeira" - -#: fileItem.js:600 -msgid "Empty Trash" -msgstr "Esvaziar lixeira" - -#: fileItem.js:606 -msgid "Properties" -msgstr "Propriedades" - -#: fileItem.js:608 -msgid "Show in Files" -msgstr "Mostrar no Arquivos" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Tamanho do ícone" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Define o tamanho para os ícones da área de trabalho." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Mostrar pasta pessoal" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Mostra a pasta pessoal na área de trabalho." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Mostrar ícone da lixeira" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Mostra o ícone da lixeira na área de trabalho." - -#~ msgid "Huge" -#~ msgstr "Enorme" - -#~ msgid "Ok" -#~ msgstr "Ok" diff --git a/extensions/desktop-icons/po/ru.po b/extensions/desktop-icons/po/ru.po deleted file mode 100644 index 4094f16..0000000 --- a/extensions/desktop-icons/po/ru.po +++ /dev/null @@ -1,153 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Eaglers , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-11-22 08:42+0000\n" -"PO-Revision-Date: 2018-11-22 22:02+0300\n" -"Last-Translator: Stas Solovey \n" -"Language-Team: Russian \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 2.2\n" - -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "Размер значков" - -#: prefs.js:89 -msgid "Small" -msgstr "Маленький" - -#: prefs.js:89 -msgid "Standard" -msgstr "Стандартный" - -#: prefs.js:89 -msgid "Large" -msgstr "Большой" - -#: prefs.js:89 -msgid "Huge" -msgstr "Огромный" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "Показывать домашнюю папку на рабочем столе" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "Показывать «Корзину» на рабочем столе" - -#: desktopGrid.js:185 desktopGrid.js:304 -msgid "New Folder" -msgstr "Создать папку" - -#: desktopGrid.js:306 -msgid "Paste" -msgstr "Вставить" - -#: desktopGrid.js:307 -msgid "Undo" -msgstr "Отменить" - -#: desktopGrid.js:308 -msgid "Redo" -msgstr "Повторить" - -#: desktopGrid.js:310 -msgid "Open Desktop in Files" -msgstr "Открыть «Рабочий стол» в «Файлах»" - -#: desktopGrid.js:311 -msgid "Open Terminal" -msgstr "Открыть терминал" - -#: desktopGrid.js:313 -msgid "Change Background…" -msgstr "Изменить фон…" - -#: desktopGrid.js:314 -msgid "Display Settings" -msgstr "Настройки дисплея" - -#: desktopGrid.js:315 -msgid "Settings" -msgstr "Параметры" - -#: desktopGrid.js:569 -msgid "Enter file name…" -msgstr "Ввести имя файла…" - -#: desktopGrid.js:573 -msgid "Ok" -msgstr "ОК" - -#: desktopGrid.js:579 -msgid "Cancel" -msgstr "Отмена" - -#: fileItem.js:390 -msgid "Open" -msgstr "Открыть" - -#: fileItem.js:393 -msgid "Cut" -msgstr "Вырезать" - -#: fileItem.js:394 -msgid "Copy" -msgstr "Вставить" - -#: fileItem.js:395 -msgid "Rename" -msgstr "Переименовать" - -#: fileItem.js:396 -msgid "Move to Trash" -msgstr "Переместить в корзину" - -#: fileItem.js:400 -msgid "Empty trash" -msgstr "Очистить корзину" - -#: fileItem.js:406 -msgid "Properties" -msgstr "Свойства" - -#: fileItem.js:408 -msgid "Show in Files" -msgstr "Показать в «Файлах»" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Размер значков" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Установить размер значков на рабочем столе." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Показывать домашнюю папку" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Показывать значок домашней папки на рабочем столе." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Показывать значок корзины" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Показывать значок корзины на рабочем столе." diff --git a/extensions/desktop-icons/po/sv.po b/extensions/desktop-icons/po/sv.po deleted file mode 100644 index 928cbe9..0000000 --- a/extensions/desktop-icons/po/sv.po +++ /dev/null @@ -1,197 +0,0 @@ -# Swedish translation for desktop-icons. -# Copyright © 2018, 2019 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Anders Jonsson , 2018, 2019. -# Josef Andersson , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-01 12:11+0000\n" -"PO-Revision-Date: 2019-03-11 21:50+0100\n" -"Last-Translator: Anders Jonsson \n" -"Language-Team: Swedish \n" -"Language: sv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Nytt mappnamn" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Skapa" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "Avbryt" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Mappnamn kan inte innehålla ”/”." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "En mapp kan inte kallas ”.”." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "En mapp kan inte kallas ”..”." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Mappar med ”.” i början på sitt namn är dolda." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Det finns redan en fil eller mapp med det namnet" - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Storlek för skrivbordsikonerna" - -#: prefs.js:102 -msgid "Small" -msgstr "Liten" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standard" - -#: prefs.js:102 -msgid "Large" -msgstr "Stor" - -# TODO: *ON* the desktop? -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Visa den personliga mappen på skrivbordet" - -# TODO: *ON* the desktop? -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Visa papperskorgsikonen på skrivbordet" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Ny mapp" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Klistra in" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Ångra" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Gör om" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Visa skrivbord i Filer" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Öppna i terminal" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Ändra bakgrund…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Visningsinställningar" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Inställningar" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Ange filnamn…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "OK" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Tillåt ej programstart" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Tillåt programstart" - -#: fileItem.js:574 -msgid "Open" -msgstr "Öppna" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Öppna med annat program" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Klipp ut" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Kopiera" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Byt namn…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Flytta till papperskorgen" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Töm papperskorgen" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Egenskaper" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Visa i Filer" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Ikonstorlek" - -# TODO: *ON* the desktop? -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Ställ in storleken för skrivbordsikonerna." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Visa personlig mapp" - -# TODO: *ON* the desktop? -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Visa den personliga mappen på skrivbordet." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Visa papperskorgsikon" - -# TODO: *ON* the desktop? -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Visa papperskorgsikonen på skrivbordet." - -#~ msgid "Huge" -#~ msgstr "Enorm" diff --git a/extensions/desktop-icons/po/tr.po b/extensions/desktop-icons/po/tr.po deleted file mode 100644 index 2e5f5a7..0000000 --- a/extensions/desktop-icons/po/tr.po +++ /dev/null @@ -1,191 +0,0 @@ -# Turkish translation for desktop-icons. -# Copyright (C) 2000-2019 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# -# Sabri Ünal , 2019. -# Serdar Sağlam , 2019 -# Emin Tufan Çetin , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-03-09 14:47+0000\n" -"PO-Revision-Date: 2019-03-13 13:43+0300\n" -"Last-Translator: Emin Tufan Çetin \n" -"Language-Team: Türkçe \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Gtranslator 3.30.1\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: createFolderDialog.js:48 -msgid "New folder name" -msgstr "Yeni klasör adı" - -#: createFolderDialog.js:72 -msgid "Create" -msgstr "Oluştur" - -#: createFolderDialog.js:74 desktopGrid.js:586 -msgid "Cancel" -msgstr "İptal" - -#: createFolderDialog.js:145 -msgid "Folder names cannot contain “/”." -msgstr "Klasör adları “/” içeremez." - -#: createFolderDialog.js:148 -msgid "A folder cannot be called “.”." -msgstr "Bir klasör “.” olarak adlandırılamaz." - -#: createFolderDialog.js:151 -msgid "A folder cannot be called “..”." -msgstr "Bir klasör “..” olarak adlandırılamaz." - -#: createFolderDialog.js:153 -msgid "Folders with “.” at the beginning of their name are hidden." -msgstr "Adlarının başında “.” bulunan klasörler gizlenir." - -#: createFolderDialog.js:155 -msgid "There is already a file or folder with that name." -msgstr "Zaten bu adda bir dosya veya klasör var." - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Masaüstü simgeleri boyutu" - -#: prefs.js:102 -msgid "Small" -msgstr "Küçük" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standart" - -#: prefs.js:102 -msgid "Large" -msgstr "Büyük" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Kişisel klasörü masaüstünde göster" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Çöp kutusunu masaüstünde göster" - -#: desktopGrid.js:320 -msgid "New Folder" -msgstr "Yeni Klasör" - -#: desktopGrid.js:322 -msgid "Paste" -msgstr "Yapıştır" - -#: desktopGrid.js:323 -msgid "Undo" -msgstr "Geri Al" - -#: desktopGrid.js:324 -msgid "Redo" -msgstr "Yinele" - -#: desktopGrid.js:326 -msgid "Show Desktop in Files" -msgstr "Masaüstünü Dosyalarʼda Göster" - -#: desktopGrid.js:327 fileItem.js:606 -msgid "Open in Terminal" -msgstr "Uçbirimde Aç" - -#: desktopGrid.js:329 -msgid "Change Background…" -msgstr "Arka Planı Değiştir…" - -#: desktopGrid.js:331 -msgid "Display Settings" -msgstr "Görüntü Ayarları" - -#: desktopGrid.js:332 -msgid "Settings" -msgstr "Ayarlar" - -#: desktopGrid.js:576 -msgid "Enter file name…" -msgstr "Dosya adını gir…" - -#: desktopGrid.js:580 -msgid "OK" -msgstr "Tamam" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Başlatmaya İzin Verme" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Başlatmaya İzin Ver" - -#: fileItem.js:574 -msgid "Open" -msgstr "Aç" - -#: fileItem.js:578 -msgid "Open With Other Application" -msgstr "Başka Uygulamayla Aç" - -#: fileItem.js:582 -msgid "Cut" -msgstr "Kes" - -#: fileItem.js:583 -msgid "Copy" -msgstr "Kopyala" - -#: fileItem.js:585 -msgid "Rename…" -msgstr "Yeniden Adlandır…" - -#: fileItem.js:586 -msgid "Move to Trash" -msgstr "Çöpe Taşı" - -#: fileItem.js:596 -msgid "Empty Trash" -msgstr "Çöpü Boşalt" - -#: fileItem.js:602 -msgid "Properties" -msgstr "Özellikler" - -#: fileItem.js:604 -msgid "Show in Files" -msgstr "Dosyalarʼda Göster" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Simge boyutu" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Masaüstü simgelerinin boyutunu ayarla." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Kişisel klasörü göster" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Kişisel klasörü masaüstünde göster." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Çöp kutusunu göster" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Çöp kutusu simgesini masaüstünde göster." diff --git a/extensions/desktop-icons/po/zh_TW.po b/extensions/desktop-icons/po/zh_TW.po deleted file mode 100644 index 8ce4ab9..0000000 --- a/extensions/desktop-icons/po/zh_TW.po +++ /dev/null @@ -1,135 +0,0 @@ -# Chinese (Taiwan) translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Yi-Jyun Pan , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-22 14:12+0000\n" -"PO-Revision-Date: 2018-10-24 21:31+0800\n" -"Language-Team: Chinese (Taiwan) \n" -"Language: zh_TW\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Last-Translator: pan93412 \n" -"X-Generator: Poedit 2.2\n" - -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "桌面圖示的大小" - -#: prefs.js:89 -msgid "Small" -msgstr "小圖示" - -#: prefs.js:89 -msgid "Standard" -msgstr "標準大小圖示" - -#: prefs.js:89 -msgid "Large" -msgstr "大圖示" - -#: prefs.js:89 -msgid "Huge" -msgstr "巨大圖示" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "在桌面顯示個人資料夾" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "在桌面顯示垃圾桶圖示" - -#: desktopGrid.js:178 desktopGrid.js:297 -msgid "New Folder" -msgstr "新增資料夾" - -#: desktopGrid.js:299 -msgid "Paste" -msgstr "貼上" - -#: desktopGrid.js:300 -msgid "Undo" -msgstr "復原" - -#: desktopGrid.js:301 -msgid "Redo" -msgstr "重做" - -#: desktopGrid.js:303 -msgid "Open Desktop in Files" -msgstr "在《檔案》中開啟桌面" - -#: desktopGrid.js:304 -msgid "Open Terminal" -msgstr "開啟終端器" - -#: desktopGrid.js:306 -msgid "Change Background…" -msgstr "變更背景圖片…" - -#: desktopGrid.js:307 -msgid "Display Settings" -msgstr "顯示設定" - -#: desktopGrid.js:308 -msgid "Settings" -msgstr "設定" - -#: fileItem.js:223 -msgid "Open" -msgstr "開啟" - -#: fileItem.js:226 -msgid "Cut" -msgstr "剪下" - -#: fileItem.js:227 -msgid "Copy" -msgstr "複製" - -#: fileItem.js:228 -msgid "Move to Trash" -msgstr "移動到垃圾桶" - -#: fileItem.js:232 -msgid "Empty trash" -msgstr "清空回收桶" - -#: fileItem.js:238 -msgid "Properties" -msgstr "屬性" - -#: fileItem.js:240 -msgid "Show in Files" -msgstr "在《檔案》中顯示" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "圖示大小" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "設定桌面圖示的大小。" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "顯示個人資料夾" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "在桌面顯示個人資料夾。" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "顯示垃圾桶圖示" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "在桌面顯示垃圾桶圖示。" diff --git a/extensions/desktop-icons/prefs.js b/extensions/desktop-icons/prefs.js deleted file mode 100644 index 4b8d986..0000000 --- a/extensions/desktop-icons/prefs.js +++ /dev/null @@ -1,159 +0,0 @@ - -/* Desktop Icons GNOME Shell extension - * - * Copyright (C) 2017 Carlos Soriano - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -const Gtk = imports.gi.Gtk; -const GObject = imports.gi.GObject; -const Gio = imports.gi.Gio; -const GioSSS = Gio.SettingsSchemaSource; -const ExtensionUtils = imports.misc.extensionUtils; -const Gettext = imports.gettext; - -const Config = imports.misc.config; - -var _ = Gettext.domain('desktop-icons').gettext; - -const SCHEMA_NAUTILUS = 'org.gnome.nautilus.preferences'; -const SCHEMA_GTK = 'org.gtk.Settings.FileChooser'; -const SCHEMA = 'org.gnome.shell.extensions.desktop-icons'; - -const ICON_SIZE = { 'small': 48, 'standard': 64, 'large': 96 }; -const ICON_WIDTH = { 'small': 120, 'standard': 128, 'large': 128 }; -const ICON_HEIGHT = { 'small': 98, 'standard': 114, 'large': 146 }; - -var FileType = { - NONE: null, - USER_DIRECTORY_HOME: 'show-home', - USER_DIRECTORY_TRASH: 'show-trash', -} - -var nautilusSettings; -var gtkSettings; -var settings; -// This is already in Nautilus settings, so it should not be made tweakable here -var CLICK_POLICY_SINGLE = false; - -function initTranslations() { - let extension = ExtensionUtils.getCurrentExtension(); - - let localedir = extension.dir.get_child('locale'); - if (localedir.query_exists(null)) - Gettext.bindtextdomain('desktop-icons', localedir.get_path()); - else - Gettext.bindtextdomain('desktop-icons', Config.LOCALEDIR); -} - -function init() { - let schemaSource = GioSSS.get_default(); - let schemaGtk = schemaSource.lookup(SCHEMA_GTK, true); - gtkSettings = new Gio.Settings({ settings_schema: schemaGtk }); - let schemaObj = schemaSource.lookup(SCHEMA_NAUTILUS, true); - if (!schemaObj) { - nautilusSettings = null; - } else { - nautilusSettings = new Gio.Settings({ settings_schema: schemaObj });; - nautilusSettings.connect('changed', _onNautilusSettingsChanged); - _onNautilusSettingsChanged(); - } - settings = get_schema(SCHEMA); -} - -function get_schema(schema) { - let extension = ExtensionUtils.getCurrentExtension(); - - // check if this extension was built with "make zip-file", and thus - // has the schema files in a subfolder - // otherwise assume that extension has been installed in the - // same prefix as gnome-shell (and therefore schemas are available - // in the standard folders) - let schemaDir = extension.dir.get_child('schemas'); - let schemaSource; - if (schemaDir.query_exists(null)) - schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), GioSSS.get_default(), false); - else - schemaSource = GioSSS.get_default(); - - let schemaObj = schemaSource.lookup(schema, true); - if (!schemaObj) - throw new Error('Schema ' + schema + ' could not be found for extension ' + extension.metadata.uuid + '. Please check your installation.'); - - return new Gio.Settings({ settings_schema: schemaObj }); -} - -function buildPrefsWidget() { - initTranslations(); - let frame = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, border_width: 10, spacing: 10 }); - - frame.add(buildSelector('icon-size', _("Size for the desktop icons"), { 'small': _("Small"), 'standard': _("Standard"), 'large': _("Large") })); - frame.add(buildSwitcher('show-home', _("Show the personal folder in the desktop"))); - frame.add(buildSwitcher('show-trash', _("Show the trash icon in the desktop"))); - frame.show_all(); - return frame; -} - -function buildSwitcher(key, labelText) { - let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL, spacing: 10 }); - let label = new Gtk.Label({ label: labelText, xalign: 0 }); - let switcher = new Gtk.Switch({ active: settings.get_boolean(key) }); - settings.bind(key, switcher, 'active', 3); - hbox.pack_start(label, true, true, 0); - hbox.add(switcher); - return hbox; -} - -function buildSelector(key, labelText, elements) { - let listStore = new Gtk.ListStore(); - listStore.set_column_types ([GObject.TYPE_STRING, GObject.TYPE_STRING]); - let schemaKey = settings.settings_schema.get_key(key); - let values = schemaKey.get_range().get_child_value(1).get_child_value(0).get_strv(); - for (let val of values) { - let iter = listStore.append(); - let visibleText = val; - if (visibleText in elements) - visibleText = elements[visibleText]; - listStore.set (iter, [0, 1], [visibleText, val]); - } - let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL, spacing: 10 }); - let label = new Gtk.Label({ label: labelText, xalign: 0 }); - let combo = new Gtk.ComboBox({model: listStore}); - let rendererText = new Gtk.CellRendererText(); - combo.pack_start (rendererText, false); - combo.add_attribute (rendererText, 'text', 0); - combo.set_id_column(1); - settings.bind(key, combo, 'active-id', 3); - hbox.pack_start(label, true, true, 0); - hbox.add(combo); - return hbox; -} - -function _onNautilusSettingsChanged() { - CLICK_POLICY_SINGLE = nautilusSettings.get_string('click-policy') == 'single'; -} - -function get_icon_size() { - // this one doesn't need scaling because Gnome Shell automagically scales the icons - return ICON_SIZE[settings.get_string('icon-size')]; -} - -function get_desired_width(scale_factor) { - return ICON_WIDTH[settings.get_string('icon-size')] * scale_factor; -} - -function get_desired_height(scale_factor) { - return ICON_HEIGHT[settings.get_string('icon-size')] * scale_factor; -} diff --git a/extensions/desktop-icons/schemas/meson.build b/extensions/desktop-icons/schemas/meson.build deleted file mode 100644 index 2b17916..0000000 --- a/extensions/desktop-icons/schemas/meson.build +++ /dev/null @@ -1,6 +0,0 @@ -gnome.compile_schemas() - -install_data( - 'org.gnome.shell.extensions.desktop-icons.gschema.xml', - install_dir : schema_dir -) diff --git a/extensions/desktop-icons/schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml b/extensions/desktop-icons/schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml deleted file mode 100644 index bb4e50f..0000000 --- a/extensions/desktop-icons/schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - 'standard' - Icon size - Set the size for the desktop icons. - - - true - Show personal folder - Show the personal folder in the desktop. - - - true - Show trash icon - Show the trash icon in the desktop. - - - diff --git a/extensions/desktop-icons/stylesheet.css b/extensions/desktop-icons/stylesheet.css deleted file mode 100644 index 17d4b32..0000000 --- a/extensions/desktop-icons/stylesheet.css +++ /dev/null @@ -1,38 +0,0 @@ -.file-item { - padding: 4px; - border: 1px; - margin: 1px; -} - -.file-item:hover { - background-color: rgba(238, 238, 238, 0.2); -} - -.name-label { - text-shadow: 1px 1px black; - color: white; - text-align: center; -} - -.draggable { - background-color: red; -} - -.rename-popup { - min-width: 300px; - margin: 6px; -} - -.create-folder-dialog-entry { - width: 20em; - margin-bottom: 6px; -} - -.create-folder-dialog-label { - padding-bottom: .4em; -} - -.create-folder-dialog-error-box { - padding-top: 16px; - spacing: 6px; -} diff --git a/extensions/disable-screenshield/extension.js b/extensions/disable-screenshield/extension.js deleted file mode 100644 index 91204c0..0000000 --- a/extensions/disable-screenshield/extension.js +++ /dev/null @@ -1,27 +0,0 @@ -/* exported enable disable */ - -const ScreenShield = imports.ui.screenShield; - -let _onUserBecameActiveOrig; - -function _onUserBecameActiveInjected() { - this.idleMonitor.remove_watch(this._becameActiveId); - this._becameActiveId = 0; - - this._longLightbox.hide(); - this._shortLightbox.hide(); - - this.deactivate(false); -} - -function enable() { - _onUserBecameActiveOrig = - ScreenShield.ScreenShield.prototype._onUserBecameActive; - ScreenShield.ScreenShield.prototype._onUserBecameActive = - _onUserBecameActiveInjected; -} - -function disable() { - ScreenShield.ScreenShield.prototype._onUserBecameActive = - _onUserBecameActiveOrig; -} diff --git a/extensions/disable-screenshield/meson.build b/extensions/disable-screenshield/meson.build deleted file mode 100644 index 48504f6..0000000 --- a/extensions/disable-screenshield/meson.build +++ /dev/null @@ -1,5 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) diff --git a/extensions/disable-screenshield/metadata.json.in b/extensions/disable-screenshield/metadata.json.in deleted file mode 100644 index 074429f..0000000 --- a/extensions/disable-screenshield/metadata.json.in +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extension-id": "@extension_id@", - "uuid": "@uuid@", - "name": "Disable Screen Shield", - "description": "Disable screen shield when screen lock is disabled", - "shell-version": [ "@shell_current@" ], - "original-authors": [ "lgpasquale@gmail.com" ], - "url": "@url@" -} diff --git a/extensions/disable-screenshield/stylesheet.css b/extensions/disable-screenshield/stylesheet.css deleted file mode 100644 index 25134b6..0000000 --- a/extensions/disable-screenshield/stylesheet.css +++ /dev/null @@ -1 +0,0 @@ -/* This extensions requires no special styling */ diff --git a/extensions/horizontal-workspaces/extension.js b/extensions/horizontal-workspaces/extension.js deleted file mode 100644 index b3937ce..0000000 --- a/extensions/horizontal-workspaces/extension.js +++ /dev/null @@ -1,18 +0,0 @@ -/* exported enable disable */ -const { Meta } = imports.gi; - -function enable() { - global.workspace_manager.override_workspace_layout( - Meta.DisplayCorner.TOPLEFT, - false, - 1, - -1); -} - -function disable() { - global.workspace_manager.override_workspace_layout( - Meta.DisplayCorner.TOPLEFT, - false, - -1, - 1); -} diff --git a/extensions/horizontal-workspaces/meson.build b/extensions/horizontal-workspaces/meson.build deleted file mode 100644 index 48504f6..0000000 --- a/extensions/horizontal-workspaces/meson.build +++ /dev/null @@ -1,5 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) diff --git a/extensions/horizontal-workspaces/metadata.json.in b/extensions/horizontal-workspaces/metadata.json.in deleted file mode 100644 index f109e06..0000000 --- a/extensions/horizontal-workspaces/metadata.json.in +++ /dev/null @@ -1,10 +0,0 @@ -{ -"extension-id": "@extension_id@", -"uuid": "@uuid@", -"settings-schema": "@gschemaname@", -"gettext-domain": "@gettext_domain@", -"name": "Horizontal workspaces", -"description": "Use a horizontal workspace layout", -"shell-version": [ "@shell_current@" ], -"url": "@url@" -} diff --git a/extensions/horizontal-workspaces/stylesheet.css b/extensions/horizontal-workspaces/stylesheet.css deleted file mode 100644 index 25134b6..0000000 --- a/extensions/horizontal-workspaces/stylesheet.css +++ /dev/null @@ -1 +0,0 @@ -/* This extensions requires no special styling */ diff --git a/extensions/no-hot-corner/extension.js b/extensions/no-hot-corner/extension.js deleted file mode 100644 index e7a0d63..0000000 --- a/extensions/no-hot-corner/extension.js +++ /dev/null @@ -1,31 +0,0 @@ -const Main = imports.ui.main; - -let _id; - -function _disableHotCorners() { - // Disables all hot corners - Main.layoutManager.hotCorners.forEach(function(hotCorner) { - if (!hotCorner) { - return; - } - - hotCorner._toggleOverview = function() {}; - hotCorner._pressureBarrier._trigger = function() {}; - }); -} - -function init() { -} - -function enable() { - _disableHotCorners(); - // Hot corners may be re-created afterwards (for example, If there's a monitor change). - // So we catch all changes. - _id = Main.layoutManager.connect('hot-corners-changed', _disableHotCorners); -} - -function disable() { - // Disconnects the callback and re-creates the hot corners - Main.layoutManager.disconnect(_id); - Main.layoutManager._updateHotCorners(); -} diff --git a/extensions/no-hot-corner/meson.build b/extensions/no-hot-corner/meson.build deleted file mode 100644 index 48504f6..0000000 --- a/extensions/no-hot-corner/meson.build +++ /dev/null @@ -1,5 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) diff --git a/extensions/no-hot-corner/metadata.json.in b/extensions/no-hot-corner/metadata.json.in deleted file mode 100644 index 406d83b..0000000 --- a/extensions/no-hot-corner/metadata.json.in +++ /dev/null @@ -1,9 +0,0 @@ -{ -"extension-id": "@extension_id@", -"uuid": "@uuid@", -"name": "No Topleft Hot Corner", -"description": "Disable the hot corner in the top left; you can still reach the overview by clicking the Activities button or pressing the dedicated key.", -"shell-version": [ "@shell_current@" ], -"url": "https://github.com/HROMANO/nohotcorner/", -"version": 15 -} diff --git a/extensions/no-hot-corner/stylesheet.css b/extensions/no-hot-corner/stylesheet.css deleted file mode 100644 index 25134b6..0000000 --- a/extensions/no-hot-corner/stylesheet.css +++ /dev/null @@ -1 +0,0 @@ -/* This extensions requires no special styling */ diff --git a/extensions/panel-favorites/extension.js b/extensions/panel-favorites/extension.js deleted file mode 100644 index b817dbb..0000000 --- a/extensions/panel-favorites/extension.js +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright (C) 2011-2013 R M Yorston -// Licence: GPLv2+ - -const Clutter = imports.gi.Clutter; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const Lang = imports.lang; -const Shell = imports.gi.Shell; -const Signals = imports.signals; -const St = imports.gi.St; -const Mainloop = imports.mainloop; - -const AppFavorites = imports.ui.appFavorites; -const Main = imports.ui.main; -const Panel = imports.ui.panel; -const Tweener = imports.ui.tweener; - -const PANEL_LAUNCHER_LABEL_SHOW_TIME = 0.15; -const PANEL_LAUNCHER_LABEL_HIDE_TIME = 0.1; -const PANEL_LAUNCHER_HOVER_TIMEOUT = 300; - -const PanelLauncher = new Lang.Class({ - Name: 'PanelLauncher', - - _init: function(app) { - this.actor = new St.Button({ style_class: 'panel-button', - reactive: true }); - this.iconSize = 24; - let icon = app.create_icon_texture(this.iconSize); - this.actor.set_child(icon); - this.actor._delegate = this; - let text = app.get_name(); - if ( app.get_description() ) { - text += '\n' + app.get_description(); - } - - this.label = new St.Label({ style_class: 'panel-launcher-label'}); - this.label.set_text(text); - Main.layoutManager.addChrome(this.label); - this.label.hide(); - this.actor.label_actor = this.label; - - this._app = app; - this.actor.connect('clicked', Lang.bind(this, function() { - this._app.open_new_window(-1); - })); - this.actor.connect('notify::hover', - Lang.bind(this, this._onHoverChanged)); - this.actor.opacity = 207; - - this.actor.connect('notify::allocation', Lang.bind(this, this._alloc)); - }, - - _onHoverChanged: function(actor) { - actor.opacity = actor.hover ? 255 : 207; - }, - - _alloc: function() { - let size = this.actor.allocation.y2 - this.actor.allocation.y1 - 3; - if ( size >= 24 && size != this.iconSize ) { - this.actor.get_child().destroy(); - this.iconSize = size; - let icon = this._app.create_icon_texture(this.iconSize); - this.actor.set_child(icon); - } - }, - - showLabel: function() { - this.label.opacity = 0; - this.label.show(); - - let [stageX, stageY] = this.actor.get_transformed_position(); - - let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1; - let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1; - let labelWidth = this.label.get_width(); - - let node = this.label.get_theme_node(); - let yOffset = node.get_length('-y-offset'); - - let y = stageY + itemHeight + yOffset; - let x = Math.floor(stageX + itemWidth/2 - labelWidth/2); - - let parent = this.label.get_parent(); - let parentWidth = parent.allocation.x2 - parent.allocation.x1; - - if ( Clutter.get_default_text_direction() == Clutter.TextDirection.LTR ) { - // stop long tooltips falling off the right of the screen - x = Math.min(x, parentWidth-labelWidth-6); - // but whatever happens don't let them fall of the left - x = Math.max(x, 6); - } - else { - x = Math.max(x, 6); - x = Math.min(x, parentWidth-labelWidth-6); - } - - this.label.set_position(x, y); - Tweener.addTween(this.label, - { opacity: 255, - time: PANEL_LAUNCHER_LABEL_SHOW_TIME, - transition: 'easeOutQuad', - }); - }, - - hideLabel: function() { - this.label.opacity = 255; - Tweener.addTween(this.label, - { opacity: 0, - time: PANEL_LAUNCHER_LABEL_HIDE_TIME, - transition: 'easeOutQuad', - onComplete: Lang.bind(this, function() { - this.label.hide(); - }) - }); - }, - - destroy: function() { - this.label.destroy(); - this.actor.destroy(); - } -}); - -const PanelFavorites = new Lang.Class({ - Name: 'PanelFavorites', - - _init: function() { - this._showLabelTimeoutId = 0; - this._resetHoverTimeoutId = 0; - this._labelShowing = false; - - this.actor = new St.BoxLayout({ name: 'panelFavorites', - x_expand: true, y_expand: true, - style_class: 'panel-favorites' }); - this._display(); - - this.container = new St.Bin({ y_fill: true, - x_fill: true, - child: this.actor }); - - this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); - this._installChangedId = Shell.AppSystem.get_default().connect('installed-changed', Lang.bind(this, this._redisplay)); - this._changedId = AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._redisplay)); - }, - - _redisplay: function() { - for ( let i=0; i 0) { - Mainloop.source_remove(this._resetHoverTimeoutId); - this._resetHoverTimeoutId = 0; - } - } - } else { - if (this._showLabelTimeoutId > 0) { - Mainloop.source_remove(this._showLabelTimeoutId); - this._showLabelTimeoutId = 0; - } - launcher.hideLabel(); - if (this._labelShowing) { - this._resetHoverTimeoutId = Mainloop.timeout_add( - PANEL_LAUNCHER_HOVER_TIMEOUT, - Lang.bind(this, function() { - this._labelShowing = false; - this._resetHoverTimeoutId = 0; - return GLib.SOURCE_REMOVE; - })); - } - } - }, - - _onDestroy: function() { - if ( this._installChangedId != 0 ) { - Shell.AppSystem.get_default().disconnect(this._installChangedId); - this._installChangedId = 0; - } - - if ( this._changedId != 0 ) { - AppFavorites.getAppFavorites().disconnect(this._changedId); - this._changedId = 0; - } - } -}); -Signals.addSignalMethods(PanelFavorites.prototype); - -let myAddToStatusArea; -let panelFavorites; - -function enable() { - Panel.Panel.prototype.myAddToStatusArea = myAddToStatusArea; - - // place panel to left of app menu, or failing that at right end of box - let siblings = Main.panel._leftBox.get_children(); - let appMenu = Main.panel.statusArea['appMenu']; - let pos = appMenu ? siblings.indexOf(appMenu.container) : siblings.length; - - panelFavorites = new PanelFavorites(); - Main.panel.myAddToStatusArea('panel-favorites', panelFavorites, - pos, 'left'); -} - -function disable() { - delete Panel.Panel.prototype.myAddToStatusArea; - - panelFavorites.actor.destroy(); - panelFavorites.emit('destroy'); - panelFavorites = null; -} - -function init() { - myAddToStatusArea = function(role, indicator, position, box) { - if (this.statusArea[role]) - throw new Error('Extension point conflict: there is already a status indicator for role ' + role); - - position = position || 0; - let boxes = { - left: this._leftBox, - center: this._centerBox, - right: this._rightBox - }; - let boxContainer = boxes[box] || this._rightBox; - this.statusArea[role] = indicator; - this._addToPanelBox(role, indicator, position, boxContainer); - return indicator; - }; -} diff --git a/extensions/panel-favorites/meson.build b/extensions/panel-favorites/meson.build deleted file mode 100644 index 48504f6..0000000 --- a/extensions/panel-favorites/meson.build +++ /dev/null @@ -1,5 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) diff --git a/extensions/panel-favorites/metadata.json.in b/extensions/panel-favorites/metadata.json.in deleted file mode 100644 index 037f281..0000000 --- a/extensions/panel-favorites/metadata.json.in +++ /dev/null @@ -1,10 +0,0 @@ -{ -"extension-id": "@extension_id@", -"uuid": "@uuid@", -"settings-schema": "@gschemaname@", -"gettext-domain": "@gettext_domain@", -"name": "Frippery Panel Favorites", -"description": "Add launchers for Favorites to the panel", -"shell-version": [ "@shell_current@" ], -"url": "http://intgat.tigress.co.uk/rmy/extensions/index.html" -} diff --git a/extensions/panel-favorites/stylesheet.css b/extensions/panel-favorites/stylesheet.css deleted file mode 100644 index 120adac..0000000 --- a/extensions/panel-favorites/stylesheet.css +++ /dev/null @@ -1,14 +0,0 @@ -.panel-favorites { - spacing: 6px; -} - -.panel-launcher-label { - border-radius: 7px; - padding: 4px 12px; - background-color: rgba(0,0,0,0.9); - color: white; - text-align: center; - font-size: 9pt; - font-weight: bold; - -y-offset: 6px; -} diff --git a/extensions/places-menu/extension.js b/extensions/places-menu/extension.js index 5c038ae..c477a4a 100644 --- a/extensions/places-menu/extension.js +++ b/extensions/places-menu/extension.js @@ -135,9 +135,9 @@ let _indicator; function enable() { _indicator = new PlacesMenu; - let pos = Main.sessionMode.panel.left.indexOf('appMenu'); + let pos = 1; if ('apps-menu' in Main.panel.statusArea) - pos++; + pos = 2; Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left'); } diff --git a/extensions/systemMonitor/classic.css b/extensions/systemMonitor/classic.css deleted file mode 100644 index 946863d..0000000 --- a/extensions/systemMonitor/classic.css +++ /dev/null @@ -1,6 +0,0 @@ -@import url("stylesheet.css"); - -.extension-systemMonitor-indicator-label { - background-color: rgba(237,237,237,0.9); - border: 1px solid #a1a1a1; -} diff --git a/extensions/systemMonitor/extension.js b/extensions/systemMonitor/extension.js deleted file mode 100644 index b4d5a9d..0000000 --- a/extensions/systemMonitor/extension.js +++ /dev/null @@ -1,395 +0,0 @@ -/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ - -/* exported init */ - -const { Clutter, GLib, GTop, Shell, St } = imports.gi; -const Signals = imports.signals; - -const ExtensionUtils = imports.misc.extensionUtils; -const Main = imports.ui.main; -const MessageList = imports.ui.messageList; -const Tweener = imports.ui.tweener; - -const Gettext = imports.gettext.domain('gnome-shell-extensions'); -const _ = Gettext.gettext; - -const INDICATOR_UPDATE_INTERVAL = 500; -const INDICATOR_NUM_GRID_LINES = 3; - -const ITEM_LABEL_SHOW_TIME = 0.15; -const ITEM_LABEL_HIDE_TIME = 0.1; -const ITEM_HOVER_TIMEOUT = 300; - -const Indicator = class { - constructor() { - this._initValues(); - this._drawingArea = new St.DrawingArea(); - this._drawingArea.connect('repaint', this._draw.bind(this)); - - this.actor = new St.Button({ - style_class: 'message message-content extension-systemMonitor-indicator-area', - child: this._drawingArea, - x_expand: true, - x_fill: true, - y_fill: true, - can_focus: true - }); - - this.actor.connect('clicked', () => { - let app = Shell.AppSystem.get_default().lookup_app('gnome-system-monitor.desktop'); - app.open_new_window(-1); - - Main.overview.hide(); - Main.panel.closeCalendar(); - }); - - this.actor.connect('destroy', this._onDestroy.bind(this)); - - this._timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, - INDICATOR_UPDATE_INTERVAL, - () => { - this._updateValues(); - this._drawingArea.queue_repaint(); - return GLib.SOURCE_CONTINUE; - }); - } - - showLabel() { - if (this.label == null) - return; - - this.label.opacity = 0; - this.label.show(); - - let [stageX, stageY] = this.actor.get_transformed_position(); - - let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1; - - let labelWidth = this.label.width; - let xOffset = Math.floor((itemWidth - labelWidth) / 2); - - let x = stageX + xOffset; - - let node = this.label.get_theme_node(); - let yOffset = node.get_length('-y-offset'); - - let y = stageY - this.label.get_height() - yOffset; - - this.label.set_position(x, y); - this.label.get_parent().set_child_above_sibling(this.label, null); - Tweener.addTween(this.label, { - opacity: 255, - time: ITEM_LABEL_SHOW_TIME, - transition: 'easeOutQuad', - }); - } - - setLabelText(text) { - if (this.label == null) - this.label = new St.Label({ - style_class: 'extension-systemMonitor-indicator-label' - }); - - this.label.set_text(text); - Main.layoutManager.addChrome(this.label); - this.label.hide(); - } - - hideLabel() { - Tweener.addTween(this.label, { - opacity: 0, - time: ITEM_LABEL_HIDE_TIME, - transition: 'easeOutQuad', - onComplete: () => this.label.hide() - }); - } - - /* MessageList.Message boilerplate */ - canClose() { - return false; - } - - clear() { - } - - destroy() { - this.actor.destroy(); - } - - _onDestroy() { - GLib.source_remove(this._timeout); - - if (this.label) - this.label.destroy(); - } - - _initValues() { - } - - _updateValues() { - } - - _draw(area) { - let [width, height] = area.get_surface_size(); - let themeNode = this.actor.get_theme_node(); - let cr = area.get_context(); - - //draw the background grid - let color = themeNode.get_color(this.gridColor); - let gridOffset = Math.floor(height / (INDICATOR_NUM_GRID_LINES + 1)); - for (let i = 1; i <= INDICATOR_NUM_GRID_LINES; ++i) { - cr.moveTo(0, i * gridOffset + .5); - cr.lineTo(width, i * gridOffset + .5); - } - Clutter.cairo_set_source_color(cr, color); - cr.setLineWidth(1); - cr.setDash([4, 1], 0); - cr.stroke(); - - //draw the foreground - - function makePath(values, reverse, nudge) { - if (nudge == null) { - nudge = 0; - } - //if we are going in reverse, we are completing the bottom of a chart, so use lineTo - if (reverse) { - cr.lineTo(values.length - 1, (1 - values[values.length - 1]) * height + nudge); - for (let k = values.length - 2; k >= 0; --k) { - cr.lineTo(k, (1 - values[k]) * height + nudge); - } - } else { - cr.moveTo(0, (1 - values[0]) * height + nudge); - for (let k = 1; k < values.length; ++k) { - cr.lineTo(k, (1 - values[k]) * height + nudge); - } - - } - } - - let renderStats = this.renderStats; - - // Make sure we don't have more sample points than pixels - renderStats.map(k => { - let stat = this.stats[k]; - if (stat.values.length > width) { - stat.values = stat.values.slice(stat.values.length - width, stat.values.length); - } - }); - - for (let i = 0; i < renderStats.length; ++i) { - let stat = this.stats[renderStats[i]]; - // We outline at full opacity and fill with 40% opacity - let outlineColor = themeNode.get_color(stat.color); - let color = new Clutter.Color(outlineColor); - color.alpha = color.alpha * .4; - - // Render the background between us and the next level - makePath(stat.values, false); - // If there is a process below us, render the cpu between us and it, otherwise, - // render to the bottom of the chart - if (i == renderStats.length - 1) { - cr.lineTo(stat.values.length - 1, height); - cr.lineTo(0, height); - cr.closePath(); - } else { - let nextStat = this.stats[renderStats[i + 1]]; - makePath(nextStat.values, true); - } - cr.closePath(); - Clutter.cairo_set_source_color(cr, color); - cr.fill(); - - // Render the outline of this level - makePath(stat.values, false, .5); - Clutter.cairo_set_source_color(cr, outlineColor); - cr.setLineWidth(1.0); - cr.setDash([], 0); - cr.stroke(); - } - } -}; -Signals.addSignalMethods(Indicator.prototype); // For MessageList.Message compat - -const CpuIndicator = class extends Indicator { - constructor() { - super(); - - this.gridColor = '-grid-color'; - this.renderStats = ['cpu-user', 'cpu-sys', 'cpu-iowait']; - - // Make sure renderStats is sorted as necessary for rendering - let renderStatOrder = { - 'cpu-total': 0, - 'cpu-user': 1, - 'cpu-sys': 2, - 'cpu-iowait': 3 - }; - this.renderStats = this.renderStats.sort((a, b) => { - return renderStatOrder[a] - renderStatOrder[b]; - }); - - this.setLabelText(_('CPU')); - } - - _initValues() { - this._prev = new GTop.glibtop_cpu; - GTop.glibtop_get_cpu(this._prev); - - this.stats = { - 'cpu-user': { color: '-cpu-user-color', values: [] }, - 'cpu-sys': { color: '-cpu-sys-color', values: [] }, - 'cpu-iowait': { color: '-cpu-iowait-color', values: [] }, - 'cpu-total': { color: '-cpu-total-color', values: [] } - }; - } - - _updateValues() { - let cpu = new GTop.glibtop_cpu; - let t = 0.0; - GTop.glibtop_get_cpu(cpu); - let total = cpu.total - this._prev.total; - let user = cpu.user - this._prev.user; - let sys = cpu.sys - this._prev.sys; - let iowait = cpu.iowait - this._prev.iowait; - let idle = cpu.idle - this._prev.idle; - - t += iowait / total; - this.stats['cpu-iowait'].values.push(t); - t += sys / total; - this.stats['cpu-sys'].values.push(t); - t += user / total; - this.stats['cpu-user'].values.push(t); - this.stats['cpu-total'].values.push(1 - idle / total); - - this._prev = cpu; - } -}; - -const MemoryIndicator = class extends Indicator { - constructor() { - super(); - - this.gridColor = '-grid-color'; - this.renderStats = ['mem-user', 'mem-other', 'mem-cached']; - - // Make sure renderStats is sorted as necessary for rendering - let renderStatOrder = { 'mem-cached': 0, 'mem-other': 1, 'mem-user': 2 }; - this.renderStats = this.renderStats.sort((a, b) => { - return renderStatOrder[a] - renderStatOrder[b]; - }); - - this.setLabelText(_('Memory')); - } - - _initValues() { - this.mem = new GTop.glibtop_mem; - this.stats = { - 'mem-user': { color: '-mem-user-color', values: [] }, - 'mem-other': { color: '-mem-other-color', values: [] }, - 'mem-cached': { color: '-mem-cached-color', values: [] } - }; - } - - _updateValues() { - GTop.glibtop_get_mem(this.mem); - - let t = this.mem.user / this.mem.total; - this.stats['mem-user'].values.push(t); - t += (this.mem.used - this.mem.user - this.mem.cached) / this.mem.total; - this.stats['mem-other'].values.push(t); - t += this.mem.cached / this.mem.total; - this.stats['mem-cached'].values.push(t); - } -}; - -class SystemMonitorSection extends MessageList.MessageListSection { - constructor() { - super(_('System Monitor')); - } - - _onTitleClicked() { - super._onTitleClicked(); - - let appSys = Shell.AppSystem.get_default(); - let app = appSys.lookup_app('gnome-system-monitor.desktop'); - if (app) - app.open_new_window(-1); - } -} - -const INDICATORS = [CpuIndicator, MemoryIndicator]; - -class Extension { - constructor() { - ExtensionUtils.initTranslations(); - - this._showLabelTimeoutId = 0; - this._resetHoverTimeoutId = 0; - this._labelShowing = false; - } - - enable() { - this._section = new SystemMonitorSection(); - this._indicators = []; - - for (let i = 0; i < INDICATORS.length; i++) { - let indicator = new (INDICATORS[i])(); - - indicator.actor.connect('notify::hover', () => { - this._onHover(indicator); - }); - this._section.addMessage(indicator, false); - this._indicators.push(indicator); - } - - Main.panel.statusArea.dateMenu._messageList._addSection(this._section); - this._section.actor.get_parent().set_child_at_index(this._section.actor, 0); - } - - disable() { - this._indicators.forEach(i => i.destroy()); - - Main.panel.statusArea.dateMenu._messageList._removeSection(this._section); - } - - _onHover(item) { - if (item.actor.get_hover()) { - if (this._showLabelTimeoutId) - return; - - let timeout = this._labelShowing ? 0 : ITEM_HOVER_TIMEOUT; - this._showLabelTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, - timeout, - () => { - this._labelShowing = true; - item.showLabel(); - this._showLabelTimeoutId = 0; - return GLib.SOURCE_REMOVE; - }); - - if (this._resetHoverTimeoutId > 0) { - GLib.source_remove(this._resetHoverTimeoutId); - this._resetHoverTimeoutId = 0; - } - } else { - if (this._showLabelTimeoutId > 0) - GLib.source_remove(this._showLabelTimeoutId); - this._showLabelTimeoutId = 0; - item.hideLabel(); - if (!this._labelShowing) - return; - - this._resetHoverTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, - ITEM_HOVER_TIMEOUT, - () => { - this._labelShowing = false; - return GLib.SOURCE_REMOVE; - }); - } - } -} - -function init() { - return new Extension(); -} diff --git a/extensions/systemMonitor/meson.build b/extensions/systemMonitor/meson.build deleted file mode 100644 index b6548b1..0000000 --- a/extensions/systemMonitor/meson.build +++ /dev/null @@ -1,9 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) - -if classic_mode_enabled - extension_data += files('classic.css') -endif diff --git a/extensions/systemMonitor/metadata.json.in b/extensions/systemMonitor/metadata.json.in deleted file mode 100644 index fa75007..0000000 --- a/extensions/systemMonitor/metadata.json.in +++ /dev/null @@ -1,11 +0,0 @@ -{ - "shell-version": ["@shell_current@" ], - "uuid": "@uuid@", - "extension-id": "@extension_id@", - "settings-schema": "@gschemaname@", - "gettext-domain": "@gettext_domain@", - "original-author": "zaspire@rambler.ru", - "name": "SystemMonitor", - "description": "System monitor showing CPU and memory usage in the message tray.", - "url": "@url@" -} diff --git a/extensions/systemMonitor/stylesheet.css b/extensions/systemMonitor/stylesheet.css deleted file mode 100644 index 978ac12..0000000 --- a/extensions/systemMonitor/stylesheet.css +++ /dev/null @@ -1,21 +0,0 @@ -.extension-systemMonitor-indicator-area { - height: 50px; - -grid-color: #575757; - -cpu-total-color: rgb(0,154,62); - -cpu-user-color: rgb(69,154,0); - -cpu-sys-color: rgb(255,253,81); - -cpu-iowait-color: rgb(210,148,0); - -mem-user-color: rgb(210,148,0); - -mem-cached-color: rgb(90,90,90); - -mem-other-color: rgb(205,203,41); -} - -.extension-systemMonitor-indicator-label { - border-radius: 7px; - padding: 4px 12px; - background-color: rgba(0,0,0,0.9); - text-align: center; - -y-offset: 8px; - font-size: 9pt; - font-weight: bold; -} diff --git a/extensions/top-icons/extension.js b/extensions/top-icons/extension.js deleted file mode 100644 index a41de07..0000000 --- a/extensions/top-icons/extension.js +++ /dev/null @@ -1,96 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported init */ - -const { Clutter, Shell, St } = imports.gi; -const Main = imports.ui.main; -const PanelMenu = imports.ui.panelMenu; -const System = imports.system; - -const PANEL_ICON_SIZE = 16; - -const STANDARD_TRAY_ICON_IMPLEMENTATIONS = [ - 'bluetooth-applet', - 'gnome-sound-applet', - 'nm-applet', - 'gnome-power-manager', - 'keyboard', - 'a11y-keyboard', - 'kbd-scrolllock', - 'kbd-numlock', - 'kbd-capslock', - 'ibus-ui-gtk' -]; - -class SysTray { - constructor() { - this._icons = []; - this._tray = null; - } - - _onTrayIconAdded(o, icon) { - let wmClass = icon.wm_class ? icon.wm_class.toLowerCase() : ''; - if (STANDARD_TRAY_ICON_IMPLEMENTATIONS.includes(wmClass)) - return; - - let button = new PanelMenu.Button(0.5, null, true); - - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let iconSize = PANEL_ICON_SIZE * scaleFactor; - - icon.set({ - width: iconSize, - height: iconSize, - x_align: Clutter.ActorAlign.CENTER, - y_align: Clutter.ActorAlign.CENTER - }); - - let iconBin = new St.Widget({ - layout_manager: new Clutter.BinLayout() - }); - iconBin.add_actor(icon); - button.add_actor(iconBin); - - this._icons.push(icon); - - button.connect('button-release-event', (actor, event) => { - icon.click(event); - }); - button.connect('key-press-event', (actor, event) => { - icon.click(event); - }); - - icon.connect('destroy', () => { - button.destroy(); - }); - - let role = wmClass || `${icon}`; - Main.panel.addToStatusArea(role, button); - } - - _onTrayIconRemoved(o, icon) { - let parent = icon.get_parent(); - parent.destroy(); - this._icons.splice(this._icons.indexOf(icon), 1); - } - - enable() { - this._tray = new Shell.TrayManager(); - this._tray.connect('tray-icon-added', - this._onTrayIconAdded.bind(this)); - this._tray.connect('tray-icon-removed', - this._onTrayIconRemoved.bind(this)); - this._tray.manage_screen(Main.panel); - } - - disable() { - this._icons.forEach(icon => icon.get_parent().destroy()); - this._icons = []; - - this._tray = null; - System.gc(); // force finalizing tray to unmanage screen - } -} - -function init() { - return new SysTray(); -} diff --git a/extensions/top-icons/meson.build b/extensions/top-icons/meson.build deleted file mode 100644 index 48504f6..0000000 --- a/extensions/top-icons/meson.build +++ /dev/null @@ -1,5 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) diff --git a/extensions/top-icons/metadata.json.in b/extensions/top-icons/metadata.json.in deleted file mode 100644 index f1e2436..0000000 --- a/extensions/top-icons/metadata.json.in +++ /dev/null @@ -1,10 +0,0 @@ -{ -"extension-id": "@extension_id@", -"uuid": "@uuid@", -"settings-schema": "@gschemaname@", -"gettext-domain": "@gettext_domain@", -"name": "Top Icons", -"description": "Shows legacy tray icons on top", -"shell-version": [ "@shell_current@" ], -"url": "http://94.247.144.115/repo/topicons/" -} diff --git a/extensions/top-icons/stylesheet.css b/extensions/top-icons/stylesheet.css deleted file mode 100644 index 25134b6..0000000 --- a/extensions/top-icons/stylesheet.css +++ /dev/null @@ -1 +0,0 @@ -/* This extensions requires no special styling */ diff --git a/extensions/updates-dialog/extension.js b/extensions/updates-dialog/extension.js deleted file mode 100644 index 59f6dcf..0000000 --- a/extensions/updates-dialog/extension.js +++ /dev/null @@ -1,503 +0,0 @@ -/* - * Copyright (c) 2015 Red Hat, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -/* exported enable disable */ - -const { Clutter, Gio, GLib, PackageKitGlib: PkgKit, Pango, Polkit, St } = imports.gi; -const Signals = imports.signals; - -const EndSessionDialog = imports.ui.endSessionDialog; -const ModalDialog = imports.ui.modalDialog; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); - -const PkIface = ' \ - \ - \ - \ - \ - \ - \ -'; - -const PkOfflineIface = ' \ - \ - \ - \ - \ - \ - \ - \ - \ -'; - -const PkTransactionIface = ' \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ -'; - -const LoginManagerIface = ' \ - \ - \ - \ - \ - \ - \ - \ - \ -'; - -const PkProxy = Gio.DBusProxy.makeProxyWrapper(PkIface); -const PkOfflineProxy = Gio.DBusProxy.makeProxyWrapper(PkOfflineIface); -const PkTransactionProxy = Gio.DBusProxy.makeProxyWrapper(PkTransactionIface); -const LoginManagerProxy = Gio.DBusProxy.makeProxyWrapper(LoginManagerIface); - -let pkProxy = null; -let pkOfflineProxy = null; -let loginManagerProxy = null; -let updatesDialog = null; -let extensionSettings = null; -let cancellable = null; - -let updatesCheckInProgress = false; -let updatesCheckRequested = false; -let securityUpdates = []; - -function getDetailText(period) { - let text = _('Important security updates need to be installed.\n'); - if (period < 60) { - text += ngettext( - 'You can close this dialog and get %d minute to finish your work.', - 'You can close this dialog and get %d minutes to finish your work.', - period) - .format(period); - } else { - text += ngettext( - 'You can close this dialog and get %d hour to finish your work.', - 'You can close this dialog and get %d hours to finish your work.', - Math.floor(period / 60)) - .format(Math.floor(period / 60)); - } - return text; -} - -const UpdatesDialog = class extends ModalDialog.ModalDialog { - constructor(settings) { - super({ - styleClass: 'end-session-dialog', - destroyOnClose: false - }); - - this._gracePeriod = settings.get_uint('grace-period'); - this._gracePeriod = Math.min(Math.max(10, this._gracePeriod), 24 * 60); - this._lastWarningPeriod = settings.get_uint('last-warning-period'); - this._lastWarningPeriod = Math.min( - Math.max(1, this._lastWarningPeriod), - this._gracePeriod - 1); - this._lastWarnings = settings.get_uint('last-warnings'); - this._lastWarnings = Math.min( - Math.max(1, this._lastWarnings), - Math.floor((this._gracePeriod - 1) / this._lastWarningPeriod)); - - let messageLayout = new St.BoxLayout({ - vertical: true, - style_class: 'end-session-dialog-layout' - }); - this.contentLayout.add(messageLayout, { - x_fill: true, - y_fill: true, - y_expand: true - }); - - let subjectLabel = new St.Label({ - style_class: 'end-session-dialog-subject', - style: 'padding-bottom: 1em;', - text: _('Important security updates') - }); - messageLayout.add(subjectLabel, { - x_fill: false, - y_fill: false, - x_align: St.Align.START, - y_align: St.Align.START - }); - - this._detailLabel = new St.Label({ - style_class: 'end-session-dialog-description', - style: 'padding-bottom: 0em;', - text: getDetailText(this._gracePeriod) - }); - this._detailLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; - this._detailLabel.clutter_text.line_wrap = true; - - messageLayout.add(this._detailLabel, { - y_fill: true, - y_align: St.Align.START - }); - - let buttons = [{ - action: this.close.bind(this), - label: _('Close'), - key: Clutter.Escape - }, { - action: this._done.bind(this), - label: _('Restart & Install') - }]; - - this.setButtons(buttons); - - this._openTimeoutId = 0; - this.connect('destroy', this._clearOpenTimeout.bind(this)); - - this._startTimer(); - } - - _clearOpenTimeout() { - if (this._openTimeoutId > 0) { - GLib.source_remove(this._openTimeoutId); - this._openTimeoutId = 0; - } - } - - tryOpen() { - if (this._openTimeoutId > 0 || this.open()) - return; - - this._openTimeoutId = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, 1, () => { - if (!this.open()) - return GLib.SOURCE_CONTINUE; - - this._clearOpenTimeout(); - return GLib.SOURCE_REMOVE; - }); - } - - _startTimer() { - this._secondsLeft = this._gracePeriod * 60; - - this._timerId = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, 1, () => { - this._secondsLeft -= 1; - let minutesLeft = this._secondsLeft / 60; - let periodLeft = Math.floor(minutesLeft); - - if (this._secondsLeft == 60 || - (periodLeft > 0 && periodLeft <= this._lastWarningPeriod * this._lastWarnings && - minutesLeft % this._lastWarningPeriod == 0)) { - this.tryOpen(); - this._detailLabel.text = getDetailText(periodLeft); - } - - if (this._secondsLeft > 0) { - if (this._secondsLeft < 60) { - let seconds = EndSessionDialog._roundSecondsToInterval( - this._gracePeriod * 60, this._secondsLeft, 10); - this._detailLabel.text = - _('Important security updates need to be installed now.\n') + - ngettext( - 'This computer will restart in %d second.', - 'This computer will restart in %d seconds.', - seconds).format(seconds); - } - return GLib.SOURCE_CONTINUE; - } - - this._done(); - return GLib.SOURCE_REMOVE; - }); - this.connect('destroy', () => { - if (this._timerId > 0) { - GLib.source_remove(this._timerId); - this._timerId = 0; - } - }); - } - - _done() { - this.emit('done'); - this.destroy(); - } - - getState() { - return [this._gracePeriod, this._lastWarningPeriod, this._lastWarnings, this._secondsLeft]; - } - - setState(state) { - [this._gracePeriod, this._lastWarningPeriod, this._lastWarnings, this._secondsLeft] = state; - } -}; -Signals.addSignalMethods(UpdatesDialog.prototype); - -function showDialog() { - if (updatesDialog) - return; - - updatesDialog = new UpdatesDialog(extensionSettings); - updatesDialog.tryOpen(); - updatesDialog.connect('destroy', () => updatesDialog = null); - updatesDialog.connect('done', () => { - if (pkOfflineProxy.TriggerAction == 'power-off' || - pkOfflineProxy.TriggerAction == 'reboot') { - loginManagerProxy.RebootRemote(false); - } else { - pkOfflineProxy.TriggerRemote('reboot', (result, error) => { - if (!error) - loginManagerProxy.RebootRemote(false); - else - log('Failed to trigger offline update: %s'.format(error.message)); - }); - } - }); -} - -function cancelDialog(save) { - if (!updatesDialog) - return; - - if (save) { - let state = GLib.Variant.new('(uuuu)', updatesDialog.getState()); - global.set_runtime_state(Me.uuid, state); - } - updatesDialog.destroy(); -} - -function restoreExistingState() { - let state = global.get_runtime_state('(uuuu)', Me.uuid); - if (state === null) - return false; - - global.set_runtime_state(Me.uuid, null); - showDialog(); - updatesDialog.setState(state.deep_unpack()); - return true; -} - -function syncState() { - if (!pkOfflineProxy || !loginManagerProxy) - return; - - if (restoreExistingState()) - return; - - if (!updatesCheckInProgress && - securityUpdates.length > 0 && - pkOfflineProxy.UpdatePrepared) - showDialog(); - else - cancelDialog(); -} - -function doPkTransaction(callback) { - if (!pkProxy) - return; - - pkProxy.CreateTransactionRemote((result, error) => { - if (error) { - log('Error creating PackageKit transaction: %s'.format(error.message)); - checkUpdatesDone(); - return; - } - - new PkTransactionProxy(Gio.DBus.system, - 'org.freedesktop.PackageKit', - String(result), - (proxy, error) => { - if (!error) { - proxy.SetHintsRemote( - ['background=true', 'interactive=false'], - (result, error) => { - if (error) { - log('Error connecting to PackageKit: %s'.format(error.message)); - checkUpdatesDone(); - return; - } - callback(proxy); - }); - } else { - log('Error connecting to PackageKit: %s'.format(error.message)); - } - }); - }); -} - -function pkUpdatePackages(proxy) { - proxy.connectSignal('Finished', (p, e, params) => { - let [exit, runtime_] = params; - - if (exit == PkgKit.ExitEnum.CANCELLED_PRIORITY) { - // try again - checkUpdates(); - } else if (exit != PkgKit.ExitEnum.SUCCESS) { - log('UpdatePackages failed: %s'.format(PkgKit.ExitEnum.to_string(exit))); - } - - checkUpdatesDone(); - }); - proxy.UpdatePackagesRemote(1 << PkgKit.TransactionFlagEnum.ONLY_DOWNLOAD, securityUpdates); -} - -function pkGetUpdates(proxy) { - proxy.connectSignal('Package', (p, e, params) => { - let [info, packageId, summary_] = params; - - if (info == PkgKit.InfoEnum.SECURITY) - securityUpdates.push(packageId); - }); - proxy.connectSignal('Finished', (p, e, params) => { - let [exit, runtime_] = params; - - if (exit == PkgKit.ExitEnum.SUCCESS) { - if (securityUpdates.length > 0) { - doPkTransaction(pkUpdatePackages); - return; - } - } else if (exit == PkgKit.ExitEnum.CANCELLED_PRIORITY) { - // try again - checkUpdates(); - } else { - log('GetUpdates failed: %s'.format(PkgKit.ExitEnum.to_string(exit))); - } - - checkUpdatesDone(); - }); - proxy.GetUpdatesRemote(0); -} - -function checkUpdatesDone() { - updatesCheckInProgress = false; - if (updatesCheckRequested) { - updatesCheckRequested = false; - checkUpdates(); - } else { - syncState(); - } -} - -function checkUpdates() { - if (updatesCheckInProgress) { - updatesCheckRequested = true; - return; - } - updatesCheckInProgress = true; - securityUpdates = []; - doPkTransaction(pkGetUpdates); -} - -function initSystemProxies() { - new PkProxy(Gio.DBus.system, - 'org.freedesktop.PackageKit', - '/org/freedesktop/PackageKit', - (proxy, error) => { - if (!error) { - pkProxy = proxy; - let id = pkProxy.connectSignal('UpdatesChanged', checkUpdates); - pkProxy._signalId = id; - checkUpdates(); - } else { - log('Error connecting to PackageKit: %s'.format(error.message)); - } - }, - cancellable); - new PkOfflineProxy(Gio.DBus.system, - 'org.freedesktop.PackageKit', - '/org/freedesktop/PackageKit', - (proxy, error) => { - if (!error) { - pkOfflineProxy = proxy; - let id = pkOfflineProxy.connect('g-properties-changed', syncState); - pkOfflineProxy._signalId = id; - syncState(); - } else { - log('Error connecting to PackageKit: %s'.format(error.message)); - } - }, - cancellable); - new LoginManagerProxy(Gio.DBus.system, - 'org.freedesktop.login1', - '/org/freedesktop/login1', - (proxy, error) => { - if (!error) { - proxy.CanRebootRemote(cancellable, (result, error) => { - if (!error && result == 'yes') { - loginManagerProxy = proxy; - syncState(); - } else { - log('Reboot is not available'); - } - }); - } else { - log('Error connecting to Login manager: %s'.format(error.message)); - } - }, - cancellable); -} - -function enable() { - cancellable = new Gio.Cancellable(); - extensionSettings = ExtensionUtils.getSettings(); - Polkit.Permission.new('org.freedesktop.packagekit.trigger-offline-update', - null, - cancellable, - (p, result) => { - try { - let permission = Polkit.Permission.new_finish(result); - if (permission && permission.allowed) - initSystemProxies(); - else - throw (new Error('not allowed')); - } catch (e) { - log('No permission to trigger offline updates: %s'.format(e.toString())); - } - }); -} - -function disable() { - cancelDialog(true); - cancellable.cancel(); - cancellable = null; - extensionSettings = null; - updatesDialog = null; - loginManagerProxy = null; - if (pkOfflineProxy) { - pkOfflineProxy.disconnect(pkOfflineProxy._signalId); - pkOfflineProxy = null; - } - if (pkProxy) { - pkProxy.disconnectSignal(pkProxy._signalId); - pkProxy = null; - } -} diff --git a/extensions/updates-dialog/meson.build b/extensions/updates-dialog/meson.build deleted file mode 100644 index 585c02d..0000000 --- a/extensions/updates-dialog/meson.build +++ /dev/null @@ -1,7 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) - -extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') diff --git a/extensions/updates-dialog/metadata.json.in b/extensions/updates-dialog/metadata.json.in deleted file mode 100644 index 9946abb..0000000 --- a/extensions/updates-dialog/metadata.json.in +++ /dev/null @@ -1,10 +0,0 @@ -{ -"extension-id": "@extension_id@", -"uuid": "@uuid@", -"settings-schema": "@gschemaname@", -"gettext-domain": "@gettext_domain@", -"name": "Updates Dialog", -"description": "Shows a modal dialog when there are software updates.", -"shell-version": [ "@shell_current@" ], -"url": "http://rtcm.fedorapeople.org/updates-dialog" -} diff --git a/extensions/updates-dialog/org.gnome.shell.extensions.updates-dialog.gschema.xml b/extensions/updates-dialog/org.gnome.shell.extensions.updates-dialog.gschema.xml deleted file mode 100644 index c08d33c..0000000 --- a/extensions/updates-dialog/org.gnome.shell.extensions.updates-dialog.gschema.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 300 - Grace period in minutes - - When the grace period is over, the computer will automatically - reboot and install security updates. - - - - 10 - Last warning dialog period - - A last warning dialog is displayed this many minutes before - the automatic reboot. - - - - 1 - Number of last warning dialogs - - How many warning dialogs are displayed. Each is displayed at - 'last-warning-period' minute intervals. - - - - diff --git a/extensions/updates-dialog/stylesheet.css b/extensions/updates-dialog/stylesheet.css deleted file mode 100644 index 25134b6..0000000 --- a/extensions/updates-dialog/stylesheet.css +++ /dev/null @@ -1 +0,0 @@ -/* This extensions requires no special styling */ diff --git a/extensions/window-grouper/extension.js b/extensions/window-grouper/extension.js deleted file mode 100644 index f66a764..0000000 --- a/extensions/window-grouper/extension.js +++ /dev/null @@ -1,109 +0,0 @@ -// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- -/* exported init */ - -const { Shell } = imports.gi; - -const ExtensionUtils = imports.misc.extensionUtils; - -class WindowMover { - constructor() { - this._settings = ExtensionUtils.getSettings(); - this._appSystem = Shell.AppSystem.get_default(); - this._appConfigs = new Set(); - this._appData = new Map(); - - this._appsChangedId = this._appSystem.connect( - 'installed-changed', this._updateAppData.bind(this)); - - this._settings.connect('changed', this._updateAppConfigs.bind(this)); - this._updateAppConfigs(); - } - - _updateAppConfigs() { - this._appConfigs.clear(); - - this._settings.get_strv('application-list').forEach(appId => { - this._appConfigs.add(appId); - }); - - this._updateAppData(); - } - - _updateAppData() { - let ids = [...this._appConfigs.values()]; - let removedApps = [...this._appData.keys()].filter( - a => !ids.includes(a.id) - ); - removedApps.forEach(app => { - app.disconnect(this._appData.get(app).windowsChangedId); - this._appData.delete(app); - }); - - let addedApps = ids.map(id => this._appSystem.lookup_app(id)).filter( - app => app != null && !this._appData.has(app) - ); - addedApps.forEach(app => { - let data = { - windows: app.get_windows(), - windowsChangedId: app.connect( - 'windows-changed', this._appWindowsChanged.bind(this)) - }; - this._appData.set(app, data); - }); - } - - destroy() { - if (this._appsChangedId) { - this._appSystem.disconnect(this._appsChangedId); - this._appsChangedId = 0; - } - - if (this._settings) { - this._settings.run_dispose(); - this._settings = null; - } - - this._appConfigs.clear(); - this._updateAppData(); - } - - _appWindowsChanged(app) { - let data = this._appData.get(app); - let windows = app.get_windows(); - - // If get_compositor_private() returns non-NULL on a removed windows, - // the window still exists and is just moved to a different workspace - // or something; assume it'll be added back immediately, so keep it - // to avoid moving it again - windows.push(...data.windows.filter( - w => !windows.includes(w) && w.get_compositor_private() != null - )); - - windows.filter(w => !data.windows.includes(w)).forEach(window => { - let leader = data.windows.find(w => w.get_pid() == window.get_pid()); - if (leader) - window.change_workspace(leader.get_workspace()); - }); - data.windows = windows; - } -} - -class Extension { - constructor() { - this._winMover = null; - } - - enable() { - this._winMover = new WindowMover(); - } - - disable() { - this._winMover.destroy(); - this._winMover = null; - } -} - -function init() { - ExtensionUtils.initTranslations(); - return new Extension(); -} diff --git a/extensions/window-grouper/meson.build b/extensions/window-grouper/meson.build deleted file mode 100644 index c55a783..0000000 --- a/extensions/window-grouper/meson.build +++ /dev/null @@ -1,8 +0,0 @@ -extension_data += configure_file( - input: metadata_name + '.in', - output: metadata_name, - configuration: metadata_conf -) - -extension_sources += files('prefs.js') -extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') diff --git a/extensions/window-grouper/metadata.json.in b/extensions/window-grouper/metadata.json.in deleted file mode 100644 index aa202c8..0000000 --- a/extensions/window-grouper/metadata.json.in +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extension-id": "@extension_id@", - "uuid": "@uuid@", - "settings-schema": "@gschemaname@", - "gettext-domain": "@gettext_domain@", - "name": "Window grouper", - "description": "Keep windows that belong to the same process on the same workspace.", - "shell-version": [ "@shell_current@" ], - "original-authors": [ "fmuellner@redhat.com" ], - "url": "@url@" -} diff --git a/extensions/window-grouper/org.gnome.shell.extensions.window-grouper.gschema.xml b/extensions/window-grouper/org.gnome.shell.extensions.window-grouper.gschema.xml deleted file mode 100644 index ee052a6..0000000 --- a/extensions/window-grouper/org.gnome.shell.extensions.window-grouper.gschema.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - [ ] - Application that should be grouped - A list of application ids - - - diff --git a/extensions/window-grouper/prefs.js b/extensions/window-grouper/prefs.js deleted file mode 100644 index d7b748e..0000000 --- a/extensions/window-grouper/prefs.js +++ /dev/null @@ -1,191 +0,0 @@ -// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- -/* exported init buildPrefsWidget */ - -const { Gio, GObject, Gtk } = imports.gi; - -const ExtensionUtils = imports.misc.extensionUtils; -const Gettext = imports.gettext.domain('gnome-shell-extensions'); -const _ = Gettext.gettext; -const N_ = e => e; - -const SETTINGS_KEY = 'application-list'; - -const Columns = { - APPINFO: 0, - DISPLAY_NAME: 1, - ICON: 2 -}; - -const Widget = GObject.registerClass({ - GTypeName: 'WindowGrouperPrefsWidget', -}, class Widget extends Gtk.Grid { - _init(params) { - super._init(params); - this.set_orientation(Gtk.Orientation.VERTICAL); - - this._settings = ExtensionUtils.getSettings(); - this._settings.connect('changed', this._refresh.bind(this)); - this._changedPermitted = false; - - this._store = new Gtk.ListStore(); - this._store.set_column_types([Gio.AppInfo, GObject.TYPE_STRING, Gio.Icon]); - - let scrolled = new Gtk.ScrolledWindow({ shadow_type: Gtk.ShadowType.IN }); - scrolled.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); - this.add(scrolled); - - - this._treeView = new Gtk.TreeView({ - model: this._store, - headers_visible: false, - hexpand: true, - vexpand: true - }); - this._treeView.get_selection().set_mode(Gtk.SelectionMode.SINGLE); - - let appColumn = new Gtk.TreeViewColumn({ - sort_column_id: Columns.DISPLAY_NAME, - spacing: 12 - }); - let iconRenderer = new Gtk.CellRendererPixbuf({ - stock_size: Gtk.IconSize.DIALOG, - xpad: 12, - ypad: 12 - }); - appColumn.pack_start(iconRenderer, false); - appColumn.add_attribute(iconRenderer, 'gicon', Columns.ICON); - let nameRenderer = new Gtk.CellRendererText(); - appColumn.pack_start(nameRenderer, true); - appColumn.add_attribute(nameRenderer, 'text', Columns.DISPLAY_NAME); - this._treeView.append_column(appColumn); - - scrolled.add(this._treeView); - - let toolbar = new Gtk.Toolbar({ icon_size: Gtk.IconSize.SMALL_TOOLBAR }); - toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR); - this.add(toolbar); - - let newButton = new Gtk.ToolButton({ - icon_name: 'list-add-symbolic' - }); - newButton.connect('clicked', this._createNew.bind(this)); - toolbar.add(newButton); - - let delButton = new Gtk.ToolButton({ - icon_name: 'list-remove-symbolic' - }); - delButton.connect('clicked', this._deleteSelected.bind(this)); - toolbar.add(delButton); - - let selection = this._treeView.get_selection(); - selection.connect('changed', () => { - delButton.sensitive = selection.count_selected_rows() > 0; - }); - delButton.sensitive = selection.count_selected_rows() > 0; - - this._changedPermitted = true; - this._refresh(); - } - - _createNew() { - let dialog = new Gtk.AppChooserDialog({ - heading: _('Select an application for which grouping should apply'), - transient_for: this.get_toplevel(), - modal: true - }); - - dialog.get_widget().show_all = true; - - dialog.connect('response', (dialog, id) => { - if (id != Gtk.ResponseType.OK) { - dialog.destroy(); - return; - } - - let appInfo = dialog.get_app_info(); - if (!appInfo) { - dialog.destroy(); - return; - } - - this._changedPermitted = false; - this._appendItem(appInfo.get_id()); - this._changedPermitted = true; - - let iter = this._store.append(); - this._store.set(iter, - [Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME], - [appInfo, appInfo.get_icon(), appInfo.get_display_name()]); - - dialog.destroy(); - }); - dialog.show_all(); - } - - _deleteSelected() { - let [any, model_, iter] = this._treeView.get_selection().get_selected(); - - if (any) { - let appInfo = this._store.get_value(iter, Columns.APPINFO); - - this._changedPermitted = false; - this._removeItem(appInfo.get_id()); - this._changedPermitted = true; - this._store.remove(iter); - } - } - - _refresh() { - if (!this._changedPermitted) - // Ignore this notification, model is being modified outside - return; - - this._store.clear(); - - let currentItems = this._settings.get_strv(SETTINGS_KEY); - let validItems = []; - for (let i = 0; i < currentItems.length; i++) { - let id = currentItems[i]; - let appInfo = Gio.DesktopAppInfo.new(id); - if (!appInfo) - continue; - validItems.push(currentItems[i]); - - let iter = this._store.append(); - this._store.set(iter, - [Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME], - [appInfo, appInfo.get_icon(), appInfo.get_display_name()]); - } - - if (validItems.length != currentItems.length) // some items were filtered out - this._settings.set_strv(SETTINGS_KEY, validItems); - } - - _appendItem(id) { - let currentItems = this._settings.get_strv(SETTINGS_KEY); - currentItems.push(id); - this._settings.set_strv(SETTINGS_KEY, currentItems); - } - - _removeItem(id) { - let currentItems = this._settings.get_strv(SETTINGS_KEY); - let index = currentItems.indexOf(id); - - if (index < 0) - return; - currentItems.splice(index, 1); - this._settings.set_strv(SETTINGS_KEY, currentItems); - } -}); - - -function init() { - ExtensionUtils.initTranslations(); -} - -function buildPrefsWidget() { - let widget = new Widget({ margin: 12 }); - widget.show_all(); - - return widget; -} diff --git a/extensions/window-grouper/stylesheet.css b/extensions/window-grouper/stylesheet.css deleted file mode 100644 index 25134b6..0000000 --- a/extensions/window-grouper/stylesheet.css +++ /dev/null @@ -1 +0,0 @@ -/* This extensions requires no special styling */ diff --git a/extensions/window-list/classic.css b/extensions/window-list/classic.css index 7079d3e..f3c44a3 100644 --- a/extensions/window-list/classic.css +++ b/extensions/window-list/classic.css @@ -4,39 +4,36 @@ border-top-width: 1px; border-bottom-width: 0px; height: 2.25em ; - padding: 2px; - } - - .bottom-panel .window-button > StWidget, - .bottom-panel .window-picker-toggle > StWidget { - color: #2e3436; - background-color: #eee; - border-radius: 3px; - padding: 3px 6px 1px; - box-shadow: none; - text-shadow: none; - border: 1px solid rgba(0,0,0,0.2); } .bottom-panel .window-button > StWidget { + background-gradient-drection: vertical; + background-color: #fff; + background-gradient-start: #fff; + background-gradient-end: #eee; + color: #000; -st-natural-width: 18.7em; max-width: 18.75em; + color: #2e3436; + background-color: #eee; + border-radius: 2px; + padding: 3px 6px 1px; + box-shadow: inset -1px -1px 1px rgba(0,0,0,0.5); + text-shadow: 0 0 transparent; } - .bottom-panel .window-button:hover > StWidget, - .bottom-panel .window-picker-toggle:hover > StWidget { + .bottom-panel .window-button:hover > StWidget { background-color: #f9f9f9; } .bottom-panel .window-button:active > StWidget, .bottom-panel .window-button:focus > StWidget { - box-shadow: inset 0 1px 3px rgba(0,0,0,0.1); + box-shadow: inset 1px 1px 2px rgba(0,0,0,0.5); } - .bottom-panel .window-button.focused > StWidget, - .bottom-panel .window-picker-toggle:checked > StWidget { - background-color: #ccc; - box-shadow: inset 0 1px 3px rgba(0,0,0,0.1); + .bottom-panel .window-button.focused > StWidget { + background-color: #ddd; + box-shadow: inset 1px 1px 1px rgba(0,0,0,0.5); } .bottom-panel .window-button.focused:hover > StWidget { @@ -45,24 +42,5 @@ .bottom-panel .window-button.minimized > StWidget { color: #888; - box-shadow: none; + box-shadow: inset -1px -1px 1px rgba(0,0,0,0.5); } - -/* workspace switcher */ -.window-list-workspace-indicator .workspace { - background-color: #ddd; -} - -.window-list-workspace-indicator .workspace.active { - background-color: #ccc; -} - -.window-list-window-preview { - background-color: #ededed; - border: 1px solid #ccc; -} - -.window-list-window-preview.active { - background-color: #f6f5f4; - border: 2px solid #888; -} diff --git a/extensions/window-list/extension.js b/extensions/window-list/extension.js index 1f854aa..e1ea742 100644 --- a/extensions/window-list/extension.js +++ b/extensions/window-list/extension.js @@ -1,16 +1,13 @@ /* exported init */ -const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi; +const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi; const DND = imports.ui.dnd; const Main = imports.ui.main; -const Overview = imports.ui.overview; +const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; -const Tweener = imports.ui.tweener; const ExtensionUtils = imports.misc.extensionUtils; const Me = ExtensionUtils.getCurrentExtension(); -const { WindowPicker, WindowPickerToggle } = Me.imports.windowPicker; -const { WorkspaceIndicator } = Me.imports.workspaceIndicator; const Gettext = imports.gettext.domain('gnome-shell-extensions'); const _ = Gettext.gettext; @@ -647,6 +644,132 @@ class AppButton extends BaseButton { } +let WorkspaceIndicator = GObject.registerClass( +class WorkspaceIndicator extends PanelMenu.Button { + _init() { + super._init(0.0, _('Workspace Indicator'), true); + this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM)); + this.add_style_class_name('window-list-workspace-indicator'); + this.menu.actor.remove_style_class_name('panel-menu'); + + let container = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, + y_expand: true + }); + this.add_actor(container); + + let workspaceManager = global.workspace_manager; + + this._currentWorkspace = workspaceManager.get_active_workspace().index(); + this.statusLabel = new St.Label({ + text: this._getStatusText(), + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + container.add_actor(this.statusLabel); + + this.workspacesItems = []; + + this._workspaceManagerSignals = []; + this._workspaceManagerSignals.push(workspaceManager.connect('notify::n-workspaces', + this._updateMenu.bind(this))); + this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-switched', + this._updateIndicator.bind(this))); + + this.connect('scroll-event', this._onScrollEvent.bind(this)); + this._updateMenu(); + + this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.wm.preferences' }); + this._settingsChangedId = + this._settings.connect('changed::workspace-names', + this._updateMenu.bind(this)); + } + + _onDestroy() { + for (let i = 0; i < this._workspaceManagerSignals.length; i++) + global.workspace_manager.disconnect(this._workspaceManagerSignals[i]); + + if (this._settingsChangedId) { + this._settings.disconnect(this._settingsChangedId); + this._settingsChangedId = 0; + } + + super._onDestroy(); + } + + _updateIndicator() { + this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.NONE); + this._currentWorkspace = global.workspace_manager.get_active_workspace().index(); + this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.DOT); + + this.statusLabel.set_text(this._getStatusText()); + } + + _getStatusText() { + let workspaceManager = global.workspace_manager; + let current = workspaceManager.get_active_workspace().index(); + let total = workspaceManager.n_workspaces; + + return '%d / %d'.format(current + 1, total); + } + + _updateMenu() { + let workspaceManager = global.workspace_manager; + + this.menu.removeAll(); + this.workspacesItems = []; + this._currentWorkspace = workspaceManager.get_active_workspace().index(); + + for (let i = 0; i < workspaceManager.n_workspaces; i++) { + let name = Meta.prefs_get_workspace_name(i); + let item = new PopupMenu.PopupMenuItem(name); + item.workspaceId = i; + + item.connect('activate', (item, _event) => { + this._activate(item.workspaceId); + }); + + if (i == this._currentWorkspace) + item.setOrnament(PopupMenu.Ornament.DOT); + + this.menu.addMenuItem(item); + this.workspacesItems[i] = item; + } + + this.statusLabel.set_text(this._getStatusText()); + } + + _activate(index) { + let workspaceManager = global.workspace_manager; + + if (index >= 0 && index < workspaceManager.n_workspaces) { + let metaWorkspace = workspaceManager.get_workspace_by_index(index); + metaWorkspace.activate(global.get_current_time()); + } + } + + _onScrollEvent(actor, event) { + let direction = event.get_scroll_direction(); + let diff = 0; + if (direction == Clutter.ScrollDirection.DOWN) { + diff = 1; + } else if (direction == Clutter.ScrollDirection.UP) { + diff = -1; + } else { + return; + } + + let newIndex = this._currentWorkspace + diff; + this._activate(newIndex); + } + + _allocate(actor, box, flags) { + if (actor.get_n_children() > 0) + actor.get_first_child().allocate(box, flags); + } +}); + class WindowList { constructor(perMonitor, monitor) { this._perMonitor = perMonitor; @@ -664,12 +787,6 @@ class WindowList { let box = new St.BoxLayout({ x_expand: true, y_expand: true }); this.actor.add_actor(box); - let toggle = new WindowPickerToggle(); - box.add_actor(toggle); - - toggle.connect('notify::checked', - this._updateWindowListVisibility.bind(this)); - let layout = new Clutter.BoxLayout({ homogeneous: true }); this._windowList = new St.Widget({ style_class: 'window-list', @@ -819,19 +936,6 @@ class WindowList { this._workspaceIndicator.actor.visible = hasWorkspaces && workspacesOnMonitor; } - _updateWindowListVisibility() { - let visible = !Main.windowPicker.visible; - - Tweener.addTween(this._windowList, { - opacity: visible ? 255 : 0, - transition: 'ease-out-quad', - time: Overview.ANIMATION_TIME - }); - - this._windowList.reactive = visible; - this._windowList.get_children().forEach(c => c.reactive = visible); - } - _getPreferredUngroupedWindowListWidth() { if (this._windowList.get_n_children() == 0) return this._windowList.get_preferred_width(-1)[1]; @@ -1102,7 +1206,7 @@ class WindowList { class Extension { constructor() { this._windowLists = null; - this._hideOverviewOrig = Main.overview.hide; + this._injections = {}; } enable() { @@ -1117,13 +1221,6 @@ class Extension { Main.layoutManager.connect('monitors-changed', this._buildWindowLists.bind(this)); - Main.windowPicker = new WindowPicker(); - - Main.overview.hide = () => { - Main.windowPicker.close(); - this._hideOverviewOrig.call(Main.overview); - }; - this._buildWindowLists(); } @@ -1154,11 +1251,6 @@ class Extension { windowList.actor.destroy(); }); this._windowLists = null; - - Main.windowPicker.actor.destroy(); - delete Main.windowPicker; - - Main.overview.hide = this._hideOverviewOrig; } someWindowListContains(actor) { diff --git a/extensions/window-list/meson.build b/extensions/window-list/meson.build index 34d7c3f..b4aa4db 100644 --- a/extensions/window-list/meson.build +++ b/extensions/window-list/meson.build @@ -4,7 +4,7 @@ extension_data += configure_file( configuration: metadata_conf ) -extension_sources += files('prefs.js', 'windowPicker.js', 'workspaceIndicator.js') +extension_sources += files('prefs.js') extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') if classic_mode_enabled diff --git a/extensions/window-list/stylesheet.css b/extensions/window-list/stylesheet.css index 79d56ba..f5285cb 100644 --- a/extensions/window-list/stylesheet.css +++ b/extensions/window-list/stylesheet.css @@ -26,8 +26,9 @@ spacing: 4px; } -.window-button > StWidget, -.window-picker-toggle > StWidget { +.window-button > StWidget { + -st-natural-width: 18.75em; + max-width: 18.75em; color: #bbb; background-color: black; border-radius: 4px; @@ -36,21 +37,7 @@ text-shadow: 1px 1px 4px rgba(0,0,0,0.8); } -.window-picker-toggle { - padding: 3px; -} - -.window-picker-toggle > StWidet { - border: 1px solid rgba(255,255,255,0.3); -} - -.window-button > StWidget { - -st-natural-width: 18.75em; - max-width: 18.75em; -} - -.window-button:hover > StWidget, -.window-picker-toggle:hover > StWidget { +.window-button:hover > StWidget { color: white; background-color: #1f1f1f; } @@ -60,14 +47,12 @@ box-shadow: inset 2px 2px 4px rgba(255,255,255,0.5); } -.window-button.focused > StWidget, -.window-picker-toggle:checked > StWidget { +.window-button.focused > StWidget { color: white; box-shadow: inset 1px 1px 4px rgba(255,255,255,0.7); } -.window-button.focused:active > StWidget, -.window-picker-toggle:checked:active > StWidget { +.window-button.focused:active > StWidget { box-shadow: inset 2px 2px 4px rgba(255,255,255,0.7); } @@ -85,50 +70,13 @@ height: 24px; } -.window-list-workspace-indicator .status-label-bin { - background-color: rgba(200, 200, 200, .3); - border: 1px solid #cccccc; - padding: 0 3px; - margin: 3px 0; -} - -.window-list-workspace-indicator .workspaces-box { - spacing: 3px; +.window-list-workspace-indicator { padding: 3px; } -.window-list-workspace-indicator .workspace { - border: 1px solid #cccccc; - width: 52px; -} - -.window-list-workspace-indicator .workspace:first-child:last-child:ltr, -.window-list-workspace-indicator .workspace:first-child:last-child:rtl { - border-radius: 4px; -} - -.window-list-workspace-indicator .workspace:first-child:ltr, -.window-list-workspace-indicator .workspace:last-child:rtl { - border-radius: 4px 0 0 4px; -} - -.window-list-workspace-indicator .workspace:first-child:rtl, -.window-list-workspace-indicator .workspace:last-child:ltr { - border-radius: 0 4px 4px 0; -} - -.window-list-workspace-indicator .workspace.active { +.window-list-workspace-indicator > StWidget { background-color: rgba(200, 200, 200, .3); -} - -.window-list-window-preview { - background-color: #252525; - border: 1px solid #ccc; -} - -.window-list-window-preview.active { - background-color: #353535; - border: 2px solid #ccc; + border: 1px solid #cccccc; } .notification { diff --git a/extensions/window-list/windowPicker.js b/extensions/window-list/windowPicker.js deleted file mode 100644 index 12a7627..0000000 --- a/extensions/window-list/windowPicker.js +++ /dev/null @@ -1,274 +0,0 @@ -/* exported WindowPicker, WindowPickerToggle */ -const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi; -const Signals = imports.signals; - -const Layout = imports.ui.layout; -const Main = imports.ui.main; -const Overview = imports.ui.overview; -const { WorkspacesDisplay } = imports.ui.workspacesView; - -let MyWorkspacesDisplay = class extends WorkspacesDisplay { - constructor() { - super(); - - this.actor.add_constraint( - new Layout.MonitorConstraint({ - primary: true, - work_area: true - })); - - this.actor.connect('destroy', this._onDestroy.bind(this)); - - this._workareasChangedId = global.display.connect('workareas-changed', - this._onWorkAreasChanged.bind(this)); - this._onWorkAreasChanged(); - } - - show(...args) { - if (this._scrollEventId == 0) - this._scrollEventId = Main.windowPicker.connect('scroll-event', - this._onScrollEvent.bind(this)); - - super.show(...args); - } - - hide(...args) { - if (this._scrollEventId > 0) - Main.windowPicker.disconnect(this._scrollEventId); - this._scrollEventId = 0; - - super.hide(...args); - } - - _onWorkAreasChanged() { - let { primaryIndex } = Main.layoutManager; - let workarea = Main.layoutManager.getWorkAreaForMonitor(primaryIndex); - this.setWorkspacesFullGeometry(workarea); - } - - _updateWorkspacesViews() { - super._updateWorkspacesViews(); - - this._workspacesViews.forEach(v => { - Main.layoutManager.overviewGroup.remove_actor(v.actor); - Main.windowPicker.actor.add_actor(v.actor); - }); - } - - _onDestroy() { - if (this._workareasChangedId) - global.display.disconnect(this._workareasChangedId); - this._workareasChangedId = 0; - } -}; - -var WindowPicker = class { - constructor() { - this._visible = false; - this._modal = false; - - this._overlayKeyId = 0; - this._stageKeyPressId = 0; - - this.actor = new Clutter.Actor(); - - this.actor.connect('destroy', this._onDestroy.bind(this)); - - global.bind_property('screen-width', - this.actor, 'width', - GObject.BindingFlags.SYNC_CREATE); - global.bind_property('screen-height', - this.actor, 'height', - GObject.BindingFlags.SYNC_CREATE); - - this._backgroundGroup = new Meta.BackgroundGroup({ reactive: true }); - this.actor.add_child(this._backgroundGroup); - - this._backgroundGroup.connect('scroll-event', (a, ev) => { - this.emit('scroll-event', ev); - }); - - // Trick WorkspacesDisplay constructor into adding actions here - let addActionOrig = Main.overview.addAction; - Main.overview.addAction = a => this._backgroundGroup.add_action(a); - - this._workspacesDisplay = new MyWorkspacesDisplay(); - this.actor.add_child(this._workspacesDisplay.actor); - - Main.overview.addAction = addActionOrig; - - this._bgManagers = []; - - this._monitorsChangedId = Main.layoutManager.connect('monitors-changed', - this._updateBackgrounds.bind(this)); - this._updateBackgrounds(); - - Main.uiGroup.insert_child_below(this.actor, global.window_group); - - if (!Main.sessionMode.hasOverview) { - this._overlayKeyId = global.display.connect('overlay-key', () => { - if (!this._visible) - this.open(); - else - this.close(); - }); - } - } - - get visible() { - return this._visible; - } - - open() { - if (this._visible) - return; - - this._visible = true; - - if (!this._syncGrab()) - return; - - this._fakeOverviewVisible(true); - this._shadeBackgrounds(); - this._fakeOverviewAnimation(); - this._workspacesDisplay.show(false); - - this._stageKeyPressId = global.stage.connect('key-press-event', - (a, event) => { - let sym = event.get_key_symbol(); - if (sym == Clutter.KEY_Escape) { - this.close(); - return Clutter.EVENT_STOP; - } - return Clutter.EVENT_PROPAGATE; - }); - - this.emit('open-state-changed', this._visible); - } - - close() { - if (!this._visible) - return; - - this._visible = false; - - if (!this._syncGrab()) - return; - - this._workspacesDisplay.animateFromOverview(false); - this._unshadeBackgrounds(); - this._fakeOverviewAnimation(() => { - this._workspacesDisplay.hide(); - this._fakeOverviewVisible(false); - }); - - global.stage.disconnect(this._stageKeyPressId); - this._stageKeyPressId = 0; - - this.emit('open-state-changed', this._visible); - } - - _fakeOverviewAnimation(onComplete) { - Main.overview.animationInProgress = true; - GLib.timeout_add( - GLib.PRIORITY_DEFAULT, - Overview.ANIMATION_TIME * 1000, - () => { - Main.overview.animationInProgress = false; - if (onComplete) - onComplete(); - }); - } - - _fakeOverviewVisible(visible) { - // Fake overview state for WorkspacesDisplay - Main.overview.visible = visible; - - // Hide real windows - Main.layoutManager._inOverview = visible; - Main.layoutManager._updateVisibility(); - } - - _syncGrab() { - if (this._visible) { - if (this._modal) - return true; - - this._modal = Main.pushModal(this.actor, { - actionMode: Shell.ActionMode.OVERVIEW - }); - - if (!this._modal) { - this.hide(); - return false; - } - } else if (this._modal) { - Main.popModal(this.actor); - this._modal = false; - } - return true; - } - - _onDestroy() { - if (this._monitorsChangedId) - Main.layoutManager.disconnect(this._monitorsChangedId); - this._monitorsChangedId = 0; - - if (this._overlayKeyId) - global.display.disconnect(this._overlayKeyId); - this._overlayKeyId = 0; - - if (this._stageKeyPressId) - global.stage.disconnect(this._stageKeyPressId); - this._stageKeyPressId = 0; - } - - _updateBackgrounds() { - Main.overview._updateBackgrounds.call(this); - } - - _shadeBackgrounds() { - Main.overview._shadeBackgrounds.call(this); - } - - _unshadeBackgrounds() { - Main.overview._unshadeBackgrounds.call(this); - } -}; -Signals.addSignalMethods(WindowPicker.prototype); - -var WindowPickerToggle = GObject.registerClass( -class WindowPickerToggle extends St.Button { - _init() { - let iconBin = new St.Widget({ - layout_manager: new Clutter.BinLayout() - }); - iconBin.add_child(new St.Icon({ - icon_name: 'focus-windows-symbolic', - icon_size: 16, - x_expand: true, - y_expand: true, - x_align: Clutter.ActorAlign.CENTER, - y_align: Clutter.ActorAlign.CENTER - })); - super._init({ - style_class: 'window-picker-toggle', - child: iconBin, - visible: !Main.sessionMode.hasOverview, - x_fill: true, - y_fill: true, - toggle_mode: true - }); - - this.connect('notify::checked', () => { - if (this.checked) - Main.windowPicker.open(); - else - Main.windowPicker.close(); - }); - - Main.windowPicker.connect('open-state-changed', () => { - this.checked = Main.windowPicker.visible; - }); - } -}); diff --git a/extensions/window-list/workspaceIndicator.js b/extensions/window-list/workspaceIndicator.js deleted file mode 100644 index ca47611..0000000 --- a/extensions/window-list/workspaceIndicator.js +++ /dev/null @@ -1,403 +0,0 @@ -/* exported WorkspaceIndicator */ -const { Clutter, Gio, GObject, Meta, St } = imports.gi; - -const DND = imports.ui.dnd; -const Main = imports.ui.main; -const PanelMenu = imports.ui.panelMenu; -const PopupMenu = imports.ui.popupMenu; - -const Gettext = imports.gettext.domain('gnome-shell-extensions'); -const _ = Gettext.gettext; - -let WindowPreview = GObject.registerClass({ - GTypeName: 'WindowListWindowPreview' -}, class WindowPreview extends St.Button { - _init(window) { - super._init({ - style_class: 'window-list-window-preview' - }); - - this._delegate = this; - DND.makeDraggable(this, { restoreOnSuccess: true }); - - this._window = window; - - this.connect('destroy', this._onDestroy.bind(this)); - - this._sizeChangedId = this._window.connect('size-changed', - this._relayout.bind(this)); - this._positionChangedId = this._window.connect('position-changed', - this._relayout.bind(this)); - this._minimizedChangedId = this._window.connect('notify::minimized', - this._relayout.bind(this)); - this._monitorEnteredId = global.display.connect('window-entered-monitor', - this._relayout.bind(this)); - this._monitorLeftId = global.display.connect('window-left-monitor', - this._relayout.bind(this)); - - // Do initial layout when we get a parent - let id = this.connect('parent-set', () => { - this.disconnect(id); - if (!this.get_parent()) - return; - this._laterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { - this._laterId = 0; - this._relayout(); - return false; - }); - }); - - this._focusChangedId = global.display.connect('notify::focus-window', - this._onFocusChanged.bind(this)); - this._onFocusChanged(); - } - - // needed for DND - get realWindow() { - return this._window.get_compositor_private(); - } - - _onDestroy() { - this._window.disconnect(this._sizeChangedId); - this._window.disconnect(this._positionChangedId); - this._window.disconnect(this._minimizedChangedId); - global.display.disconnect(this._monitorEnteredId); - global.display.disconnect(this._monitorLeftId); - global.display.disconnect(this._focusChangedId); - if (this._laterId) - Meta.later_remove(this._laterId); - } - - _onFocusChanged() { - if (global.display.focus_window == this._window) - this.add_style_class_name('active'); - else - this.remove_style_class_name('active'); - } - - _relayout() { - let monitor = Main.layoutManager.findIndexForActor(this); - this.visible = monitor == this._window.get_monitor() && - this._window.showing_on_its_workspace(); - - if (!this.visible) - return; - - let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor); - let hscale = this.get_parent().allocation.get_width() / workArea.width; - let vscale = this.get_parent().allocation.get_height() / workArea.height; - - let frameRect = this._window.get_frame_rect(); - this.set_size( - Math.round(Math.min(frameRect.width, workArea.width) * hscale), - Math.round(Math.min(frameRect.height, workArea.height) * vscale)); - this.set_position( - Math.round(frameRect.x * hscale), - Math.round(frameRect.y * vscale)); - } -}); - -let WorkspaceThumbnail = GObject.registerClass({ - GTypeName: 'WindowListWorkspaceThumbnail' -}, class WorkspaceThumbnail extends St.Button { - _init(index) { - super._init({ - style_class: 'workspace', - child: new Clutter.Actor({ - layout_manager: new Clutter.BinLayout(), - clip_to_allocation: true - }), - x_fill: true, - y_fill: true - }); - - this.connect('destroy', this._onDestroy.bind(this)); - - this._index = index; - this._delegate = this; // needed for DND - - this._windowPreviews = new Map(); - - let workspaceManager = global.workspace_manager; - this._workspace = workspaceManager.get_workspace_by_index(index); - - this._windowAddedId = this._workspace.connect('window-added', - (ws, window) => { - this._addWindow(window); - }); - this._windowRemovedId = this._workspace.connect('window-removed', - (ws, window) => { - this._removeWindow(window); - }); - this._restackedId = global.display.connect('restacked', - this._onRestacked.bind(this)); - - this._workspace.list_windows().forEach(w => this._addWindow(w)); - this._onRestacked(); - } - - acceptDrop(source) { - if (!source.realWindow) - return false; - - let window = source.realWindow.get_meta_window(); - this._moveWindow(window); - return true; - } - - handleDragOver(source) { - if (source.realWindow) - return DND.DragMotionResult.MOVE_DROP; - else - return DND.DragMotionResult.CONTINUE; - } - - _addWindow(window) { - if (this._windowPreviews.has(window)) - return; - - let preview = new WindowPreview(window); - preview.connect('clicked', (a, btn) => this.emit('clicked', btn)); - this._windowPreviews.set(window, preview); - this.child.add_child(preview); - } - - _removeWindow(window) { - let preview = this._windowPreviews.get(window); - if (!preview) - return; - - this._windowPreviews.delete(window); - preview.destroy(); - } - - _onRestacked() { - let lastPreview = null; - let windows = global.get_window_actors().map(a => a.meta_window); - for (let i = 0; i < windows.length; i++) { - let preview = this._windowPreviews.get(windows[i]); - if (!preview) - continue; - - this.child.set_child_above_sibling(preview, lastPreview); - lastPreview = preview; - } - } - - _moveWindow(window) { - let monitorIndex = Main.layoutManager.findIndexForActor(this); - if (monitorIndex != window.get_monitor()) - window.move_to_monitor(monitorIndex); - window.change_workspace_by_index(this._index, false); - } - - // eslint-disable-next-line camelcase - on_clicked() { - let ws = global.workspace_manager.get_workspace_by_index(this._index); - if (ws) - ws.activate(global.get_current_time()); - } - - _onDestroy() { - this._workspace.disconnect(this._windowAddedId); - this._workspace.disconnect(this._windowRemovedId); - global.display.disconnect(this._restackedId); - } -}); - -var WorkspaceIndicator = GObject.registerClass({ - GTypeName: 'WindowListWorkspaceIndicator' -}, class WorkspaceIndicator extends PanelMenu.Button { - _init() { - super._init(0.0, _('Workspace Indicator'), true); - this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM)); - this.add_style_class_name('window-list-workspace-indicator'); - this.menu.actor.remove_style_class_name('panel-menu'); - - let container = new St.Widget({ - layout_manager: new Clutter.BinLayout(), - x_expand: true, - y_expand: true - }); - this.add_actor(container); - - let workspaceManager = global.workspace_manager; - - this._currentWorkspace = workspaceManager.get_active_workspace_index(); - this._statusLabel = new St.Label({ text: this._getStatusText() }); - - this._statusBin = new St.Bin({ - style_class: 'status-label-bin', - x_expand: true, - y_expand: true, - child: this._statusLabel - }); - container.add_actor(this._statusBin); - - this._thumbnailsBox = new St.BoxLayout({ - style_class: 'workspaces-box', - y_expand: true, - reactive: true - }); - this._thumbnailsBox.connect('scroll-event', - this._onScrollEvent.bind(this)); - container.add_actor(this._thumbnailsBox); - - this._workspacesItems = []; - - this._workspaceManagerSignals = [ - workspaceManager.connect('notify::n-workspaces', - this._nWorkspacesChanged.bind(this)), - workspaceManager.connect_after('workspace-switched', - this._onWorkspaceSwitched.bind(this)), - workspaceManager.connect('notify::layout-rows', - this._onWorkspaceOrientationChanged.bind(this)) - ]; - - this.connect('scroll-event', this._onScrollEvent.bind(this)); - this._updateMenu(); - this._updateThumbnails(); - this._onWorkspaceOrientationChanged(); - - this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.wm.preferences' }); - this._settingsChangedId = this._settings.connect( - 'changed::workspace-names', this._updateMenuLabels.bind(this)); - } - - _onDestroy() { - for (let i = 0; i < this._workspaceManagerSignals.length; i++) - global.workspace_manager.disconnect(this._workspaceManagerSignals[i]); - - if (this._settingsChangedId) { - this._settings.disconnect(this._settingsChangedId); - this._settingsChangedId = 0; - } - - super._onDestroy(); - } - - _onWorkspaceOrientationChanged() { - let vertical = global.workspace_manager.layout_rows == -1; - this.reactive = vertical; - - this._statusBin.visible = vertical; - this._thumbnailsBox.visible = !vertical; - } - - _onWorkspaceSwitched() { - let workspaceManager = global.workspace_manager; - this._currentWorkspace = workspaceManager.get_active_workspace_index(); - - this._updateMenuOrnament(); - this._updateActiveThumbnail(); - - this._statusLabel.set_text(this._getStatusText()); - } - - _nWorkspacesChanged() { - this._updateMenu(); - this._updateThumbnails(); - } - - _updateMenuOrnament() { - for (let i = 0; i < this._workspacesItems.length; i++) { - this._workspacesItems[i].setOrnament(i == this._currentWorkspace - ? PopupMenu.Ornament.DOT - : PopupMenu.Ornament.NONE); - } - } - - _updateActiveThumbnail() { - let thumbs = this._thumbnailsBox.get_children(); - for (let i = 0; i < thumbs.length; i++) { - if (i == this._currentWorkspace) - thumbs[i].add_style_class_name('active'); - else - thumbs[i].remove_style_class_name('active'); - } - } - - _getStatusText() { - let workspaceManager = global.workspace_manager; - let current = workspaceManager.get_active_workspace_index(); - let total = workspaceManager.n_workspaces; - - return '%d / %d'.format(current + 1, total); - } - - _updateMenuLabels() { - for (let i = 0; i < this._workspacesItems.length; i++) { - let item = this._workspacesItems[i]; - let name = Meta.prefs_get_workspace_name(i); - item.label.text = name; - } - } - - _updateMenu() { - let workspaceManager = global.workspace_manager; - - this.menu.removeAll(); - this._workspacesItems = []; - this._currentWorkspace = workspaceManager.get_active_workspace_index(); - - for (let i = 0; i < workspaceManager.n_workspaces; i++) { - let name = Meta.prefs_get_workspace_name(i); - let item = new PopupMenu.PopupMenuItem(name); - item.workspaceId = i; - - item.connect('activate', (item, _event) => { - this._activate(item.workspaceId); - }); - - if (i == this._currentWorkspace) - item.setOrnament(PopupMenu.Ornament.DOT); - - this.menu.addMenuItem(item); - this._workspacesItems[i] = item; - } - - this._statusLabel.set_text(this._getStatusText()); - } - - _updateThumbnails() { - let workspaceManager = global.workspace_manager; - - this._thumbnailsBox.destroy_all_children(); - - for (let i = 0; i < workspaceManager.n_workspaces; i++) { - let thumb = new WorkspaceThumbnail(i); - this._thumbnailsBox.add_actor(thumb); - } - this._updateActiveThumbnail(); - } - - _activate(index) { - let workspaceManager = global.workspace_manager; - - if (index >= 0 && index < workspaceManager.n_workspaces) { - let metaWorkspace = workspaceManager.get_workspace_by_index(index); - metaWorkspace.activate(global.get_current_time()); - } - } - - _onScrollEvent(actor, event) { - let direction = event.get_scroll_direction(); - let diff = 0; - if (direction == Clutter.ScrollDirection.DOWN) { - diff = 1; - } else if (direction == Clutter.ScrollDirection.UP) { - diff = -1; - } else { - return; - } - - let newIndex = this._currentWorkspace + diff; - this._activate(newIndex); - } - - _allocate(actor, box, flags) { - if (actor.get_n_children() > 0) - actor.get_first_child().allocate(box, flags); - } -}); - diff --git a/extensions/workspace-indicator/extension.js b/extensions/workspace-indicator/extension.js index 69eef88..3be1268 100644 --- a/extensions/workspace-indicator/extension.js +++ b/extensions/workspace-indicator/extension.js @@ -2,269 +2,56 @@ /* exported init enable disable */ const { Clutter, Gio, GObject, Meta, St } = imports.gi; - -const DND = imports.ui.dnd; -const ExtensionUtils = imports.misc.extensionUtils; -const Main = imports.ui.main; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; const Gettext = imports.gettext.domain('gnome-shell-extensions'); const _ = Gettext.gettext; -const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; -const WORKSPACE_KEY = 'workspace-names'; - -let WindowPreview = GObject.registerClass({ - GTypeName: 'WorkspaceIndicatorWindowPreview' -}, class WindowPreview extends St.Button { - _init(window) { - super._init({ - style_class: 'workspace-indicator-window-preview' - }); - - this._delegate = this; - DND.makeDraggable(this, { restoreOnSuccess: true }); - - this._window = window; - - this.connect('destroy', this._onDestroy.bind(this)); - - this._sizeChangedId = this._window.connect('size-changed', - this._relayout.bind(this)); - this._positionChangedId = this._window.connect('position-changed', - this._relayout.bind(this)); - this._minimizedChangedId = this._window.connect('notify::minimized', - this._relayout.bind(this)); - this._monitorEnteredId = global.display.connect('window-entered-monitor', - this._relayout.bind(this)); - this._monitorLeftId = global.display.connect('window-left-monitor', - this._relayout.bind(this)); - - // Do initial layout when we get a parent - let id = this.connect('parent-set', () => { - this.disconnect(id); - if (!this.get_parent()) - return; - this._laterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { - this._laterId = 0; - this._relayout(); - return false; - }); - }); - - this._focusChangedId = global.display.connect('notify::focus-window', - this._onFocusChanged.bind(this)); - this._onFocusChanged(); - } - - // needed for DND - get realWindow() { - return this._window.get_compositor_private(); - } - - _onDestroy() { - this._window.disconnect(this._sizeChangedId); - this._window.disconnect(this._positionChangedId); - this._window.disconnect(this._minimizedChangedId); - global.display.disconnect(this._monitorEnteredId); - global.display.disconnect(this._monitorLeftId); - global.display.disconnect(this._focusChangedId); - if (this._laterId) - Meta.later_remove(this._laterId); - } - - _onFocusChanged() { - if (global.display.focus_window == this._window) - this.add_style_class_name('active'); - else - this.remove_style_class_name('active'); - } - - _relayout() { - let monitor = Main.layoutManager.findIndexForActor(this); - this.visible = monitor == this._window.get_monitor() && - this._window.showing_on_its_workspace(); - - if (!this.visible) - return; - - let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor); - let hscale = this.get_parent().allocation.get_width() / workArea.width; - let vscale = this.get_parent().allocation.get_height() / workArea.height; - - let frameRect = this._window.get_frame_rect(); - this.set_size( - Math.round(Math.min(frameRect.width, workArea.width) * hscale), - Math.round(Math.min(frameRect.height, workArea.height) * vscale)); - this.set_position( - Math.round(frameRect.x * hscale), - Math.round(frameRect.y * vscale)); - } -}); - -let WorkspaceThumbnail = GObject.registerClass({ - GTypeName: 'WorkspaceIndicatorWorkspaceThumbnail' -}, class WorkspaceThumbnail extends St.Button { - _init(index) { - super._init({ - style_class: 'workspace', - child: new Clutter.Actor({ - layout_manager: new Clutter.BinLayout(), - clip_to_allocation: true - }), - x_fill: true, - y_fill: true - }); - - this.connect('destroy', this._onDestroy.bind(this)); - - this._index = index; - this._delegate = this; // needed for DND - - this._windowPreviews = new Map(); - - let workspaceManager = global.workspace_manager; - this._workspace = workspaceManager.get_workspace_by_index(index); - - this._windowAddedId = this._workspace.connect('window-added', - (ws, window) => { - this._addWindow(window); - }); - this._windowRemovedId = this._workspace.connect('window-removed', - (ws, window) => { - this._removeWindow(window); - }); - this._restackedId = global.display.connect('restacked', - this._onRestacked.bind(this)); - - this._workspace.list_windows().forEach(w => this._addWindow(w)); - this._onRestacked(); - } - - acceptDrop(source) { - if (!source.realWindow) - return false; - - let window = source.realWindow.get_meta_window(); - this._moveWindow(window); - return true; - } - - handleDragOver(source) { - if (source.realWindow) - return DND.DragMotionResult.MOVE_DROP; - else - return DND.DragMotionResult.CONTINUE; - } - - _addWindow(window) { - if (this._windowPreviews.has(window)) - return; - - let preview = new WindowPreview(window); - preview.connect('clicked', (a, btn) => this.emit('clicked', btn)); - this._windowPreviews.set(window, preview); - this.child.add_child(preview); - } - - _removeWindow(window) { - let preview = this._windowPreviews.get(window); - if (!preview) - return; - - this._windowPreviews.delete(window); - preview.destroy(); - } - - _onRestacked() { - let lastPreview = null; - let windows = global.get_window_actors().map(a => a.meta_window); - for (let i = 0; i < windows.length; i++) { - let preview = this._windowPreviews.get(windows[i]); - if (!preview) - continue; - - this.child.set_child_above_sibling(preview, lastPreview); - lastPreview = preview; - } - } - - _moveWindow(window) { - let monitorIndex = Main.layoutManager.findIndexForActor(this); - if (monitorIndex != window.get_monitor()) - window.move_to_monitor(monitorIndex); - window.change_workspace_by_index(this._index, false); - } +const Main = imports.ui.main; - // eslint-disable-next-line camelcase - on_clicked() { - let ws = global.workspace_manager.get_workspace_by_index(this._index); - if (ws) - ws.activate(global.get_current_time()); - } +const ExtensionUtils = imports.misc.extensionUtils; - _onDestroy() { - this._workspace.disconnect(this._windowAddedId); - this._workspace.disconnect(this._windowRemovedId); - global.display.disconnect(this._restackedId); - } -}); +const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; +const WORKSPACE_KEY = 'workspace-names'; let WorkspaceIndicator = GObject.registerClass( class WorkspaceIndicator extends PanelMenu.Button { _init() { super._init(0.0, _('Workspace Indicator')); - let container = new St.Widget({ - layout_manager: new Clutter.BinLayout(), - x_expand: true, - y_expand: true - }); - this.add_actor(container); - let workspaceManager = global.workspace_manager; - this._currentWorkspace = workspaceManager.get_active_workspace_index(); - this._statusLabel = new St.Label({ - style_class: 'panel-workspace-indicator', + this._currentWorkspace = workspaceManager.get_active_workspace().index(); + this.statusLabel = new St.Label({ y_align: Clutter.ActorAlign.CENTER, text: this._labelText() }); - container.add_actor(this._statusLabel); - - this._thumbnailsBox = new St.BoxLayout({ - style_class: 'panel-workspace-indicator-box', - y_expand: true, - reactive: true - }); - - container.add_actor(this._thumbnailsBox); + this.add_actor(this.statusLabel); - this._workspacesItems = []; + this.workspacesItems = []; this._workspaceSection = new PopupMenu.PopupMenuSection(); this.menu.addMenuItem(this._workspaceSection); - this._workspaceManagerSignals = [ - workspaceManager.connect_after('notify::n-workspaces', - this._nWorkspacesChanged.bind(this)), - workspaceManager.connect_after('workspace-switched', - this._onWorkspaceSwitched.bind(this)), - workspaceManager.connect('notify::layout-rows', - this._onWorkspaceOrientationChanged.bind(this)) - ]; + this._workspaceManagerSignals = []; + this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-added', + this._createWorkspacesSection.bind(this))); + this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-removed', + this._createWorkspacesSection.bind(this))); + this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-switched', + this._updateIndicator.bind(this))); this.connect('scroll-event', this._onScrollEvent.bind(this)); - this._thumbnailsBox.connect('scroll-event', this._onScrollEvent.bind(this)); this._createWorkspacesSection(); - this._updateThumbnails(); - this._onWorkspaceOrientationChanged(); + + //styling + this.statusLabel.add_style_class_name('panel-workspace-indicator'); this._settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA }); - this._settingsChangedId = this._settings.connect( - `changed::${WORKSPACE_KEY}`, - this._updateMenuLabels.bind(this)); + this._settingsChangedId = + this._settings.connect(`changed::${WORKSPACE_KEY}`, + this._createWorkspacesSection.bind(this)); } _onDestroy() { @@ -276,55 +63,15 @@ class WorkspaceIndicator extends PanelMenu.Button { this._settingsChangedId = 0; } - Main.panel.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); - super._onDestroy(); } - _onWorkspaceOrientationChanged() { - let vertical = global.workspace_manager.layout_rows == -1; - this.reactive = vertical; + _updateIndicator() { + this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.NONE); + this._currentWorkspace = global.workspace_manager.get_active_workspace().index(); + this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.DOT); - this._statusLabel.visible = vertical; - this._thumbnailsBox.visible = !vertical; - - // Disable offscreen-redirect when showing the workspace switcher - // so that clip-to-allocation works - Main.panel.set_offscreen_redirect(vertical - ? Clutter.OffscreenRedirect.ALWAYS - : Clutter.OffscreenRedirect.AUTOMATIC_FOR_OPACITY); - } - - _onWorkspaceSwitched() { - this._currentWorkspace = global.workspace_manager.get_active_workspace_index(); - - this._updateMenuOrnament(); - this._updateActiveThumbnail(); - - this._statusLabel.set_text(this._labelText()); - } - - _nWorkspacesChanged() { - this._createWorkspacesSection(); - this._updateThumbnails(); - } - - _updateMenuOrnament() { - for (let i = 0; i < this._workspacesItems.length; i++) { - this._workspacesItems[i].setOrnament(i == this._currentWorkspace - ? PopupMenu.Ornament.DOT - : PopupMenu.Ornament.NONE); - } - } - - _updateActiveThumbnail() { - let thumbs = this._thumbnailsBox.get_children(); - for (let i = 0; i < thumbs.length; i++) { - if (i == this._currentWorkspace) - thumbs[i].add_style_class_name('active'); - else - thumbs[i].remove_style_class_name('active'); - } + this.statusLabel.set_text(this._labelText()); } _labelText(workspaceIndex) { @@ -335,51 +82,34 @@ class WorkspaceIndicator extends PanelMenu.Button { return Meta.prefs_get_workspace_name(workspaceIndex); } - _updateMenuLabels() { - for (let i = 0; i < this._workspacesItems.length; i++) - this._workspacesItems[i].label.text = this._labelText(i); - } - _createWorkspacesSection() { let workspaceManager = global.workspace_manager; this._workspaceSection.removeAll(); - this._workspacesItems = []; - this._currentWorkspace = workspaceManager.get_active_workspace_index(); + this.workspacesItems = []; + this._currentWorkspace = workspaceManager.get_active_workspace().index(); let i = 0; for (; i < workspaceManager.n_workspaces; i++) { - this._workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i)); - this._workspaceSection.addMenuItem(this._workspacesItems[i]); - this._workspacesItems[i].workspaceId = i; - this._workspacesItems[i].label_actor = this._statusLabel; - this._workspacesItems[i].connect('activate', (actor, _event) => { + this.workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i)); + this._workspaceSection.addMenuItem(this.workspacesItems[i]); + this.workspacesItems[i].workspaceId = i; + this.workspacesItems[i].label_actor = this.statusLabel; + this.workspacesItems[i].connect('activate', (actor, _event) => { this._activate(actor.workspaceId); }); if (i == this._currentWorkspace) - this._workspacesItems[i].setOrnament(PopupMenu.Ornament.DOT); + this.workspacesItems[i].setOrnament(PopupMenu.Ornament.DOT); } - this._statusLabel.set_text(this._labelText()); - } - - _updateThumbnails() { - let workspaceManager = global.workspace_manager; - - this._thumbnailsBox.destroy_all_children(); - - for (let i = 0; i < workspaceManager.n_workspaces; i++) { - let thumb = new WorkspaceThumbnail(i); - this._thumbnailsBox.add_actor(thumb); - } - this._updateActiveThumbnail(); + this.statusLabel.set_text(this._labelText()); } _activate(index) { let workspaceManager = global.workspace_manager; - if (index >= 0 && index < workspaceManager.n_workspaces) { + if (index >= 0 && index < workspaceManager.n_workspaces) { let metaWorkspace = workspaceManager.get_workspace_by_index(index); metaWorkspace.activate(global.get_current_time()); } @@ -396,7 +126,7 @@ class WorkspaceIndicator extends PanelMenu.Button { return; } - let newIndex = global.workspace_manager.get_active_workspace_index() + diff; + let newIndex = global.workspace_manager.get_active_workspace().index() + diff; this._activate(newIndex); } }); diff --git a/extensions/workspace-indicator/stylesheet.css b/extensions/workspace-indicator/stylesheet.css index 8c101e7..1271f1c 100644 --- a/extensions/workspace-indicator/stylesheet.css +++ b/extensions/workspace-indicator/stylesheet.css @@ -1,37 +1,5 @@ .panel-workspace-indicator { padding: 0 8px; - border: 1px solid #cccccc; -} - -.panel-workspace-indicator-box { - padding: 2px 0; -} - -.panel-workspace-indicator-box .workspace { - border: 1px solid #cccccc; - width: 48px; -} - -.panel-workspace-indicator, -.panel-workspace-indicator-box .workspace.active { background-color: rgba(200, 200, 200, .5); -} - -.panel-workspace-indicator-box .workspace { - background-color: rgba(200, 200, 200, .3); - border-left-width: 0; -} - -.panel-workspace-indicator-box .workspace:first-child { - border-left-width: 1px; -} - -.workspace-indicator-window-preview { - background-color: #252525; - border: 1px solid #ccc; -} - -.workspace-indicator-window-preview { - background-color: #353535; - border: 2px solid #ccc; + border: 1px solid #cccccc; } diff --git a/meson.build b/meson.build index 23bd5ad..b987f2d 100644 --- a/meson.build +++ b/meson.build @@ -33,11 +33,8 @@ uuid_suffix = '@gnome-shell-extensions.gcampax.github.com' classic_extensions = [ 'apps-menu', - 'desktop-icons', - 'horizontal-workspaces', 'places-menu', 'launch-new-instance', - 'top-icons', 'window-list' ] @@ -52,15 +49,8 @@ default_extensions += [ all_extensions = default_extensions all_extensions += [ 'auto-move-windows', - 'dash-to-dock', - 'disable-screenshield', 'native-window-placement', - 'no-hot-corner', - 'panel-favorites', - 'systemMonitor', - 'updates-dialog', - 'user-theme', - 'window-grouper' + 'user-theme' ] enabled_extensions = get_option('enable_extensions') diff --git a/po/POTFILES.in b/po/POTFILES.in index 55f0e9a..9c1438a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -10,8 +10,6 @@ extensions/native-window-placement/org.gnome.shell.extensions.native-window-plac extensions/places-menu/extension.js extensions/places-menu/placeDisplay.js extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml -extensions/updates-dialog/extension.js -extensions/updates-dialog/org.gnome.shell.extensions.updates-dialog.gschema.xml extensions/user-theme/extension.js extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml extensions/window-list/extension.js diff --git a/po/cs.po b/po/cs.po index e8f2fa3..04bb195 100644 --- a/po/cs.po +++ b/po/cs.po @@ -1,28 +1,11 @@ -# #-#-#-#-# cs.po (gnome-shell-extensions) #-#-#-#-# -# #-#-#-#-# cs.po (gnome-shell-extensions) #-#-#-#-# # Czech translation for gnome-shell-extensions. # Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. # Petr Kovar , 2013. # Marek Černocký , 2011, 2012, 2013, 2014, 2015, 2017. # -# #-#-#-#-# cs.po (desktop-icons master) #-#-#-#-# -# Czech translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Marek Černocký , 2018. -# -# #-#-#-#-# cs.po (desktop-icons master) #-#-#-#-# -# Czech translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Marek Černocký , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# cs.po (gnome-shell-extensions) #-#-#-#-#\n" -"#-#-#-#-# cs.po (gnome-shell-extensions) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -36,34 +19,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" -"#-#-#-#-# cs.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-01 20:15+0000\n" -"PO-Revision-Date: 2018-10-02 11:10+0200\n" -"Last-Translator: Marek Černocký \n" -"Language-Team: čeština \n" -"Language: cs\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Gtranslator 2.91.7\n" -"#-#-#-#-# cs.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-01 20:15+0000\n" -"PO-Revision-Date: 2018-10-02 11:10+0200\n" -"Last-Translator: Marek Černocký \n" -"Language-Team: čeština \n" -"Language: cs\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Gtranslator 2.91.7\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -395,119 +350,3 @@ msgstr "Název" #, javascript-format msgid "Workspace %d" msgstr "Pracovní plocha %d" - -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "Velikost ikon na pracovní ploše" - -#: prefs.js:89 -msgid "Small" -msgstr "malé" - -#: prefs.js:89 -msgid "Standard" -msgstr "standardní" - -#: prefs.js:89 -msgid "Large" -msgstr "velké" - -#: prefs.js:89 -msgid "Huge" -msgstr "obrovské" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "Zobrazovat osobní složku na pracovní ploše" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "Zobrazovat ikonu koše na pracovní ploše" - -#: desktopGrid.js:178 desktopGrid.js:297 -msgid "New Folder" -msgstr "Nová složka" - -#: desktopGrid.js:299 -msgid "Paste" -msgstr "Vložit" - -#: desktopGrid.js:300 -msgid "Undo" -msgstr "Zpět" - -#: desktopGrid.js:301 -msgid "Redo" -msgstr "Znovu" - -#: desktopGrid.js:303 -msgid "Open Desktop in Files" -msgstr "Otevřít plochu v Souborech" - -#: desktopGrid.js:304 -msgid "Open Terminal" -msgstr "Otevřít terminál" - -#: desktopGrid.js:306 -msgid "Change Background…" -msgstr "Změnit pozadí…" - -#: desktopGrid.js:307 -msgid "Display Settings" -msgstr "Zobrazit nastavení" - -#: desktopGrid.js:308 -msgid "Settings" -msgstr "Nastavení" - -#: fileItem.js:226 -msgid "Open" -msgstr "Otevřít" - -#: fileItem.js:229 -msgid "Cut" -msgstr "Vyjmout" - -#: fileItem.js:230 -msgid "Copy" -msgstr "Kopírovat" - -#: fileItem.js:231 -msgid "Move to Trash" -msgstr "Přesunout do koše" - -#: fileItem.js:235 -msgid "Empty trash" -msgstr "Vyprázdnit koš" - -#: fileItem.js:241 -msgid "Properties" -msgstr "Vlastnosti" - -#: fileItem.js:243 -msgid "Show in Files" -msgstr "Zobrazit v Souborech" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Velikost ikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Nastavit velikost pro ikony na pracovní ploše." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Zobrazovat osobní složku" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Zobrazovat osobní složku na pracovní ploše." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Zobrazovat koš" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Zobrazovat ikonu koše na pracovní ploše." diff --git a/po/da.po b/po/da.po index eeeef12..5a4c257 100644 --- a/po/da.po +++ b/po/da.po @@ -1,5 +1,3 @@ -# #-#-#-#-# da.po (gnome-shell-extensions master) #-#-#-#-# -# #-#-#-#-# da.po (gnome-shell-extensions master) #-#-#-#-# # Danish translation for gnome-shell-extensions. # Copyright (C) 2011-2017 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. @@ -8,23 +6,8 @@ # Ask Hjorth Larsen , 2015, 2017. # Joe Hansen , 2017. # -# #-#-#-#-# da.po (desktop-icons master) #-#-#-#-# -# Danish translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Alan Mortensen , 2018. -# -# #-#-#-#-# da.po (desktop-icons master) #-#-#-#-# -# Danish translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Alan Mortensen , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# da.po (gnome-shell-extensions master) #-#-#-#-#\n" -"#-#-#-#-# da.po (gnome-shell-extensions master) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -37,34 +20,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"#-#-#-#-# da.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-26 12:04+0000\n" -"PO-Revision-Date: 2018-10-27 16:42+0200\n" -"Language-Team: Danish \n" -"Language: da\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Last-Translator: Alan Mortensen \n" -"X-Generator: Poedit 2.0.6\n" -"#-#-#-#-# da.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-26 12:04+0000\n" -"PO-Revision-Date: 2018-10-27 16:42+0200\n" -"Language-Team: Danish \n" -"Language: da\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Last-Translator: Alan Mortensen \n" -"X-Generator: Poedit 2.0.6\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -404,119 +359,3 @@ msgstr "Navn" #, javascript-format msgid "Workspace %d" msgstr "Arbejdsområde %d" - -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "Størrelsen på skrivebordsikoner" - -#: prefs.js:89 -msgid "Small" -msgstr "Små" - -#: prefs.js:89 -msgid "Standard" -msgstr "Standard" - -#: prefs.js:89 -msgid "Large" -msgstr "Store" - -#: prefs.js:89 -msgid "Huge" -msgstr "Enorme" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "Vis den personlige mappe på skrivebordet" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "Vis papirkurvsikonet på skrivebordet" - -#: desktopGrid.js:178 desktopGrid.js:297 -msgid "New Folder" -msgstr "Ny mappe" - -#: desktopGrid.js:299 -msgid "Paste" -msgstr "Indsæt" - -#: desktopGrid.js:300 -msgid "Undo" -msgstr "Fortryd" - -#: desktopGrid.js:301 -msgid "Redo" -msgstr "Omgør" - -#: desktopGrid.js:303 -msgid "Open Desktop in Files" -msgstr "Åbn skrivebordet i Filer" - -#: desktopGrid.js:304 -msgid "Open Terminal" -msgstr "Åbn Terminal" - -#: desktopGrid.js:306 -msgid "Change Background…" -msgstr "Skift baggrund …" - -#: desktopGrid.js:307 -msgid "Display Settings" -msgstr "Skærmindstillinger" - -#: desktopGrid.js:308 -msgid "Settings" -msgstr "Indstillinger" - -#: fileItem.js:385 -msgid "Open" -msgstr "Åbn" - -#: fileItem.js:388 -msgid "Cut" -msgstr "Klip" - -#: fileItem.js:389 -msgid "Copy" -msgstr "Kopiér" - -#: fileItem.js:390 -msgid "Move to Trash" -msgstr "Flyt til papirkurven" - -#: fileItem.js:394 -msgid "Empty trash" -msgstr "Tøm papirkurven" - -#: fileItem.js:400 -msgid "Properties" -msgstr "Egenskaber" - -#: fileItem.js:402 -msgid "Show in Files" -msgstr "Vis i Filer" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Ikonstørrelse" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Angiv størrelsen på skrivebordsikoner." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Vis personlig mappe" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Vis den personlige mappe på skrivebordet." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Vis papirkurvsikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Vis papirkurvsikonet på skrivebordet." diff --git a/po/de.po b/po/de.po index 6ca034e..01924b8 100644 --- a/po/de.po +++ b/po/de.po @@ -1,5 +1,3 @@ -# #-#-#-#-# de.po (gnome-shell-extensions master) #-#-#-#-# -# #-#-#-#-# de.po (gnome-shell-extensions master) #-#-#-#-# # German translation for gnome-shell-extensions. # Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. @@ -9,23 +7,8 @@ # Wolfgang Stöggl , 2014. # Paul Seyfert , 2017. # -# #-#-#-#-# de.po (desktop-icons master) #-#-#-#-# -# German translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Mario Blättermann , 2018. -# -# #-#-#-#-# de.po (desktop-icons master) #-#-#-#-# -# German translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Mario Blättermann , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# de.po (gnome-shell-extensions master) #-#-#-#-#\n" -"#-#-#-#-# de.po (gnome-shell-extensions master) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -39,34 +22,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.2\n" -"#-#-#-#-# de.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-02 21:39+0000\n" -"PO-Revision-Date: 2018-10-03 21:28+0200\n" -"Last-Translator: Mario Blättermann \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.1.1\n" -"#-#-#-#-# de.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-02 21:39+0000\n" -"PO-Revision-Date: 2018-10-03 21:28+0200\n" -"Last-Translator: Mario Blättermann \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.1.1\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -411,119 +366,3 @@ msgstr "Name" #, javascript-format msgid "Workspace %d" msgstr "Arbeitsfläche %d" - -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "Größe der Arbeitsflächensymbole" - -#: prefs.js:89 -msgid "Small" -msgstr "Klein" - -#: prefs.js:89 -msgid "Standard" -msgstr "Standard" - -#: prefs.js:89 -msgid "Large" -msgstr "Groß" - -#: prefs.js:89 -msgid "Huge" -msgstr "Riesig" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "Den persönlichen Ordner auf der Arbeitsfläche anzeigen" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "Papierkorb-Symbol auf der Arbeitsfläche anzeigen" - -#: desktopGrid.js:178 desktopGrid.js:297 -msgid "New Folder" -msgstr "Neuer Ordner" - -#: desktopGrid.js:299 -msgid "Paste" -msgstr "Einfügen" - -#: desktopGrid.js:300 -msgid "Undo" -msgstr "Rückgängig" - -#: desktopGrid.js:301 -msgid "Redo" -msgstr "Wiederholen" - -#: desktopGrid.js:303 -msgid "Open Desktop in Files" -msgstr "Arbeitsfläche in Dateiverwaltung öffnen" - -#: desktopGrid.js:304 -msgid "Open Terminal" -msgstr "Terminal öffnen" - -#: desktopGrid.js:306 -msgid "Change Background…" -msgstr "Hintergrund ändern …" - -#: desktopGrid.js:307 -msgid "Display Settings" -msgstr "Anzeigeeinstellungen" - -#: desktopGrid.js:308 -msgid "Settings" -msgstr "Einstellungen" - -#: fileItem.js:226 -msgid "Open" -msgstr "Öffnen" - -#: fileItem.js:229 -msgid "Cut" -msgstr "Ausschneiden" - -#: fileItem.js:230 -msgid "Copy" -msgstr "Kopieren" - -#: fileItem.js:231 -msgid "Move to Trash" -msgstr "In den Papierkorb verschieben" - -#: fileItem.js:235 -msgid "Empty trash" -msgstr "Papierkorb leeren" - -#: fileItem.js:241 -msgid "Properties" -msgstr "Eigenschaften" - -#: fileItem.js:243 -msgid "Show in Files" -msgstr "In Dateiverwaltung anzeigen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Symbolgröße" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Die Größe der Arbeitsflächensymbole festlegen." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Persönlichen Ordner anzeigen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Den persönlichen Ordner auf der Arbeitsfläche anzeigen." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Papierkorb-Symbol anzeigen" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Das Papierkorb-Symbol auf der Arbeitsfläche anzeigen." diff --git a/po/es.po b/po/es.po index 18cf8d4..a3c0703 100644 --- a/po/es.po +++ b/po/es.po @@ -1,5 +1,3 @@ -# #-#-#-#-# es.po (gnome-shell-extensions master) #-#-#-#-# -# #-#-#-#-# es.po (gnome-shell-extensions master) #-#-#-#-# # Spanish translation for gnome-shell-extensions. # Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. @@ -8,27 +6,8 @@ # # Daniel Mustieles , 2011-2015, 2017. # -# #-#-#-#-# es.po (PACKAGE VERSION) #-#-#-#-# -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# Sergio Costas , 2018. -# Daniel Mustieles , 2018, 2019. -# -# #-#-#-#-# es.po (PACKAGE VERSION) #-#-#-#-# -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# Sergio Costas , 2018. -# Daniel Mustieles , 2018, 2019. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# es.po (gnome-shell-extensions master) #-#-#-#-#\n" -"#-#-#-#-# es.po (gnome-shell-extensions master) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -42,34 +21,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" -"#-#-#-#-# es.po (PACKAGE VERSION) #-#-#-#-#\n" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-12-14 09:12+0000\n" -"PO-Revision-Date: 2019-01-08 16:12+0100\n" -"Last-Translator: Daniel Mustieles \n" -"Language-Team: es \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 2.91.7\n" -"#-#-#-#-# es.po (PACKAGE VERSION) #-#-#-#-#\n" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-12-14 09:12+0000\n" -"PO-Revision-Date: 2019-01-08 16:12+0100\n" -"Last-Translator: Daniel Mustieles \n" -"Language-Team: es \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 2.91.7\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -410,146 +361,6 @@ msgstr "Nombre" msgid "Workspace %d" msgstr "Área de trabajo %d" -#: desktopGrid.js:311 -msgid "Display Settings" -msgstr "Configuración de pantalla" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Tamaño de los iconos" - -#: desktopGrid.js:578 -msgid "Cancel" -msgstr "Cancelar" - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Tamaño de los iconos del escritorio" - -#: prefs.js:102 -msgid "Small" -msgstr "Pequeño" - -#: prefs.js:102 -msgid "Standard" -msgstr "Estándar" - -#: prefs.js:102 -msgid "Large" -msgstr "Grande" - -#: prefs.js:102 -msgid "Huge" -msgstr "Inmenso" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Mostrar la carpeta personal en el escritorio" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Mostrar la papelera en el escritorio" - -#: desktopGrid.js:182 desktopGrid.js:301 -msgid "New Folder" -msgstr "Nueva carpeta" - -#: desktopGrid.js:303 -msgid "Paste" -msgstr "Pegar" - -#: desktopGrid.js:304 -msgid "Undo" -msgstr "Deshacer" - -#: desktopGrid.js:305 -msgid "Redo" -msgstr "Rehacer" - -#: desktopGrid.js:307 -msgid "Open Desktop in Files" -msgstr "Abrir el escritorio en Files" - -#: desktopGrid.js:308 -msgid "Open Terminal" -msgstr "Abrir un terminal" - -#: desktopGrid.js:310 -msgid "Change Background…" -msgstr "Cambiar el fondo..." - -#: desktopGrid.js:312 -msgid "Settings" -msgstr "Configuración" - -#: desktopGrid.js:568 -msgid "Enter file name…" -msgstr "Introduzca el nombre del archivo…" - -#: desktopGrid.js:572 -msgid "OK" -msgstr "Aceptar" - -#: fileItem.js:485 -msgid "Don’t Allow Launching" -msgstr "No permitir lanzar" - -#: fileItem.js:487 -msgid "Allow Launching" -msgstr "Permitir lanzar" - -#: fileItem.js:550 -msgid "Open" -msgstr "Abrir" - -#: fileItem.js:553 -msgid "Cut" -msgstr "Cortar" - -#: fileItem.js:554 -msgid "Copy" -msgstr "Copiar" - -#: fileItem.js:556 -msgid "Rename" -msgstr "Renombrar" - -#: fileItem.js:557 -msgid "Move to Trash" -msgstr "Mover a la papelera" - -#: fileItem.js:567 -msgid "Empty Trash" -msgstr "Vaciar la papelera" - -#: fileItem.js:573 -msgid "Properties" -msgstr "Propiedades" - -#: fileItem.js:575 -msgid "Show in Files" -msgstr "Mostrar en Files" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Establece el tamaño de los iconos del escritorio." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Mostrar la carpeta personal" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Mostrar la carpeta personal en el escritorio." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Mostrar la papelera" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Mostrar la papelera en el escritorio." - #~ msgid "CPU" #~ msgstr "CPU" @@ -598,6 +409,9 @@ msgstr "Mostrar la papelera en el escritorio." #~ msgid "Display" #~ msgstr "Pantalla" +#~ msgid "Display Settings" +#~ msgstr "Configuración de pantalla" + #~ msgid "File System" #~ msgstr "Sistema de archivos" @@ -645,6 +459,9 @@ msgstr "Mostrar la papelera en el escritorio." #~ "Configura la posición del tablero en la pantalla. Los valores permitidos " #~ "son «right» (derecha) o «left» (izquierda)" +#~ msgid "Icon size" +#~ msgstr "Tamaño del icono" + #~ msgid "Sets icon size of the dock." #~ msgstr "Configura el tamaño de los íconos del tablero." @@ -815,6 +632,9 @@ msgstr "Mostrar la papelera en el escritorio." #~ msgid "Alt Tab Behaviour" #~ msgstr "Comportamiento de Alt+Tab" +#~ msgid "Cancel" +#~ msgstr "Cancelar" + #~ msgid "Notifications" #~ msgstr "Notificaciones" @@ -848,27 +668,3 @@ msgstr "Mostrar la papelera en el escritorio." #~ msgid "Busy" #~ msgstr "Ocupado" - -#~ msgid "Ok" -#~ msgstr "Aceptar" - -#~ msgid "huge" -#~ msgstr "inmenso" - -#~ msgid "Maximum width for the icons and filename." -#~ msgstr "Ancho máximo de los iconos y el nombre de fichero." - -#~ msgid "Shows the Documents folder in the desktop." -#~ msgstr "Muestra la carpeta Documentos en el escritorio." - -#~ msgid "Shows the Downloads folder in the desktop." -#~ msgstr "Muestra la carpeta Descargas en el escritorio." - -#~ msgid "Shows the Music folder in the desktop." -#~ msgstr "Muestra la carpeta Música en el escritorio." - -#~ msgid "Shows the Pictures folder in the desktop." -#~ msgstr "Muestra la carpeta Imágenes en el escritorio." - -#~ msgid "Shows the Videos folder in the desktop." -#~ msgstr "Muestra la carpeta Vídeos en el escritorio." diff --git a/po/fi.po b/po/fi.po index 73b33cc..e036448 100644 --- a/po/fi.po +++ b/po/fi.po @@ -1,5 +1,3 @@ -# #-#-#-#-# fi.po (gnome-shell-extensions) #-#-#-#-# -# #-#-#-#-# fi.po (gnome-shell-extensions) #-#-#-#-# # Finnish translation of gnome-shell-extensions. # Copyright (C) 2011 Ville-Pekka Vainio # This file is distributed under the same license as the gnome-shell-extensions package. @@ -9,23 +7,8 @@ # Ville-Pekka Vainio , 2011. # Jiri Grönroos , 2012, 2013, 2014, 2015, 2017. # -# #-#-#-#-# fi.po (desktop-icons master) #-#-#-#-# -# Finnish translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Jiri Grönroos , 2018. -# -# #-#-#-#-# fi.po (desktop-icons master) #-#-#-#-# -# Finnish translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Jiri Grönroos , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# fi.po (gnome-shell-extensions) #-#-#-#-#\n" -"#-#-#-#-# fi.po (gnome-shell-extensions) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -41,34 +24,6 @@ msgstr "" "X-Generator: Gtranslator 2.91.7\n" "X-Project-Style: gnome\n" "X-POT-Import-Date: 2012-03-05 15:06:12+0000\n" -"#-#-#-#-# fi.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-14 08:09+0000\n" -"PO-Revision-Date: 2018-10-14 12:44+0300\n" -"Language-Team: Finnish \n" -"Language: fi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Last-Translator: Jiri Grönroos \n" -"X-Generator: Poedit 2.0.6\n" -"#-#-#-#-# fi.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-14 08:09+0000\n" -"PO-Revision-Date: 2018-10-14 12:44+0300\n" -"Language-Team: Finnish \n" -"Language: fi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Last-Translator: Jiri Grönroos \n" -"X-Generator: Poedit 2.0.6\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -397,122 +352,6 @@ msgstr "Nimi" msgid "Workspace %d" msgstr "Työtila %d" -#: desktopGrid.js:307 -msgid "Display Settings" -msgstr "Näytön asetukset" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Kuvakekoko" - -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "Työpöytäkuvakkeiden koko" - -#: prefs.js:89 -msgid "Small" -msgstr "Pieni" - -#: prefs.js:89 -msgid "Standard" -msgstr "Normaali" - -#: prefs.js:89 -msgid "Large" -msgstr "Suuri" - -#: prefs.js:89 -msgid "Huge" -msgstr "Valtava" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "Näytä kotikansio työpöydällä" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "Näytä roskakorin kuvake työpöydällä" - -#: desktopGrid.js:178 desktopGrid.js:297 -msgid "New Folder" -msgstr "Uusi kansio" - -#: desktopGrid.js:299 -msgid "Paste" -msgstr "Liitä" - -#: desktopGrid.js:300 -msgid "Undo" -msgstr "Kumoa" - -#: desktopGrid.js:301 -msgid "Redo" -msgstr "Tee uudeleen" - -#: desktopGrid.js:303 -msgid "Open Desktop in Files" -msgstr "Avaa työpöytä tiedostonhallinnassa" - -#: desktopGrid.js:304 -msgid "Open Terminal" -msgstr "Avaa pääte" - -#: desktopGrid.js:306 -msgid "Change Background…" -msgstr "Vaihda taustakuvaa…" - -#: desktopGrid.js:308 -msgid "Settings" -msgstr "Asetukset" - -#: fileItem.js:211 -msgid "Open" -msgstr "Avaa" - -#: fileItem.js:214 -msgid "Cut" -msgstr "Leikkaa" - -#: fileItem.js:215 -msgid "Copy" -msgstr "Kopioi" - -#: fileItem.js:216 -msgid "Move to Trash" -msgstr "Siirrä roskakoriin" - -#: fileItem.js:220 -msgid "Empty trash" -msgstr "Tyhjennä roskakori" - -#: fileItem.js:226 -msgid "Properties" -msgstr "Ominaisuudet" - -#: fileItem.js:228 -msgid "Show in Files" -msgstr "Näytä tiedostonhallinnassa" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Aseta työpöytäkuvakkeiden koko." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Näytä kotikansio" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Näytä kotikansio työpöydällä." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Näytä roskakorin kuvake" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Näytä roskakorin kuvake työpöydällä." - #~ msgid "CPU" #~ msgstr "Suoritin" @@ -549,6 +388,9 @@ msgstr "Näytä roskakorin kuvake työpöydällä." #~ msgid "Display" #~ msgstr "Näyttö" +#~ msgid "Display Settings" +#~ msgstr "Näytön asetukset" + #~ msgid "Drag here to add favorites" #~ msgstr "Raahaa tähän lisätäksesi suosikkeihin" @@ -570,6 +412,9 @@ msgstr "Näytä roskakorin kuvake työpöydällä." #~ msgstr "" #~ "Asettaa telakan sijainnin näytöllä. Sallitut arvot ovat 'right' tai 'left'" +#~ msgid "Icon size" +#~ msgstr "Kuvakkeiden koko" + #~ msgid "Sets icon size of the dock." #~ msgstr "Asettaa telakan kuvakkeiden koon." diff --git a/po/fr.po b/po/fr.po index a61cc76..6825d0d 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,5 +1,3 @@ -# #-#-#-#-# fr.po (gnome-shell-extensions master) #-#-#-#-# -# #-#-#-#-# fr.po (gnome-shell-extensions master) #-#-#-#-# # French translation for gnome-shell-extensions. # Copyright (C) 2011-12 Listed translators # This file is distributed under the same license as the gnome-shell-extensions package. @@ -7,25 +5,8 @@ # Alain Lojewski , 2012-2013. # Charles Monzat , 2018. # -# #-#-#-#-# fr.po (desktop-icons master) #-#-#-#-# -# French translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# ghentdebian , 2018. -# Charles Monzat , 2018. -# -# #-#-#-#-# fr.po (desktop-icons master) #-#-#-#-# -# French translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# ghentdebian , 2018. -# Charles Monzat , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# fr.po (gnome-shell-extensions master) #-#-#-#-#\n" -"#-#-#-#-# fr.po (gnome-shell-extensions master) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" @@ -38,33 +19,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"#-#-#-#-# fr.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-12-14 09:12+0000\n" -"PO-Revision-Date: 2018-12-16 17:47+0100\n" -"Last-Translator: Charles Monzat \n" -"Language-Team: GNOME French Team \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" -"X-Generator: Gtranslator 3.30.0\n" -"#-#-#-#-# fr.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-12-14 09:12+0000\n" -"PO-Revision-Date: 2018-12-16 17:47+0100\n" -"Last-Translator: Charles Monzat \n" -"Language-Team: GNOME French Team \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Gtranslator 3.30.0\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 @@ -400,151 +354,9 @@ msgstr "Espace de travail %d" #~ msgstr "" #~ "Retarder les changements de focus en mode souris jusqu’à ce que le " #~ "pointeur arrête de bouger" -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Taille des icônes du bureau" - -#: prefs.js:102 -msgid "Small" -msgstr "Petite" - -#: prefs.js:102 -msgid "Standard" -msgstr "Normale" - -#: prefs.js:102 -msgid "Large" -msgstr "Grande" - -#: prefs.js:102 -msgid "Huge" -msgstr "Immense" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Montrer le dossier personnel sur le bureau" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Montrer la corbeille sur le bureau" - -#: desktopGrid.js:182 desktopGrid.js:301 -msgid "New Folder" -msgstr "Nouveau dossier" - -#: desktopGrid.js:303 -msgid "Paste" -msgstr "Coller" - -#: desktopGrid.js:304 -msgid "Undo" -msgstr "Annuler" - -#: desktopGrid.js:305 -msgid "Redo" -msgstr "Refaire" - -#: desktopGrid.js:307 -msgid "Open Desktop in Files" -msgstr "Ouvrir le bureau dans Fichiers" - -#: desktopGrid.js:308 -msgid "Open Terminal" -msgstr "Ouvrir un terminal" - -#: desktopGrid.js:310 -msgid "Change Background…" -msgstr "Changer l’arrière-plan…" - -#: desktopGrid.js:311 -msgid "Display Settings" -msgstr "Configuration d’affichage" - -#: desktopGrid.js:312 -msgid "Settings" -msgstr "Paramètres" - -#: desktopGrid.js:568 -msgid "Enter file name…" -msgstr "Saisir un nom de fichier…" - -#: desktopGrid.js:572 -msgid "OK" -msgstr "Valider" - -#: desktopGrid.js:578 -msgid "Cancel" -msgstr "Annuler" - -#: fileItem.js:485 -msgid "Don’t Allow Launching" -msgstr "Ne pas autoriser le lancement" - -#: fileItem.js:487 -msgid "Allow Launching" -msgstr "Autoriser le lancement" - -#: fileItem.js:550 -msgid "Open" -msgstr "Ouvrir" - -#: fileItem.js:553 -msgid "Cut" -msgstr "Couper" - -#: fileItem.js:554 -msgid "Copy" -msgstr "Copier" - -#: fileItem.js:556 -msgid "Rename" -msgstr "Renommer" - -#: fileItem.js:557 -msgid "Move to Trash" -msgstr "Mettre à la corbeille" - -#: fileItem.js:567 -msgid "Empty Trash" -msgstr "Vider la corbeille" - -#: fileItem.js:573 -msgid "Properties" -msgstr "Propriétés" - -#: fileItem.js:575 -msgid "Show in Files" -msgstr "Montrer dans Fichiers" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Taille d’icônes" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Définir la taille des icônes du bureau." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Montrer le dossier personnel" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Montrer le dossier personnel sur le bureau." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Montrer l’icône de la corbeille" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Montrer la corbeille sur le bureau." #~ msgid "CPU" #~ msgstr "CPU" #~ msgid "Memory" #~ msgstr "Mémoire" - -#~ msgid "Ok" -#~ msgstr "Valider" diff --git a/po/id.po b/po/id.po index 033ae90..8986a5e 100644 --- a/po/id.po +++ b/po/id.po @@ -1,28 +1,11 @@ -# #-#-#-#-# id.po (gnome-shell-extensions master) #-#-#-#-# -# #-#-#-#-# id.po (gnome-shell-extensions master) #-#-#-#-# # Indonesian translation for gnome-shell-extensions. # Copyright (C) 2012 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. # # Andika Triwidada , 2012, 2013. # Dirgita , 2012. -# #-#-#-#-# id.po (desktop-icons master) #-#-#-#-# -# Indonesian translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# FIRST AUTHOR , YEAR. -# -# #-#-#-#-# id.po (desktop-icons master) #-#-#-#-# -# Indonesian translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# id.po (gnome-shell-extensions master) #-#-#-#-#\n" -"#-#-#-#-# id.po (gnome-shell-extensions master) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -37,32 +20,6 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Generator: Poedit 2.0.2\n" -"#-#-#-#-# id.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-02 09:18+0000\n" -"PO-Revision-Date: 2018-10-02 20:30+0700\n" -"Language-Team: Indonesian \n" -"Language: id\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Kukuh Syafaat \n" -"X-Generator: Poedit 2.0.6\n" -"#-#-#-#-# id.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-02 09:18+0000\n" -"PO-Revision-Date: 2018-10-02 20:30+0700\n" -"Language-Team: Indonesian \n" -"Language: id\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Kukuh Syafaat \n" -"X-Generator: Poedit 2.0.6\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -401,122 +358,6 @@ msgstr "Nama" msgid "Workspace %d" msgstr "Ruang Kerja %d" -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "Ukuran untuk ikon destop" - -#: prefs.js:89 -msgid "Small" -msgstr "Kecil" - -#: prefs.js:89 -msgid "Standard" -msgstr "Standar" - -#: prefs.js:89 -msgid "Large" -msgstr "Besar" - -#: prefs.js:89 -msgid "Huge" -msgstr "Sangat besar" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "Tampilkan folder pribadi di destop" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "Tampilkan ikon tong sampah di destop" - -#: desktopGrid.js:178 desktopGrid.js:297 -msgid "New Folder" -msgstr "Folder Baru" - -#: desktopGrid.js:299 -msgid "Paste" -msgstr "Tempel" - -#: desktopGrid.js:300 -msgid "Undo" -msgstr "Tak Jadi" - -#: desktopGrid.js:301 -msgid "Redo" -msgstr "Jadi Lagi" - -#: desktopGrid.js:303 -msgid "Open Desktop in Files" -msgstr "Buka Destop pada Berkas" - -#: desktopGrid.js:304 -msgid "Open Terminal" -msgstr "Buka Terminal" - -#: desktopGrid.js:306 -msgid "Change Background…" -msgstr "Ubah Latar Belakang…" - -#: desktopGrid.js:307 -msgid "Display Settings" -msgstr "Pengaturan Tampilan" - -#: desktopGrid.js:308 -msgid "Settings" -msgstr "Pengaturan" - -#: fileItem.js:226 -msgid "Open" -msgstr "Buka" - -#: fileItem.js:229 -msgid "Cut" -msgstr "Potong" - -#: fileItem.js:230 -msgid "Copy" -msgstr "Salin" - -#: fileItem.js:231 -msgid "Move to Trash" -msgstr "Pindahkan ke Tong Sampah" - -#: fileItem.js:235 -msgid "Empty trash" -msgstr "Kosongkan Tong Sampah" - -#: fileItem.js:241 -msgid "Properties" -msgstr "Properti" - -#: fileItem.js:243 -msgid "Show in Files" -msgstr "Tampilkan pada Berkas" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Ukuran ikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Set ukuran untuk ikon destop." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Tampilkan folder pribadi" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Tampilkan folder pribadi di destop." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Tampilkan ikon tong sampah" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Tampilkan ikon tong sampah di destop." - #~ msgid "CPU" #~ msgstr "CPU" diff --git a/po/it.po b/po/it.po index 1d6fd26..4e3a59c 100644 --- a/po/it.po +++ b/po/it.po @@ -1,5 +1,3 @@ -# #-#-#-#-# it.po (gnome-shell-extensions) #-#-#-#-# -# #-#-#-#-# it.po (gnome-shell-extensions) #-#-#-#-# # Italian translations for GNOME Shell extensions # Copyright (C) 2011 Giovanni Campagna et al. # Copyright (C) 2012, 2013, 2014, 2015, 2017 The Free Software Foundation, Inc. @@ -8,23 +6,8 @@ # Milo Casagrande , 2013, 2014, 2015, 2017. # Gianvito Cavasoli , 2017. # -# #-#-#-#-# it.po (desktop-icons master) #-#-#-#-# -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Massimo Branchini , 2018. -# -# #-#-#-#-# it.po (desktop-icons master) #-#-#-#-# -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Massimo Branchini , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# it.po (gnome-shell-extensions) #-#-#-#-#\n" -"#-#-#-#-# it.po (gnome-shell-extensions) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -38,34 +21,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.12\n" -"#-#-#-#-# it.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-11-29 09:07+0000\n" -"PO-Revision-Date: 2018-12-05 11:14+0100\n" -"Last-Translator: Massimo Branchini \n" -"Language-Team: Italian \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2\n" -"#-#-#-#-# it.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-11-29 09:07+0000\n" -"PO-Revision-Date: 2018-12-05 11:14+0100\n" -"Last-Translator: Massimo Branchini \n" -"Language-Team: Italian \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -407,135 +362,3 @@ msgstr "Nome" #, javascript-format msgid "Workspace %d" msgstr "Spazio di lavoro %d" - -#: prefs.js:93 -msgid "Size for the desktop icons" -msgstr "Dimensione delle icone della scrivania" - -#: prefs.js:93 -msgid "Small" -msgstr "Piccola" - -#: prefs.js:93 -msgid "Standard" -msgstr "Normale" - -#: prefs.js:93 -msgid "Large" -msgstr "Grande" - -#: prefs.js:93 -msgid "Huge" -msgstr "Enorme" - -#: prefs.js:94 -msgid "Show the personal folder in the desktop" -msgstr "Mostra la cartella personale sulla scrivania" - -#: prefs.js:95 -msgid "Show the trash icon in the desktop" -msgstr "Mostra il cestino sulla scrivania" - -#: desktopGrid.js:185 desktopGrid.js:304 -msgid "New Folder" -msgstr "Nuova cartella" - -#: desktopGrid.js:306 -msgid "Paste" -msgstr "Incolla" - -#: desktopGrid.js:307 -msgid "Undo" -msgstr "Annulla" - -#: desktopGrid.js:308 -msgid "Redo" -msgstr "Ripeti" - -#: desktopGrid.js:310 -msgid "Open Desktop in Files" -msgstr "Apri la scrivania in File" - -#: desktopGrid.js:311 -msgid "Open Terminal" -msgstr "Apri un terminale" - -#: desktopGrid.js:313 -msgid "Change Background…" -msgstr "Cambia lo sfondo…" - -#: desktopGrid.js:314 -msgid "Display Settings" -msgstr "Impostazioni dello schermo" - -#: desktopGrid.js:315 -msgid "Settings" -msgstr "Impostazioni" - -#: desktopGrid.js:569 -msgid "Enter file name…" -msgstr "Indicare un nome per il file…" - -#: desktopGrid.js:573 -msgid "Ok" -msgstr "Ok" - -#: desktopGrid.js:579 -msgid "Cancel" -msgstr "Annulla" - -#: fileItem.js:393 -msgid "Open" -msgstr "Apri" - -#: fileItem.js:396 -msgid "Cut" -msgstr "Taglia" - -#: fileItem.js:397 -msgid "Copy" -msgstr "Copia" - -#: fileItem.js:398 -msgid "Rename" -msgstr "Rinomina" - -#: fileItem.js:399 -msgid "Move to Trash" -msgstr "Sposta nel cestino" - -#: fileItem.js:403 -msgid "Empty Trash" -msgstr "Svuota il cestino" - -#: fileItem.js:409 -msgid "Properties" -msgstr "Proprietà" - -#: fileItem.js:411 -msgid "Show in Files" -msgstr "Mostra in File" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Dimensione dell'icona" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Imposta la grandezza delle icone della scrivania." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Mostra la cartella personale" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Mostra la cartella personale sulla scrivania." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Mostra il cestino" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Mostra il cestino sulla scrivania." diff --git a/po/pl.po b/po/pl.po index 94dd40b..35799ee 100644 --- a/po/pl.po +++ b/po/pl.po @@ -1,30 +1,11 @@ -# #-#-#-#-# pl.po (gnome-shell-extensions) #-#-#-#-# -# #-#-#-#-# pl.po (gnome-shell-extensions) #-#-#-#-# # Polish translation for gnome-shell-extensions. # Copyright © 2011-2017 the gnome-shell-extensions authors. # This file is distributed under the same license as the gnome-shell-extensions package. # Piotr Drąg , 2011-2017. # Aviary.pl , 2011-2017. # -# #-#-#-#-# pl.po (desktop-icons) #-#-#-#-# -# Polish translation for desktop-icons. -# Copyright © 2018-2019 the desktop-icons authors. -# This file is distributed under the same license as the desktop-icons package. -# Piotr Drąg , 2018-2019. -# Aviary.pl , 2018-2019. -# -# #-#-#-#-# pl.po (desktop-icons) #-#-#-#-# -# Polish translation for desktop-icons. -# Copyright © 2018-2019 the desktop-icons authors. -# This file is distributed under the same license as the desktop-icons package. -# Piotr Drąg , 2018-2019. -# Aviary.pl , 2018-2019. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# pl.po (gnome-shell-extensions) #-#-#-#-#\n" -"#-#-#-#-# pl.po (gnome-shell-extensions) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -38,34 +19,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"#-#-#-#-# pl.po (desktop-icons) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-01-15 10:59+0000\n" -"PO-Revision-Date: 2019-01-15 20:57+0100\n" -"Last-Translator: Piotr Drąg \n" -"Language-Team: Polish \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" -"#-#-#-#-# pl.po (desktop-icons) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2019-01-15 10:59+0000\n" -"PO-Revision-Date: 2019-01-15 20:57+0100\n" -"Last-Translator: Piotr Drąg \n" -"Language-Team: Polish \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -405,139 +358,3 @@ msgstr "Nazwa" #, javascript-format msgid "Workspace %d" msgstr "%d. obszar roboczy" - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Rozmiar ikon na pulpicie" - -#: prefs.js:102 -msgid "Small" -msgstr "Mały" - -#: prefs.js:102 -msgid "Standard" -msgstr "Standardowy" - -#: prefs.js:102 -msgid "Large" -msgstr "Duży" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Katalog domowy na pulpicie" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Kosz na pulpicie" - -#: desktopGrid.js:187 desktopGrid.js:306 -msgid "New Folder" -msgstr "Nowy katalog" - -#: desktopGrid.js:308 -msgid "Paste" -msgstr "Wklej" - -#: desktopGrid.js:309 -msgid "Undo" -msgstr "Cofnij" - -#: desktopGrid.js:310 -msgid "Redo" -msgstr "Ponów" - -#: desktopGrid.js:312 -msgid "Show Desktop in Files" -msgstr "Wyświetl pulpit w menedżerze plików" - -#: desktopGrid.js:313 fileItem.js:586 -msgid "Open in Terminal" -msgstr "Otwórz w terminalu" - -#: desktopGrid.js:315 -msgid "Change Background…" -msgstr "Zmień tło…" - -#: desktopGrid.js:317 -msgid "Display Settings" -msgstr "Ustawienia ekranu" - -#: desktopGrid.js:318 -msgid "Settings" -msgstr "Ustawienia" - -#: desktopGrid.js:559 -msgid "Enter file name…" -msgstr "Nazwa pliku…" - -#: desktopGrid.js:563 -msgid "OK" -msgstr "OK" - -#: desktopGrid.js:569 -msgid "Cancel" -msgstr "Anuluj" - -#: fileItem.js:490 -msgid "Don’t Allow Launching" -msgstr "Nie zezwalaj na uruchamianie" - -#: fileItem.js:492 -msgid "Allow Launching" -msgstr "Zezwól na uruchamianie" - -#: fileItem.js:559 -msgid "Open" -msgstr "Otwórz" - -#: fileItem.js:562 -msgid "Cut" -msgstr "Wytnij" - -#: fileItem.js:563 -msgid "Copy" -msgstr "Skopiuj" - -#: fileItem.js:565 -msgid "Rename…" -msgstr "Zmień nazwę…" - -#: fileItem.js:566 -msgid "Move to Trash" -msgstr "Przenieś do kosza" - -#: fileItem.js:576 -msgid "Empty Trash" -msgstr "Opróżnij kosz" - -#: fileItem.js:582 -msgid "Properties" -msgstr "Właściwości" - -#: fileItem.js:584 -msgid "Show in Files" -msgstr "Wyświetl w menedżerze plików" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:11 -msgid "Icon size" -msgstr "Rozmiar ikon" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Set the size for the desktop icons." -msgstr "Ustawia rozmiar ikon na pulpicie." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:16 -msgid "Show personal folder" -msgstr "Katalog domowy" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show the personal folder in the desktop." -msgstr "Wyświetla katalog domowy na pulpicie." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:21 -msgid "Show trash icon" -msgstr "Kosz" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show the trash icon in the desktop." -msgstr "Wyświetla kosz na pulpicie." diff --git a/po/pt_BR.po b/po/pt_BR.po index 77f7a0d..d029648 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -1,5 +1,3 @@ -# #-#-#-#-# pt_BR.po (gnome-shell-extensions master) #-#-#-#-# -# #-#-#-#-# pt_BR.po (gnome-shell-extensions master) #-#-#-#-# # Brazilian Portuguese translation for gnome-shell-extensions. # Copyright (C) 2017 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. @@ -11,23 +9,8 @@ # Og Maciel , 2012. # Enrico Nicoletto , 2013, 2014. # Rafael Fontenelle , 2013, 2017. -# #-#-#-#-# pt_BR.po (desktop-icons master) #-#-#-#-# -# Brazilian Portuguese translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Enrico Nicoletto , 2018. -# Rafael Fontenelle , 2018. -# #-#-#-#-# pt_BR.po (desktop-icons master) #-#-#-#-# -# Brazilian Portuguese translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Enrico Nicoletto , 2018. -# Rafael Fontenelle , 2018. -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# pt_BR.po (gnome-shell-extensions master) #-#-#-#-#\n" -"#-#-#-#-# pt_BR.po (gnome-shell-extensions master) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -42,34 +25,6 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 1.0.0-beta1\n" "X-Project-Style: gnome\n" -"#-#-#-#-# pt_BR.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-12-14 09:12+0000\n" -"PO-Revision-Date: 2018-12-17 01:01-0200\n" -"Last-Translator: Rafael Fontenelle \n" -"Language-Team: Brazilian Portuguese \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Virtaal 1.0.0-beta1\n" -"#-#-#-#-# pt_BR.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-12-14 09:12+0000\n" -"PO-Revision-Date: 2018-12-17 01:01-0200\n" -"Last-Translator: Rafael Fontenelle \n" -"Language-Team: Brazilian Portuguese \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Virtaal 1.0.0-beta1\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -411,146 +366,6 @@ msgstr "Nome" msgid "Workspace %d" msgstr "Espaço de trabalho %d" -#: desktopGrid.js:311 -msgid "Display Settings" -msgstr "Configurações de exibição" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Tamanho do ícone" - -#: desktopGrid.js:578 -msgid "Cancel" -msgstr "Cancelar" - -#: prefs.js:102 -msgid "Size for the desktop icons" -msgstr "Tamanho para os ícones da área de trabalho" - -#: prefs.js:102 -msgid "Small" -msgstr "Pequeno" - -#: prefs.js:102 -msgid "Standard" -msgstr "Padrão" - -#: prefs.js:102 -msgid "Large" -msgstr "Grande" - -#: prefs.js:102 -msgid "Huge" -msgstr "Enorme" - -#: prefs.js:103 -msgid "Show the personal folder in the desktop" -msgstr "Mostrar a pasta pessoal na área de trabalho" - -#: prefs.js:104 -msgid "Show the trash icon in the desktop" -msgstr "Mostrar o ícone da lixeira na área de trabalho" - -#: desktopGrid.js:182 desktopGrid.js:301 -msgid "New Folder" -msgstr "Nova pasta" - -#: desktopGrid.js:303 -msgid "Paste" -msgstr "Colar" - -#: desktopGrid.js:304 -msgid "Undo" -msgstr "Desfazer" - -#: desktopGrid.js:305 -msgid "Redo" -msgstr "Refazer" - -#: desktopGrid.js:307 -msgid "Open Desktop in Files" -msgstr "Abrir área de trabalho no Arquivos" - -#: desktopGrid.js:308 -msgid "Open Terminal" -msgstr "Abrir terminal" - -#: desktopGrid.js:310 -msgid "Change Background…" -msgstr "Alterar plano de fundo…" - -#: desktopGrid.js:312 -msgid "Settings" -msgstr "Configurações" - -#: desktopGrid.js:568 -msgid "Enter file name…" -msgstr "Insira um nome de arquivo…" - -#: desktopGrid.js:572 -msgid "OK" -msgstr "OK" - -#: fileItem.js:485 -msgid "Don’t Allow Launching" -msgstr "Não permitir iniciar" - -#: fileItem.js:487 -msgid "Allow Launching" -msgstr "Permitir iniciar" - -#: fileItem.js:550 -msgid "Open" -msgstr "Abrir" - -#: fileItem.js:553 -msgid "Cut" -msgstr "Recortar" - -#: fileItem.js:554 -msgid "Copy" -msgstr "Copiar" - -#: fileItem.js:556 -msgid "Rename" -msgstr "Renomear" - -#: fileItem.js:557 -msgid "Move to Trash" -msgstr "Mover para a lixeira" - -#: fileItem.js:567 -msgid "Empty Trash" -msgstr "Esvaziar lixeira" - -#: fileItem.js:573 -msgid "Properties" -msgstr "Propriedades" - -#: fileItem.js:575 -msgid "Show in Files" -msgstr "Mostrar no Arquivos" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Define o tamanho para os ícones da área de trabalho." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Mostrar pasta pessoal" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Mostra a pasta pessoal na área de trabalho." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Mostrar ícone da lixeira" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Mostra o ícone da lixeira na área de trabalho." - #~ msgid "CPU" #~ msgstr "CPU" @@ -599,6 +414,9 @@ msgstr "Mostra o ícone da lixeira na área de trabalho." #~ msgid "Display" #~ msgstr "Tela" +#~ msgid "Display Settings" +#~ msgstr "Configurações de tela" + #~ msgid "The application icon mode." #~ msgstr "O modo de ícone do aplicativo." @@ -633,6 +451,9 @@ msgstr "Mostra o ícone da lixeira na área de trabalho." #~ "Define a posição do dock na tela. Os valores permitidos são \"right\" ou " #~ "\"left\"" +#~ msgid "Icon size" +#~ msgstr "Tamanho do ícone" + #~ msgid "Sets icon size of the dock." #~ msgstr "Define o tamanho do ícone do dock." @@ -792,6 +613,9 @@ msgstr "Mostra o ícone da lixeira na área de trabalho." #~ msgid "Alt Tab Behaviour" #~ msgstr "Comportamento do Alt Tab" +#~ msgid "Cancel" +#~ msgstr "Cancelar" + #~ msgid "Ask the user for a default behaviour if true." #~ msgstr "Pergunte ao usuário por um comportamento padrão se marcado." @@ -815,6 +639,3 @@ msgstr "Mostra o ícone da lixeira na área de trabalho." #~ msgid "Log Out..." #~ msgstr "Encerrar sessão..." - -#~ msgid "Ok" -#~ msgstr "Ok" diff --git a/po/ru.po b/po/ru.po index 5e48a26..c18c0ba 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,28 +1,11 @@ -# #-#-#-#-# ru.po (gnome-shell-extensions gnome-3-0) #-#-#-#-# -# #-#-#-#-# ru.po (gnome-shell-extensions gnome-3-0) #-#-#-#-# # Russian translation for gnome-shell-extensions. # Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. # Yuri Myasoedov , 2011, 2012, 2013. # Stas Solovey , 2011, 2012, 2013, 2015, 2017. # -# #-#-#-#-# ru.po #-#-#-#-# -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Eaglers , 2018. -# -# #-#-#-#-# ru.po #-#-#-#-# -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Eaglers , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# ru.po (gnome-shell-extensions gnome-3-0) #-#-#-#-#\n" -"#-#-#-#-# ru.po (gnome-shell-extensions gnome-3-0) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions gnome-3-0\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -37,36 +20,6 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 2.0.3\n" -"#-#-#-#-# ru.po #-#-#-#-#\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-11-22 08:42+0000\n" -"PO-Revision-Date: 2018-11-22 22:02+0300\n" -"Last-Translator: Stas Solovey \n" -"Language-Team: Russian \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 2.2\n" -"#-#-#-#-# ru.po #-#-#-#-#\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-11-22 08:42+0000\n" -"PO-Revision-Date: 2018-11-22 22:02+0300\n" -"Last-Translator: Stas Solovey \n" -"Language-Team: Russian \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 2.2\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -407,138 +360,6 @@ msgstr "Название" msgid "Workspace %d" msgstr "Рабочая область %d" -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "Размер значков" - -#: prefs.js:89 -msgid "Small" -msgstr "Маленький" - -#: prefs.js:89 -msgid "Standard" -msgstr "Стандартный" - -#: prefs.js:89 -msgid "Large" -msgstr "Большой" - -#: prefs.js:89 -msgid "Huge" -msgstr "Огромный" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "Показывать домашнюю папку на рабочем столе" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "Показывать «Корзину» на рабочем столе" - -#: desktopGrid.js:185 desktopGrid.js:304 -msgid "New Folder" -msgstr "Создать папку" - -#: desktopGrid.js:306 -msgid "Paste" -msgstr "Вставить" - -#: desktopGrid.js:307 -msgid "Undo" -msgstr "Отменить" - -#: desktopGrid.js:308 -msgid "Redo" -msgstr "Повторить" - -#: desktopGrid.js:310 -msgid "Open Desktop in Files" -msgstr "Открыть «Рабочий стол» в «Файлах»" - -#: desktopGrid.js:311 -msgid "Open Terminal" -msgstr "Открыть терминал" - -#: desktopGrid.js:313 -msgid "Change Background…" -msgstr "Изменить фон…" - -#: desktopGrid.js:314 -msgid "Display Settings" -msgstr "Настройки дисплея" - -#: desktopGrid.js:315 -msgid "Settings" -msgstr "Параметры" - -#: desktopGrid.js:569 -msgid "Enter file name…" -msgstr "Ввести имя файла…" - -#: desktopGrid.js:573 -msgid "Ok" -msgstr "ОК" - -#: desktopGrid.js:579 -msgid "Cancel" -msgstr "Отмена" - -#: fileItem.js:390 -msgid "Open" -msgstr "Открыть" - -#: fileItem.js:393 -msgid "Cut" -msgstr "Вырезать" - -#: fileItem.js:394 -msgid "Copy" -msgstr "Вставить" - -#: fileItem.js:395 -msgid "Rename" -msgstr "Переименовать" - -#: fileItem.js:396 -msgid "Move to Trash" -msgstr "Переместить в корзину" - -#: fileItem.js:400 -msgid "Empty trash" -msgstr "Очистить корзину" - -#: fileItem.js:406 -msgid "Properties" -msgstr "Свойства" - -#: fileItem.js:408 -msgid "Show in Files" -msgstr "Показать в «Файлах»" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "Размер значков" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "Установить размер значков на рабочем столе." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "Показывать домашнюю папку" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "Показывать значок домашней папки на рабочем столе." - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "Показывать значок корзины" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "Показывать значок корзины на рабочем столе." - #~ msgid "CPU" #~ msgstr "ЦП" diff --git a/po/zh_TW.po b/po/zh_TW.po index 8a675aa..74a95f8 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -1,27 +1,10 @@ -# #-#-#-#-# zh_TW.po (gnome-shell-extensions gnome-3-0) #-#-#-#-# -# #-#-#-#-# zh_TW.po (gnome-shell-extensions gnome-3-0) #-#-#-#-# # Chinese (Taiwan) translation for gnome-shell-extensions. # Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. # Cheng-Chia Tseng , 2011. # -# #-#-#-#-# zh_TW.po (desktop-icons master) #-#-#-#-# -# Chinese (Taiwan) translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Yi-Jyun Pan , 2018. -# -# #-#-#-#-# zh_TW.po (desktop-icons master) #-#-#-#-# -# Chinese (Taiwan) translation for desktop-icons. -# Copyright (C) 2018 desktop-icons's COPYRIGHT HOLDER -# This file is distributed under the same license as the desktop-icons package. -# Yi-Jyun Pan , 2018. -# -#, fuzzy msgid "" msgstr "" -"#-#-#-#-# zh_TW.po (gnome-shell-extensions gnome-3-0) #-#-#-#-#\n" -"#-#-#-#-# zh_TW.po (gnome-shell-extensions gnome-3-0) #-#-#-#-#\n" "Project-Id-Version: gnome-shell-extensions gnome-3-0\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "shell&keywords=I18N+L10N&component=extensions\n" @@ -34,32 +17,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.3\n" -"#-#-#-#-# zh_TW.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-22 14:12+0000\n" -"PO-Revision-Date: 2018-10-24 21:31+0800\n" -"Language-Team: Chinese (Taiwan) \n" -"Language: zh_TW\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Last-Translator: pan93412 \n" -"X-Generator: Poedit 2.2\n" -"#-#-#-#-# zh_TW.po (desktop-icons master) #-#-#-#-#\n" -"Project-Id-Version: desktop-icons master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/ShellExtensions/desktop-" -"icons/issues\n" -"POT-Creation-Date: 2018-10-22 14:12+0000\n" -"PO-Revision-Date: 2018-10-24 21:31+0800\n" -"Language-Team: Chinese (Taiwan) \n" -"Language: zh_TW\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Last-Translator: pan93412 \n" -"X-Generator: Poedit 2.2\n" #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 msgid "GNOME Classic" @@ -387,122 +344,6 @@ msgstr "名稱" msgid "Workspace %d" msgstr "工作區 %d" -#: desktopGrid.js:307 -msgid "Display Settings" -msgstr "顯示設定" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:12 -msgid "Icon size" -msgstr "圖示大小" - -#: prefs.js:89 -msgid "Size for the desktop icons" -msgstr "桌面圖示的大小" - -#: prefs.js:89 -msgid "Small" -msgstr "小圖示" - -#: prefs.js:89 -msgid "Standard" -msgstr "標準大小圖示" - -#: prefs.js:89 -msgid "Large" -msgstr "大圖示" - -#: prefs.js:89 -msgid "Huge" -msgstr "巨大圖示" - -#: prefs.js:90 -msgid "Show the personal folder in the desktop" -msgstr "在桌面顯示個人資料夾" - -#: prefs.js:91 -msgid "Show the trash icon in the desktop" -msgstr "在桌面顯示垃圾桶圖示" - -#: desktopGrid.js:178 desktopGrid.js:297 -msgid "New Folder" -msgstr "新增資料夾" - -#: desktopGrid.js:299 -msgid "Paste" -msgstr "貼上" - -#: desktopGrid.js:300 -msgid "Undo" -msgstr "復原" - -#: desktopGrid.js:301 -msgid "Redo" -msgstr "重做" - -#: desktopGrid.js:303 -msgid "Open Desktop in Files" -msgstr "在《檔案》中開啟桌面" - -#: desktopGrid.js:304 -msgid "Open Terminal" -msgstr "開啟終端器" - -#: desktopGrid.js:306 -msgid "Change Background…" -msgstr "變更背景圖片…" - -#: desktopGrid.js:308 -msgid "Settings" -msgstr "設定" - -#: fileItem.js:223 -msgid "Open" -msgstr "開啟" - -#: fileItem.js:226 -msgid "Cut" -msgstr "剪下" - -#: fileItem.js:227 -msgid "Copy" -msgstr "複製" - -#: fileItem.js:228 -msgid "Move to Trash" -msgstr "移動到垃圾桶" - -#: fileItem.js:232 -msgid "Empty trash" -msgstr "清空回收桶" - -#: fileItem.js:238 -msgid "Properties" -msgstr "屬性" - -#: fileItem.js:240 -msgid "Show in Files" -msgstr "在《檔案》中顯示" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:13 -msgid "Set the size for the desktop icons." -msgstr "設定桌面圖示的大小。" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:17 -msgid "Show personal folder" -msgstr "顯示個人資料夾" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:18 -msgid "Show the personal folder in the desktop." -msgstr "在桌面顯示個人資料夾。" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:22 -msgid "Show trash icon" -msgstr "顯示垃圾桶圖示" - -#: schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml:23 -msgid "Show the trash icon in the desktop." -msgstr "在桌面顯示垃圾桶圖示。" - #~ msgid "CPU" #~ msgstr "CPU" @@ -530,6 +371,9 @@ msgstr "在桌面顯示垃圾桶圖示。" #~ msgid "Display" #~ msgstr "顯示" +#~ msgid "Display Settings" +#~ msgstr "顯示設定值" + #~ msgid "Suspend" #~ msgstr "暫停" @@ -637,6 +481,9 @@ msgstr "在桌面顯示垃圾桶圖示。" #~ msgid "Enable/disable autohide" #~ msgstr "啟用/停用自動隱藏" +#~ msgid "Icon size" +#~ msgstr "圖示大小" + #~ msgid "Position of the dock" #~ msgstr "Dock 的位置"