diff --git a/Settings.ui b/Settings.ui index 052397f..d82ea02 100644 --- a/Settings.ui +++ b/Settings.ui @@ -6125,6 +6125,51 @@ + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + + 1 + 0 + + + + + True + False + True + Click empty space to close overview + True + 0 + + + 0 + 0 + + + + + + 100 diff --git a/overview.js b/overview.js index c53e76d..e47aa7d 100644 --- a/overview.js +++ b/overview.js @@ -33,6 +33,7 @@ const Gdk = imports.gi.Gdk; const Gio = imports.gi.Gio; const Mainloop = imports.mainloop; const IconGrid = imports.ui.iconGrid; +const ViewSelector = imports.ui.viewSelector; const Meta = imports.gi.Meta; @@ -59,70 +60,9 @@ var dtpOverview = Utils.defineClass({ this._optionalWorkspaceIsolation(); this._optionalHotKeys(); this._optionalNumberOverlay(); + this._optionalClickToExit(); this._toggleDash(); - Main.overview._overview.reactive = true; - - this._clickAction = new Clutter.ClickAction(); - this._clickAction.connect('clicked', (obj, obj2) => { - - if(this._appPageSwiping) - return; - - let visibleView; - Main.overview.viewSelector.appDisplay._views.every(function(v, index) { - if (v.view.actor.visible) { - visibleView = index; - return false; - } - else - return true; - }); - - - if(Main.overview.viewSelector._showAppsButton.checked) { - if(Me.settings.get_boolean('animate-show-apps')) { - let view = Main.overview.viewSelector.appDisplay._views[visibleView].view; - view.animate(IconGrid.AnimationDirection.OUT, Lang.bind(this, function() { - Main.overview.viewSelector._appsPage.hide(); - Main.overview.hide(); - })); - } else { - Main.overview.hide(); - } - } else { - Main.overview.toggle(); - } - }); - Main.overview._overview.add_action(this._clickAction); - - - if(Main.overview.viewSelector.appDisplay._views[1].view._swipeTracker) { - this._signalsHandler.add([ - Main.overview.viewSelector.appDisplay._views[1].view._swipeTracker, - 'begin', - Lang.bind(this, this._onAppPageSwipeBegin) - ],[ - Main.overview.viewSelector.appDisplay._views[1].view._swipeTracker, - 'end', - Lang.bind(this, this._onAppPageSwipeEnd) - ]); - } else if(Main.overview.viewSelector.appDisplay._views[1].view._panAction) { - this._signalsHandler.add([ - Main.overview.viewSelector.appDisplay._views[1].view._panAction, - 'gesture-begin', - Lang.bind(this, this._onAppPageSwipeBegin) - ],[ - Main.overview.viewSelector.appDisplay._views[1].view._panAction, - 'gesture-cancel', - Lang.bind(this, this._onAppPageSwipeEnd) - ],[ - Main.overview.viewSelector.appDisplay._views[1].view._panAction, - 'gesture-end', - Lang.bind(this, this._onAppPageSwipeEnd) - ]); - } - this._signalsHandler.add([ Me.settings, 'changed::stockgs-keep-dash', @@ -133,14 +73,13 @@ var dtpOverview = Utils.defineClass({ disable: function () { this._signalsHandler.destroy(); this._injectionsHandler.destroy(); - - Main.overview._overview.remove_action(this._clickAction); this._toggleDash(true); // Remove key bindings this._disableHotKeys(); this._disableExtraShortcut(); + this._disableClickToExit(); }, _toggleDash: function(visible) { @@ -461,9 +400,127 @@ var dtpOverview = Utils.defineClass({ })); }, + _optionalClickToExit: function() { + this._clickToExitEnabled = false; + if (Me.settings.get_boolean('overview-click-to-exit')) + this._enableClickToExit(); + + this._signalsHandler.add([ + Me.settings, + 'changed::overview-click-to-exit', + Lang.bind(this, function() { + if (Me.settings.get_boolean('overview-click-to-exit')) + Lang.bind(this, this._enableClickToExit)(); + else + Lang.bind(this, this._disableClickToExit)(); + }) + ]); + }, + + _enableClickToExit: function() { + if (this._clickToExitEnabled) + return; + + this._oldOverviewReactive = Main.overview._overview.reactive + + Main.overview._overview.reactive = true; + + this._clickAction = new Clutter.ClickAction(); + this._clickAction.connect('clicked', () => { + + if(this._appPageSwiping) + return Clutter.EVENT_PROPAGATE; + + + let [x, y] = global.get_pointer(); + let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); + + let activePage = Main.overview.viewSelector.getActivePage(); + if (activePage == ViewSelector.ViewPage.APPS) { + + if(pickedActor != Main.overview._overview + && pickedActor != Main.overview.viewSelector.appDisplay._views[1].view._scrollView + && pickedActor != Main.overview.viewSelector.appDisplay._views[1].view._grid) { + return Clutter.EVENT_PROPAGATE; + } + + let visibleView; + Main.overview.viewSelector.appDisplay._views.every(function(v, index) { + if (v.view.actor.visible) { + visibleView = index; + return false; + } + else + return true; + }); + + if(Me.settings.get_boolean('animate-show-apps')) { + let view = Main.overview.viewSelector.appDisplay._views[visibleView].view; + view.animate(IconGrid.AnimationDirection.OUT, Lang.bind(this, function() { + Main.overview.viewSelector._appsPage.hide(); + Main.overview.hide(); + })); + } else { + Main.overview.hide(); + } + } else if (activePage == ViewSelector.ViewPage.WINDOWS) { + + if(pickedActor == Main.overview._overview._controls._thumbnailsBox + || pickedActor == Main.overview._overview._controls.dash._container) { + return Clutter.EVENT_PROPAGATE; + } + Main.overview.toggle(); + } else { + Main.overview.toggle(); + } + }); + Main.overview._overview.add_action(this._clickAction); + + + if(Main.overview.viewSelector.appDisplay._views[1].view._swipeTracker) { + this._signalsHandler.addWithLabel('clickToExit', [ + Main.overview.viewSelector.appDisplay._views[1].view._swipeTracker, + 'begin', + Lang.bind(this, this._onAppPageSwipeBegin) + ],[ + Main.overview.viewSelector.appDisplay._views[1].view._swipeTracker, + 'end', + Lang.bind(this, this._onAppPageSwipeEnd) + ]); + } else if(Main.overview.viewSelector.appDisplay._views[1].view._panAction) { + this._signalsHandler.addWithLabel('clickToExit', [ + Main.overview.viewSelector.appDisplay._views[1].view._panAction, + 'gesture-begin', + Lang.bind(this, this._onAppPageSwipeBegin) + ],[ + Main.overview.viewSelector.appDisplay._views[1].view._panAction, + 'gesture-cancel', + Lang.bind(this, this._onAppPageSwipeEnd) + ],[ + Main.overview.viewSelector.appDisplay._views[1].view._panAction, + 'gesture-end', + Lang.bind(this, this._onAppPageSwipeEnd) + ]); + } + + this._clickToExitEnabled = true; + }, + + _disableClickToExit: function () { + if(!this._clickToExitEnabled) + return; + + Main.overview._overview.remove_action(this._clickAction); + Main.overview._overview.reactive = this._oldOverviewReactive; + + this._signalsHandler.removeWithLabel('clickToExit'); + + this._clickToExitEnabled = false; + }, + _onAppPageSwipeBegin: function() { this._appPageSwiping = true; - return true; + return Clutter.EVENT_PROPAGATE; }, _onAppPageSwipeEnd: function() { @@ -472,6 +529,6 @@ var dtpOverview = Utils.defineClass({ 0, () => this._appPageSwiping = false ]); - return true; + return Clutter.EVENT_PROPAGATE; } }); diff --git a/prefs.js b/prefs.js index 4eeb162..b10ce6a 100644 --- a/prefs.js +++ b/prefs.js @@ -1355,6 +1355,11 @@ const Settings = new Lang.Class({ 'active', Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('overview-click-to-exit', + this._builder.get_object('clicktoexit_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('group-apps', this._builder.get_object('group_apps_switch'), 'active', diff --git a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml index c832084..fb0b0c7 100644 --- a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml +++ b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -526,6 +526,11 @@ false Provide workspace isolation Dash shows only windows from the current workspace + + + false + Close overview by clicking in empty space + Close overview or app grid by clicking in empty space true