diff --git a/appIcons.js b/appIcons.js index 3189695..24adea5 100644 --- a/appIcons.js +++ b/appIcons.js @@ -133,13 +133,12 @@ var taskbarAppIcon = new Lang.Class({ this._focused = tracker.focus_app == this.app; this._isGroupApps = this._dtpSettings.get_boolean('group-apps'); - this._container = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._dtpIconContainer = new St.Widget({ style_class: 'dtp-icon-container', layout_manager: new Clutter.BinLayout()}); this.actor.remove_actor(this._iconContainer); - this._dtpIconContainer = new St.Widget({ name: 'dtp-icon-container', layout_manager: new Clutter.BinLayout() }); - this._dtpIconContainer.add_child(this._iconContainer); if (appInfo.window) { @@ -174,6 +173,9 @@ var taskbarAppIcon = new Lang.Class({ this._stateChangedId = 0; } + this._setAppIconPadding(); + this._showDots(); + this._focusWindowChangedId = global.display.connect('notify::focus-window', Lang.bind(this, this._onFocusAppChanged)); @@ -193,9 +195,6 @@ var taskbarAppIcon = new Lang.Class({ this._switchWorkspaceId = global.window_manager.connect('switch-workspace', Lang.bind(this, this._onSwitchWorkspace)); - this._setAppIconPadding(); - this._showDots(); - this._dtpSettingsSignalIds = [ this._dtpSettings.connect('changed::dot-position', Lang.bind(this, this._settingsChangeRefresh)), this._dtpSettings.connect('changed::dot-size', Lang.bind(this, this._updateDotSize)), @@ -535,7 +534,7 @@ var taskbarAppIcon = new Lang.Class({ } this.actor.set_style('padding: 0 ' + margin + 'px;'); - this._dtpIconContainer.set_style('padding: ' + padding + 'px;'); + this._iconContainer.set_style('padding: ' + padding + 'px;'); }, popupMenu: function() { @@ -1461,7 +1460,6 @@ var ShowAppsIconWrapper = new Lang.Class({ /* the variable equivalent to toggleButton has a different name in the appIcon class (actor): duplicate reference to easily reuse appIcon methods */ this.actor = this.realShowAppsIcon.toggleButton; - this.actor.name = 'show-apps-btn'; // Re-use appIcon methods this._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; @@ -1508,13 +1506,6 @@ var ShowAppsIconWrapper = new Lang.Class({ customIconPath = this._dtpSettings.get_string('show-apps-icon-file'); this.realShowAppsIcon.icon._createIconTexture(this.realShowAppsIcon.icon.iconSize); }); - - this._dtpSettings.connect('changed::appicon-padding', () => this.setShowAppsPadding()); - this.setShowAppsPadding(); - }, - - setShowAppsPadding: function() { - this.actor.set_style('padding:' + (this._dtpSettings.get_int('appicon-padding') + 2) + 'px;'); }, popupMenu: function() { @@ -1583,4 +1574,4 @@ var MyShowAppsIconMenu = new Lang.Class({ item.connect('activate', Lang.bind(this._source._dtpPanel, this._source._dtpPanel._onShowDesktopButtonPress)); } } -}); +}); \ No newline at end of file diff --git a/panel.js b/panel.js index 88be959..e9fb7df 100644 --- a/panel.js +++ b/panel.js @@ -130,7 +130,6 @@ var dtpPanelWrapper = new Lang.Class({ if (!this.isSecondary) { if (this.panel.vfunc_allocate) { this._panelConnectId = 0; - this.panel.__proto__._dtpOldAllocate = this.panel.__proto__.vfunc_allocate; this.panel.__proto__[Gi.hook_up_vfunc_symbol]('allocate', (box, flags) => this._allocate(null, box, flags)); } else { this._panelConnectId = this.panel.actor.connect('allocate', (actor,box,flags) => this._allocate(actor,box,flags)); @@ -310,8 +309,7 @@ var dtpPanelWrapper = new Lang.Class({ if (this._panelConnectId) { this.panel.actor.disconnect(this._panelConnectId); } else { - this.panel.__proto__[Gi.hook_up_vfunc_symbol]('allocate', this.panel.__proto__._dtpOldAllocate); - delete this.panel.__proto__._dtpOldAllocate; + this.panel.__proto__[Gi.hook_up_vfunc_symbol]('allocate', this.panel.__proto__.vfunc_allocate); } this.panel._leftBox.allocate = this.panel._leftBox.oldLeftBoxAllocate; @@ -852,4 +850,4 @@ var dtpSecondaryAggregateMenu = new Lang.Class({ menuLayout.addSizeChild(this._power.menu.actor); menuLayout.addSizeChild(this._system.menu.actor); }, -}); +}); \ No newline at end of file diff --git a/panelManager.js b/panelManager.js index 4fca1af..8c69660 100755 --- a/panelManager.js +++ b/panelManager.js @@ -35,6 +35,8 @@ const Taskbar = Me.imports.taskbar; const Utils = Me.imports.utils; const BoxPointer = imports.ui.boxpointer; +const Clutter = imports.gi.Clutter; +const Dash = imports.ui.dash; const Gi = imports._gi; const IconGrid = imports.ui.iconGrid; const Main = imports.ui.main; @@ -137,6 +139,17 @@ var dtpPanelManager = new Lang.Class({ this._oldGetShowAppsButton = Main.overview.getShowAppsButton; Main.overview.getShowAppsButton = this._newGetShowAppsButton.bind(this); + if (Dash.DashItemContainer.prototype.vfunc_allocate) { + Dash.DashItemContainer.prototype[Gi.hook_up_vfunc_symbol]('allocate', this._newDashItemContainerAllocate); + Dash.ShowAppsIcon.prototype[Gi.hook_up_vfunc_symbol]('allocate', function(box, flags) { St.Widget.prototype.vfunc_allocate.call(this, box, flags); }); + } + + this._needsIconAllocate = new IconGrid.BaseIcon('') instanceof St.Bin; + + if (this._needsIconAllocate) { + IconGrid.BaseIcon.prototype[Gi.hook_up_vfunc_symbol]('allocate', this._newBaseIconAllocate); + } + // 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) @@ -227,6 +240,15 @@ var dtpPanelManager = new Lang.Class({ Main.layoutManager.panelBox.set_position(Main.layoutManager.primaryMonitor.x, Main.layoutManager.primaryMonitor.y); Main.layoutManager.panelBox.set_size(Main.layoutManager.primaryMonitor.width, -1); + + if (Dash.DashItemContainer.prototype.vfunc_allocate) { + Dash.DashItemContainer.prototype[Gi.hook_up_vfunc_symbol]('allocate', Dash.DashItemContainer.prototype.vfunc_allocate); + Dash.ShowAppsIcon.prototype[Gi.hook_up_vfunc_symbol]('allocate', Dash.ShowAppsIcon.prototype.vfunc_allocate); + } + + if (this._needsIconAllocate) { + IconGrid.BaseIcon.prototype[Gi.hook_up_vfunc_symbol]('allocate', IconGrid.BaseIcon.prototype.vfunc_allocate); + } }, setFocusedMonitor: function(monitor, ignoreRelayout) { @@ -370,6 +392,45 @@ var dtpPanelManager = new Lang.Class({ let focusedMonitorIndex = Taskbar.findIndex(this.allPanels, p => this.checkIfFocusedMonitor(p.monitor)); return this.allPanels[focusedMonitorIndex].taskbar.showAppsButton; + }, + + _newDashItemContainerAllocate: function(box, flags) { + if (this.child == null) + return; + + this.set_allocation(box, flags); + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let [minChildWidth, minChildHeight, natChildWidth, natChildHeight] = this.child.get_preferred_size(); + let [childScaleX, childScaleY] = this.child.get_scale(); + + let childWidth = Math.min(natChildWidth * childScaleX, availWidth); + let childHeight = Math.min(natChildHeight * childScaleY, availHeight); + let childBox = new Clutter.ActorBox(); + + childBox.x1 = (availWidth - childWidth) / 2; + childBox.y1 = (availHeight - childHeight) / 2; + childBox.x2 = childBox.x1 + childWidth; + childBox.y2 = childBox.y1 + childHeight; + + this.child.allocate(childBox, flags); + }, + + _newBaseIconAllocate: function(box, flags) { + this.set_allocation(box, flags); + + let contentBox = this.get_theme_node().get_content_box(box); + let [iconMinHeight, iconNatHeight] = this._iconBin.get_preferred_height(-1); + let [iconMinWidth, iconNatWidth] = this._iconBin.get_preferred_width(-1); + let childBox = new Clutter.ActorBox(); + + childBox.x1 = (contentBox.x2 - contentBox.x1 - iconNatWidth) * .5; + childBox.x2 = contentBox.x1 + iconNatWidth; + childBox.y1 = (contentBox.y2 - contentBox.y1 - iconNatHeight) * .5; + childBox.y2 = contentBox.y1 + iconNatHeight; + + this._iconBin.allocate(childBox, flags); } }); @@ -516,4 +577,4 @@ function newUpdatePanelBarrier(panel, dtpSettings) { x2: barriers[k][1], y2: y2, directions: barriers[k][2] }); }); -} +} \ No newline at end of file diff --git a/stylesheet.css b/stylesheet.css index 0dbeaaf..2088046 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -21,24 +21,25 @@ * Some code was also adapted from the upstream Gnome Shell source code. */ -#dashtopanelScrollview .app-well-app .overview-icon { - border-radius: 0; + #dashtopanelScrollview .app-well-app .overview-icon, + #dashtopanelTaskbar .show-apps .overview-icon { border: none; + margin: 0; + padding: 0; } -#dashtopanelScrollview .app-well-app #dtp-icon-container { +#dashtopanelScrollview .app-well-app .dtp-icon-container { padding: 0 4px; } +#dashtopanelTaskbar .show-apps { + padding: 0 8px; +} + #dashtopanelScrollview .app-well-app .overview-label { padding-right: 8px; } -#show-apps-btn, #show-apps-btn .overview-icon { - margin: 0px; - padding: 0px; -} - #dashtopanelThumbnailScrollview { -st-hfade-offset: 48px; } @@ -48,8 +49,8 @@ background: none; } -#dashtopanelScrollview .app-well-app:hover > :first-child, -#dashtopanelScrollview .app-well-app:focus > :first-child { +#dashtopanelScrollview .app-well-app:hover .dtp-container, +#dashtopanelScrollview .app-well-app:focus .dtp-container { background-color: rgba(238, 238, 236, 0.1); } @@ -118,4 +119,4 @@ background-color: rgba(0,0,0,0.8); color: rgba(256, 256, 256, 1); text-align: center; -} +} \ No newline at end of file diff --git a/taskbar.js b/taskbar.js index e7bc9b2..720dce3 100644 --- a/taskbar.js +++ b/taskbar.js @@ -232,6 +232,11 @@ var taskbar = new Lang.Class({ pivot_point: new Clutter.Point({ x: .5, y: .5 }), rotation_angle_z: 180 })); + this.showAppsButton.add_constraint(new Clutter.BindConstraint({ + source: this._container, + coordinate: Clutter.BindCoordinate.HEIGHT + })); + if (!this._dtpSettings.get_boolean('show-show-apps-button')) this.hideShowAppsButton(); @@ -728,7 +733,6 @@ var taskbar = new Lang.Class({ // Getting the panel height and making sure that the icon padding is at // least the size of the app running indicator on both the top and bottom. let availSize = (this.panelWrapper.panel.actor.get_height() - - (this._dtpSettings.get_int('dot-size') * scaleFactor * 2) - (this._dtpSettings.get_int('appicon-padding') * 2)) / scaleFactor; if (availSize == this.iconSize)