dotfiles/.local/share/gnome-shell/extensions/dynamic-panel-transparency@.../events.js

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();
}
}