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

571 lines
19 KiB
JavaScript

/* exported init, enable, disable */
const Mainloop = imports.mainloop;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const St = imports.gi.St;
const ExtensionSystem = imports.ui.extensionSystem;
const Main = imports.ui.main;
const Me = imports.misc.extensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const Events = Me.imports.events;
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;
const SETTINGS_DELAY = 3000;
/* Only way to prevent multiple runs apparently. Hacky-ness. */
let modified = false;
/* Initialize */
function init() { }
function enable() {
/* Initialize Settings */
initialize_settings();
/* Initialize Utilities */
Transitions.init();
Theming.init();
Intellifade.init();
/* Modify the panel. */
modify_panel();
/* Start the event loop. */
Events.init();
/* Simulate window changes. */
Intellifade.forceSyncCheck();
}
function disable() {
/* Do this first in case any of the upcoming methods fail. */
unmodify_panel();
try {
/* Disconnect & Null Signals */
Events.cleanup();
/* Cleanup Settings */
Settings.unbind();
Settings.cleanup();
/* Cleanup Transitions */
Transitions.cleanup();
/* Cleanup Theming */
Theming.cleanup();
/* Cleanup Intellifade */
Intellifade.cleanup();
} catch (error) {
log('[DPT] Encountered an error cleaning up extension: ' + error);
}
/* Shouldn't be an issue, but let's make sure it isn't. */
modified = false;
return false;
}
function modify_panel() {
/* Get Rid of the Panel's CSS Background */
Theming.initialize_background_styles();
let text_shadow = Theming.register_text_shadow(Settings.get_text_shadow_color(), Settings.get_text_shadow_position());
let icon_shadow = Theming.register_icon_shadow(Settings.get_icon_shadow_color(), Settings.get_icon_shadow_position());
/* Add Text Shadowing */
if (Settings.add_text_shadow()) {
if (text_shadow !== null) {
Theming.add_text_shadow();
} else {
log('[Dynamic Panel Transparency] Failed to enabled text shadowing.');
}
}
/* Add Icon Shadowing */
if (Settings.add_icon_shadow()) {
if (icon_shadow !== null) {
Theming.add_icon_shadow();
} else {
log('[Dynamic Panel Transparency] Failed to enabled icon shadowing.');
}
}
/* Register text color styling. */
let [text, icon, arrow] = Theming.register_text_color(Settings.get_text_color()); // eslint-disable-line no-unused-vars
let [maximized_text, maximized_icon, maximized_arrow] = Theming.register_text_color(Settings.get_maximized_text_color(), 'maximized'); // eslint-disable-line no-unused-vars
if (Settings.get_enable_text_color()) {
if (text !== null) {
Theming.set_text_color();
} else {
log('[Dynamic Panel Transparency] Failed to enabled text coloring.');
}
}
}
function unmodify_panel() {
/* Remove corner styling */
Theming.clear_corner_color();
/* Remove Our Styling */
Theming.reapply_panel_styling();
Theming.reapply_panel_background_image();
Theming.remove_panel_transparency();
/* Remove shadowing */
if (Theming.has_text_shadow()) {
Theming.remove_text_shadow();
}
if (Theming.has_icon_shadow()) {
Theming.remove_icon_shadow();
}
/* Remove text coloring */
Theming.remove_text_color();
/* Remove maximized text coloring */
Theming.remove_text_color('maximized');
}
// TODO: Merge handler code or hide it behind the backend.
function initialize_settings() {
/* Setup settings... */
Settings.init();
/* Register settings... */
Settings.add({
key: 'hide-corners',
name: 'hide_corners',
type: 'b',
handler: (function() {
Transitions.update_corner_alpha();
}.bind(this))
});
Settings.add({
key: 'transition-speed',
name: 'transition_speed',
type: 'i',
handler: (
/* Update the backend24 transition CSS. */
function() {
Main.panel.remove_style_class_name('dpt-panel-transition-duration');
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('transitions') !== -1 && stylesheet.endsWith('panel-transition-duration.dpt.css')) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
const id = this.panel_transition_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.panel_transition_update_id) {
return false;
}
/* Get Rid of the Panel's CSS */
Theming.update_transition_css();
Intellifade.forceSyncCheck();
return false;
}).bind(this));
}).bind(this)
});
Settings.add({
key: 'unmaximized-opacity',
name: 'unmaximized_opacity',
type: 'i',
getter: 'get_unmaximized_opacity',
handler: (function() {
const super_id = this.opacity_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() {
if (super_id !== this.opacity_update_id) {
return false;
}
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('background') !== -1 && stylesheet.indexOf('panel-') !== -1) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
Theming.initialize_background_styles();
const id = this.panel_color_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.panel_color_update_id) {
return false;
}
/* Get Rid of the Panel's CSS Background */
Theming.remove_background_color();
Intellifade.forceSyncCheck();
return false;
}).bind(this));
return false;
}).bind(this));
}).bind(this)
});
Settings.add({
key: 'maximized-opacity',
name: 'maximized_opacity',
type: 'i',
getter: 'get_maximized_opacity',
handler: (function() {
const super_id = this.opacity_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() {
if (super_id !== this.opacity_update_id) {
return false;
}
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('background') !== -1 && stylesheet.indexOf('panel-') !== -1) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
Theming.initialize_background_styles();
const id = this.panel_color_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.panel_color_update_id) {
return false;
}
/* Get Rid of the Panel's CSS Background */
Intellifade.forceSyncCheck();
return false;
}).bind(this));
return false;
}).bind(this));
}).bind(this)
});
Settings.add({
key: 'panel-color',
name: 'panel_color',
type: 'ai',
parser: Util.tuple_to_native_color,
handler: (
/* Handler for 3.24+ */
function() {
Theming.remove_background_color();
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('background') !== -1 && stylesheet.indexOf('panel.dpt.css') !== -1) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
Theming.register_background_color(Settings.get_panel_color(), 'custom');
const id = this.panel_color_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.panel_color_update_id) {
return false;
}
/* Get Rid of the Panel's CSS Background */
Theming.remove_background_color();
Intellifade.forceSyncCheck();
return false;
}).bind(this));
/* Legacy Handler */
}).bind(this)
});
Settings.add({
key: 'trigger-apps',
name: 'trigger_apps',
type: 'as'
});
Settings.add({
key: 'trigger-windows',
name: 'trigger_windows',
type: 'as'
});
Settings.add({
key: 'text-shadow',
name: 'text_shadow',
type: 'b',
getter: 'add_text_shadow',
handler: (function() {
if (Settings.add_text_shadow()) {
Theming.add_text_shadow();
} else {
Theming.remove_text_shadow();
}
}).bind(this)
});
Settings.add({
key: 'icon-shadow',
name: 'icon_shadow',
type: 'b',
getter: 'add_icon_shadow',
handler: (function() {
if (Settings.add_icon_shadow()) {
Theming.add_icon_shadow();
} else {
Theming.remove_icon_shadow();
}
}).bind(this)
});
Settings.add({
key: 'text-shadow-position',
name: 'text_shadow_position',
type: '(iii)',
handler: (function() {
Theming.remove_text_shadow();
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('shadow') !== -1 && stylesheet.indexOf('text') !== -1) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
let text_shadow = Theming.register_text_shadow(Settings.get_text_shadow_color(), Settings.get_text_shadow_position());
const id = this.text_shadow_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.text_shadow_update_id) {
return false;
}
/* Add Text Shadowing */
if (Settings.add_text_shadow()) {
if (text_shadow !== null) {
Theming.add_text_shadow();
} else {
log('[Dynamic Panel Transparency] Failed to enabled text shadowing.');
}
}
Intellifade.forceSyncCheck();
return false;
}).bind(this));
}).bind(this)
});
Settings.add({
key: 'icon-shadow-position',
name: 'icon_shadow_position',
type: '(iii)',
handler: (function() {
Theming.remove_icon_shadow();
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('shadow') !== -1 && stylesheet.indexOf('icon') !== -1) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
let icon_shadow = Theming.register_icon_shadow(Settings.get_icon_shadow_color(), Settings.get_icon_shadow_position());
const id = this.icon_shadow_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.icon_shadow_update_id) {
return false;
}
/* Add Icon Shadowing */
if (Settings.add_icon_shadow()) {
if (icon_shadow !== null) {
Theming.add_icon_shadow();
} else {
log('[Dynamic Panel Transparency] Failed to enabled icon shadowing.');
}
}
Intellifade.forceSyncCheck();
return false;
}).bind(this));
}).bind(this)
});
Settings.add({
key: 'icon-shadow-color',
name: 'icon_shadow_color',
type: '(iiid)',
parser: Util.tuple_to_native_color,
handler: (function() {
Theming.remove_icon_shadow();
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('shadow') !== -1 && stylesheet.indexOf('icon') !== -1) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
let icon_shadow = Theming.register_icon_shadow(Settings.get_icon_shadow_color(), Settings.get_icon_shadow_position());
const id = this.icon_shadow_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.icon_shadow_update_id) {
return false;
}
/* Add Icon Shadowing */
if (Settings.add_icon_shadow()) {
if (icon_shadow !== null) {
Theming.add_icon_shadow();
} else {
log('[Dynamic Panel Transparency] Failed to enabled icon shadowing.');
}
}
Intellifade.forceSyncCheck();
return false;
}).bind(this));
}).bind(this)
});
Settings.add({
key: 'text-shadow-color',
name: 'text_shadow_color',
type: '(iiid)',
parser: Util.tuple_to_native_color,
handler: (function() {
Theming.remove_text_shadow();
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
for (let i = Theming.stylesheets.length - 1; i >= 0; i--) {
let stylesheet = Theming.stylesheets[i];
if (stylesheet.indexOf('shadow') !== -1 && stylesheet.indexOf('text') !== -1) {
theme.unload_stylesheet(Util.get_file(stylesheet));
Util.remove_file(stylesheet);
Theming.stylesheets.splice(i, 1);
}
}
let text_shadow = Theming.register_text_shadow(Settings.get_text_shadow_color(), Settings.get_text_shadow_position());
const id = this.text_shadow_update_id = Mainloop.timeout_add(SETTINGS_DELAY, (function() { // eslint-disable-line no-magic-numbers
if (id !== this.text_shadow_update_id) {
return false;
}
/* Add Text Shadowing */
if (Settings.add_text_shadow()) {
if (text_shadow !== null) {
Theming.add_text_shadow();
} else {
log('[Dynamic Panel Transparency] Failed to enabled text shadowing.');
}
}
Intellifade.forceSyncCheck();
return false;
}).bind(this));
}).bind(this)
});
Settings.add({
key: 'text-color',
name: 'text_color',
type: '(iii)',
parser: Util.tuple_to_native_color
});
Settings.add({
key: 'maximized-text-color',
name: 'maximized_text_color',
type: '(iii)',
parser: Util.tuple_to_native_color
});
Settings.add({
key: 'enable-maximized-text-color',
name: 'enable_maximized_text_color',
type: 'b',
handler: (function() {
Intellifade.forceSyncCheck();
}).bind(this)
});
Settings.add({
key: 'remove-panel-styling',
name: 'remove_panel_styling',
getter: 'remove_panel_styling',
type: 'b'
});
Settings.add({
key: 'enable-overview-text-color',
name: 'enable_overview_text_color',
type: 'b'
});
Settings.add({
key: 'enable-text-color',
name: 'enable_text_color',
type: 'b',
handler: (function() {
if (Settings.get_enable_text_color()) {
Intellifade.forceSyncCheck();
} else {
Theming.remove_text_color();
Theming.remove_text_color('maximized');
}
}).bind(this)
});
Settings.add({
key: 'enable-opacity',
name: 'enable_custom_opacity',
getter: 'enable_custom_opacity',
type: 'b'
});
Settings.add({
key: 'enable-background-color',
name: 'enable_custom_background_color',
getter: 'enable_custom_background_color',
type: 'b'
});
Settings.add({
key: 'transition-with-overview',
name: 'transition_with_overview',
getter: 'transition_with_overview',
type: 'b'
});
Settings.add({
key: 'transition-windows-touch',
name: 'transition_windows_touch',
getter: 'transition_when_windows_touch_panel',
type: 'b'
});
/* After we've given Settings the necessary information... let's bind it. */
Settings.bind();
}