275 lines
7.5 KiB
JavaScript
275 lines
7.5 KiB
JavaScript
/* exported init, cleanup, lock, unlock, get_animation_status, get_transparency_status, minimum_fade_in, update_transition_type */
|
|
/* exported fade_in, fade_out, blank_fade_out */
|
|
|
|
const Mainloop = imports.mainloop;
|
|
|
|
const St = imports.gi.St;
|
|
|
|
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
|
|
|
const Settings = Me.imports.settings;
|
|
const Theming = Me.imports.theming;
|
|
|
|
const Equations = imports.tweener.equations;
|
|
|
|
const CORNER_UPDATE_FREQUENCY = 30;
|
|
|
|
class TransparencyStatus {
|
|
constructor() {
|
|
this.transparent = false;
|
|
this.blank = false;
|
|
}
|
|
|
|
is_transparent() {
|
|
return this.transparent;
|
|
}
|
|
|
|
is_blank() {
|
|
return this.blank;
|
|
}
|
|
|
|
set_transparent(transparent) {
|
|
this.transparent = transparent;
|
|
}
|
|
|
|
set_blank(blank) {
|
|
this.blank = blank;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Intialize.
|
|
*
|
|
*/
|
|
function init() {
|
|
/* Objects to track where the transparency is and where it's going. */
|
|
this.status = new TransparencyStatus();
|
|
|
|
this.corner_timeout_id = 0;
|
|
}
|
|
|
|
/**
|
|
* Freeup any held assets on disable.
|
|
*
|
|
*/
|
|
function cleanup() {
|
|
this.status = null;
|
|
|
|
this.corner_timeout_id = null;
|
|
}
|
|
|
|
/**
|
|
* Get the current status of the panel's transparency.
|
|
*
|
|
* @returns {Object} Current transparency. @see TransparencyStatus
|
|
*/
|
|
function get_transparency_status() {
|
|
return this.status;
|
|
}
|
|
|
|
/**
|
|
* Get any animation that the panel is currently doing.
|
|
* DEPRECATED.
|
|
*
|
|
* @returns {Object} Current animation status. @see AnimationStatus
|
|
*/
|
|
function get_animation_status() {
|
|
return { destination: null, action: null };
|
|
}
|
|
|
|
/**
|
|
* Fades the panel into the unmaximized (minimum) alpha. Used for closing the overview.
|
|
*
|
|
*/
|
|
function minimum_fade_in() {
|
|
/* The CSS backend doesn't need different starting/ending values */
|
|
fade_out();
|
|
}
|
|
|
|
/**
|
|
* Fades the panel into the nmaximized (maximum) alpha.
|
|
*
|
|
*/
|
|
function fade_in() {
|
|
if (!Settings.remove_panel_styling()) {
|
|
Theming.reapply_panel_styling();
|
|
Theming.reapply_panel_background_image();
|
|
}
|
|
|
|
Theming.remove_panel_transparency();
|
|
|
|
if (Settings.enable_custom_background_color()) {
|
|
Theming.set_maximized_background_color('custom');
|
|
|
|
Theming.remove_unmaximized_background_color();
|
|
Theming.remove_unmaximized_background_color('custom');
|
|
} else {
|
|
Theming.set_maximized_background_color();
|
|
|
|
Theming.remove_unmaximized_background_color();
|
|
Theming.remove_unmaximized_background_color('custom');
|
|
}
|
|
|
|
if (!Settings.get_hide_corners()) {
|
|
let speed = St.Settings.get().slow_down_factor * Settings.get_transition_speed();
|
|
|
|
let maximized = Settings.get_maximized_opacity();
|
|
let unmaximized = !this.status.is_transparent() ? maximized : Settings.get_unmaximized_opacity();
|
|
|
|
this.status.set_transparent(false);
|
|
this.status.set_blank(false);
|
|
|
|
let count = 0;
|
|
|
|
const id = this.corner_timeout_id = Mainloop.timeout_add(Math.floor(speed / CORNER_UPDATE_FREQUENCY), (function() {
|
|
if (id === this.corner_timeout_id && !this.status.is_transparent()) {
|
|
count++;
|
|
|
|
let alpha = Equations.linear(Math.floor(count * (speed / CORNER_UPDATE_FREQUENCY)), unmaximized, maximized - unmaximized, speed);
|
|
|
|
update_corner_alpha(alpha);
|
|
|
|
if (count > CORNER_UPDATE_FREQUENCY) {
|
|
update_corner_alpha(maximized);
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}).bind(this));
|
|
} else {
|
|
update_corner_alpha();
|
|
}
|
|
|
|
this.status.set_transparent(false);
|
|
this.status.set_blank(false);
|
|
}
|
|
|
|
/**
|
|
* Fades the panel into the unmaximized (minimum) alpha.
|
|
*
|
|
*/
|
|
function fade_out() {
|
|
Theming.strip_panel_background_image();
|
|
Theming.strip_panel_styling();
|
|
|
|
if (Settings.enable_custom_background_color()) {
|
|
Theming.set_unmaximized_background_color('custom');
|
|
|
|
Theming.remove_maximized_background_color();
|
|
Theming.remove_maximized_background_color('custom');
|
|
} else {
|
|
Theming.set_unmaximized_background_color();
|
|
|
|
Theming.remove_maximized_background_color();
|
|
Theming.remove_maximized_background_color('custom');
|
|
}
|
|
|
|
Theming.remove_panel_transparency();
|
|
|
|
// TODO: Figure out how to write the panel corners in pure CSS.
|
|
if (!Settings.get_hide_corners()) {
|
|
let speed = St.Settings.get().slow_down_factor * Settings.get_transition_speed();
|
|
|
|
let unmaximized = Settings.get_unmaximized_opacity();
|
|
let maximized = this.status.is_transparent() ? unmaximized : Settings.get_maximized_opacity();
|
|
|
|
/* Keep the status up to date */
|
|
this.status.set_transparent(true);
|
|
this.status.set_blank(false);
|
|
|
|
let count = 0;
|
|
|
|
const id = this.corner_timeout_id = Mainloop.timeout_add(Math.floor(speed / CORNER_UPDATE_FREQUENCY), (function() {
|
|
if (id === this.corner_timeout_id && this.status.is_transparent()) {
|
|
count++;
|
|
|
|
let alpha = Equations.linear(Math.floor(count * (speed / CORNER_UPDATE_FREQUENCY)), maximized, unmaximized - maximized, speed);
|
|
|
|
update_corner_alpha(alpha);
|
|
|
|
if (count > CORNER_UPDATE_FREQUENCY) {
|
|
update_corner_alpha(unmaximized);
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}).bind(this));
|
|
} else {
|
|
update_corner_alpha();
|
|
}
|
|
|
|
/* Keep the status up to date */
|
|
this.status.set_transparent(true);
|
|
this.status.set_blank(false);
|
|
}
|
|
|
|
/**
|
|
* Fades the panel's alpha to 0. Used for opening the overview & displaying the screenShield.
|
|
*
|
|
*/
|
|
function blank_fade_out() {
|
|
this.status.set_transparent(true);
|
|
this.status.set_blank(true);
|
|
|
|
/* Completely remove every possible background style... */
|
|
Theming.remove_background_color();
|
|
|
|
Theming.strip_panel_background_image();
|
|
Theming.strip_panel_styling();
|
|
|
|
Theming.apply_panel_transparency();
|
|
|
|
// TODO: These corners...
|
|
if (!Settings.get_hide_corners()) {
|
|
let speed = St.Settings.get().slow_down_factor * Settings.get_transition_speed();
|
|
|
|
let maximized = Settings.get_maximized_opacity();
|
|
|
|
let count = 0;
|
|
|
|
const id = this.corner_timeout_id = Mainloop.timeout_add(Math.floor(speed / CORNER_UPDATE_FREQUENCY), (function() {
|
|
if (id === this.corner_timeout_id && this.status.is_transparent()) {
|
|
count++;
|
|
|
|
let alpha = Equations.linear(Math.floor(count * (speed / CORNER_UPDATE_FREQUENCY)), maximized, -maximized, speed);
|
|
|
|
update_corner_alpha(alpha);
|
|
|
|
if (count > CORNER_UPDATE_FREQUENCY) {
|
|
update_corner_alpha(0);
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}).bind(this));
|
|
} else {
|
|
update_corner_alpha();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Updates the alpha value of the corners' coloring. Slightly awkward overlap is unavoidable.
|
|
*
|
|
* @param {Number} alpha - Alpha value ranging from 0-255.
|
|
*/
|
|
function update_corner_alpha(alpha = null) {
|
|
if (alpha === null) {
|
|
if (Settings.get_hide_corners()) {
|
|
alpha = 0;
|
|
} else {
|
|
alpha = this.status.is_transparent() ? Theming.get_unmaximized_opacity() : Theming.get_maximized_opacity();
|
|
}
|
|
}
|
|
|
|
Theming.set_corner_color({
|
|
alpha: alpha
|
|
});
|
|
}
|