231 lines
6.8 KiB
JavaScript
231 lines
6.8 KiB
JavaScript
/* exported init, cleanup, get_current_maximized_window */
|
|
|
|
const Mainloop = imports.mainloop;
|
|
|
|
const GLib = imports.gi.GLib;
|
|
const Gio = imports.gi.Gio;
|
|
const Shell = imports.gi.Shell;
|
|
|
|
const Main = imports.ui.main;
|
|
|
|
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
|
|
|
const Convenience = Me.imports.convenience;
|
|
const Extension = Me.imports.extension;
|
|
const Intellifade = Me.imports.intellifade;
|
|
const Settings = Me.imports.settings;
|
|
const Util = Me.imports.util;
|
|
|
|
const Theming = Me.imports.theming;
|
|
const Transitions = Me.imports.transitions;
|
|
|
|
/**
|
|
* Signal Connections
|
|
* js/ui/overview.js/hidden: occurs after the overview is hidden
|
|
* js/ui/overview.js/shown: occurs after the overview is open
|
|
* MetaScreen/restacked: occurs when the window Z-ordering changes
|
|
* window_group/actor-added: occurs when a window actor is added
|
|
* window_group/actor-removed: occurs when a window actor is removed
|
|
* wm/switch-workspace: occurs after a workspace is switched
|
|
*/
|
|
|
|
/**
|
|
* Intialize.
|
|
*
|
|
*/
|
|
function init() {
|
|
this._wm_tracker = Shell.WindowTracker.get_default();
|
|
|
|
this._overviewHidingSig = Main.overview.connect('hiding', Util.strip_args(Intellifade.syncCheck).bind(this));
|
|
|
|
if (Settings.transition_with_overview()) {
|
|
this._overviewShownSig = Main.overview.connect('showing', _overviewShown.bind(this));
|
|
} else {
|
|
this._overviewShownSig = Main.overview.connect('shown', _overviewShown.bind(this));
|
|
}
|
|
|
|
let windows = global.get_window_actors();
|
|
|
|
for (let window_actor of windows) {
|
|
/* Simulate window creation event, null container because _windowActorAdded doesn't utilize containers */
|
|
_windowActorAdded(null, window_actor, false);
|
|
}
|
|
|
|
this._workspaceSwitchSig = global.window_manager.connect_after('switch-workspace', _workspaceSwitched.bind(this));
|
|
|
|
const screen = global.screen || global.display;
|
|
|
|
if (screen) {
|
|
this._windowRestackedSig = screen.connect_after('restacked', _windowRestacked.bind(this));
|
|
} else {
|
|
log('[Dynamic Panel Transparency] Error could not register \'restacked\' event.');
|
|
}
|
|
|
|
this._windowActorAddedSig = global.window_group.connect('actor-added', _windowActorAdded.bind(this));
|
|
this._windowActorRemovedSig = global.window_group.connect('actor-removed', _windowActorRemoved.bind(this));
|
|
|
|
this._appFocusedSig = this._wm_tracker.connect_after('notify::focus-app', _windowRestacked.bind(this));
|
|
}
|
|
|
|
function disconnect(obj, sig) {
|
|
try {
|
|
if (sig != null && obj) {
|
|
obj.disconnect(sig);
|
|
}
|
|
} catch (error) {
|
|
log('[Dynamic Panel Transparency] Failed to disconnect signal: ' + error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Don't want to hold onto anything that isn't ours.
|
|
*
|
|
*/
|
|
function cleanup() {
|
|
/* Disconnect Signals */
|
|
if (this._windowUnminimizeSig) {
|
|
disconnect(global.window_manager, this._windowUnminimizeSig);
|
|
}
|
|
|
|
disconnect(Main.overview, this._overviewShownSig);
|
|
disconnect(Main.overview, this._overviewHidingSig);
|
|
|
|
disconnect(global.window_manager, this._workspaceSwitchSig);
|
|
|
|
disconnect(global.window_group, this._windowActorAddedSig);
|
|
disconnect(global.window_group, this._windowActorRemovedSig);
|
|
|
|
const screen = global.screen || global.display;
|
|
|
|
if (screen) {
|
|
disconnect(screen, this._windowRestackedSig);
|
|
} else {
|
|
log('[Dynamic Panel Transparency] Error could not disconnect \'restacked\' event.');
|
|
}
|
|
|
|
disconnect(this._wm_tracker, this._appFocusedSig);
|
|
|
|
let windows = global.get_window_actors();
|
|
|
|
for (let window_actor of windows) {
|
|
if (typeof (window_actor._dpt_signals) !== 'undefined') {
|
|
for (let signalId of window_actor._dpt_signals) {
|
|
disconnect(window_actor, signalId);
|
|
}
|
|
}
|
|
|
|
delete window_actor._dpt_signals;
|
|
delete window_actor._dpt_tracking;
|
|
}
|
|
|
|
/* Cleanup Signals */
|
|
this._windowRestackedSig = null;
|
|
this._overviewShownSig = null;
|
|
this._overviewHidingSig = null;
|
|
this._windowActorRemovedSig = null;
|
|
this._workspaceSwitchSig = null;
|
|
this._windowActorAddedSig = null;
|
|
|
|
this._wm_tracker = null;
|
|
}
|
|
|
|
/* Event Handlers */
|
|
|
|
/**
|
|
* Called whenever the overview is shown.
|
|
*
|
|
*/
|
|
function _overviewShown() {
|
|
if (!Transitions.get_transparency_status().is_blank()) {
|
|
Transitions.blank_fade_out();
|
|
}
|
|
|
|
if (Settings.get_enable_text_color() && (Settings.get_enable_maximized_text_color() || Settings.get_enable_overview_text_color())) {
|
|
if (Settings.get_enable_overview_text_color()) {
|
|
Theming.remove_text_color();
|
|
Theming.set_text_color('maximized');
|
|
} else {
|
|
Theming.remove_text_color('maximized');
|
|
Theming.set_text_color();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called whenever a window actor is removed.
|
|
*
|
|
*/
|
|
function _windowActorRemoved(container, window_actor) {
|
|
if (typeof (window_actor._dpt_tracking) === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
/* Remove our tracking variable. */
|
|
delete window_actor._dpt_tracking;
|
|
|
|
if (typeof (window_actor._dpt_signals) !== 'undefined') {
|
|
for (let signalId of window_actor._dpt_signals) {
|
|
window_actor.disconnect(signalId);
|
|
}
|
|
}
|
|
|
|
delete window_actor._dpt_signals;
|
|
|
|
Intellifade.asyncCheck();
|
|
}
|
|
|
|
const { major, minor } = Util.get_shell_version();
|
|
|
|
/**
|
|
* Called whenever a window is created in the shell.
|
|
*
|
|
*/
|
|
function _windowActorAdded(window_group, window_actor, force = true) {
|
|
if (window_actor && (force || typeof (window_actor._dpt_tracking) === 'undefined')) {
|
|
window_actor._dpt_tracking = true;
|
|
|
|
let ac_wId = -1;
|
|
|
|
if (major >= 40 || minor > 36) {
|
|
ac_wId = window_actor.connect('notify::allocation', (function() {
|
|
Intellifade.asyncCheck();
|
|
}).bind(this));
|
|
} else {
|
|
ac_wId = window_actor.connect('allocation-changed', (function() {
|
|
Intellifade.asyncCheck();
|
|
}).bind(this));
|
|
}
|
|
|
|
const v_wId = window_actor.connect('notify::visible', (function() {
|
|
Intellifade.asyncCheck();
|
|
}).bind(this));
|
|
window_actor._dpt_signals = [ac_wId, v_wId];
|
|
|
|
Intellifade.asyncCheck();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* SPECIAL_CASE: Only update if we're using per-app settings or is desktop icons are enabled.
|
|
*
|
|
*/
|
|
function _windowRestacked() {
|
|
/* Don't allow restacks while the overview is transitioning. */
|
|
if (!Main.overview.visible) {
|
|
/* Detect if desktop icons are enabled. */
|
|
if (Settings.gs_show_desktop()) {
|
|
Intellifade.asyncCheck();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* SPECIAL_CASE: Update logic requires the workspace that we'll be switching to.
|
|
*
|
|
*/
|
|
function _workspaceSwitched(wm, from, to, direction) {
|
|
/* Detect if desktop icons are enabled. */
|
|
if (!Settings.gs_show_desktop()) {
|
|
Intellifade.syncCheck();
|
|
}
|
|
} |