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

240 lines
6.1 KiB
JavaScript

/* exported get_shell_version, is_undef, clamp, is_valid, match_colors, remove_file, get_file, write_to_file, gdk_to_css_color, clutter_to_native_color, tuple_to_native_color, deep_freeze, strip_args */
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
/* This import can't be a constant as it requires lazy initialization. */
let Meta = null;
/* Gnome Versioning */
const MAJOR_VERSION = parseInt(imports.misc.config.PACKAGE_VERSION.split('.')[0], 10);
const MINOR_VERSION = parseInt(imports.misc.config.PACKAGE_VERSION.split('.')[1], 10);
/* Permission setting for created files. */
const PERMISSIONS_MODE = parseInt('0744', 8);
/* Utility Variable Access */
/**
* Returns the current shell version.
*
* @returns {Object} The current shell version.
*
*/
function get_shell_version() {
return { major: MAJOR_VERSION, minor: MINOR_VERSION };
}
/* Utility Functions */
/**
* Evaluates parameter 'value' and returns either 'value' or 'min'/'max' if 'value' is outside of the range.
*
* @param {Number} value - Test value.
* @param {Number} min - Minimum value.
* @param {Number} max - Maximum value.
*
* @returns {Number} 'value' or the minimum or maximum.
*
*/
function clamp(value, min, max) {
return Math.min(Math.max(value, min), max);
}
/**
* Determines if 'window' is a valid window to watch.
* Will not work outside the extension code.
*
* @param {Object} window - Window to check.
*
* @returns {Boolean} Whether 'window' is a valid window to watch.
*
*/
function is_valid(window) {
if (!Meta) {
Meta = imports.gi.Meta;
}
let windowTypes = [
Meta.WindowType.NORMAL,
Meta.WindowType.DIALOG,
Meta.WindowType.MODAL_DIALOG,
Meta.WindowType.TOOLBAR,
Meta.WindowType.MENU,
Meta.WindowType.UTILITY,
];
let type = window.get_window_type();
return (windowTypes.indexOf(type) !== -1);
}
/**
* Retrieves the GFile for a file path.
*
* @param {string} file_path - Path for a file.
*
* @returns {Object} GFile for the path or null if the path is not valid.
*
*/
function get_file(file_path) {
try {
return Gio.file_new_for_path(file_path);
} catch (error) {
log('[Dynamic Panel Transparency] Error getting file: ' + error);
}
return null;
}
/**
* Write the given string to a file path; creating the necessary files and directories.
*
* @param {string} file_path - Path for a file.
* @param {string} text - Text to write to the file.
*
* @returns {Boolean} Whether the file write was a success.
*
*/
function write_to_file(file_path, text) {
try {
let file = get_file(file_path);
let parent = file.get_parent();
if (GLib.mkdir_with_parents(parent.get_path(), PERMISSIONS_MODE) === 0) {
let success = file.replace_contents(text, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null);
return success[0];
}
} catch (error) {
log('[Dynamic Panel Transparency] Error writing to file: ' + file_path);
log(error);
}
return false;
}
/**
* Deletes the given file_path.
*
* @param {string} file_path - Path for a file.
*
* @returns {Boolean} Whether the file deletion was a success.
*
*/
function remove_file(file_path) {
try {
let file = get_file(file_path);
let result = file.delete(null);
return result;
} catch (error) {
log('[Dynamic Panel Transparency] Error removing file: ' + file_path);
log(error);
}
return false;
}
/**
* Converts a GdkColor into a JS/CSS color object.
*
* @param {Object} color - GdkColor to convert.
*
* @returns {Object} Converted RGB color.
*
*/
function gdk_to_css_color(color) {
let red = Math.round(clamp((color.red * 255), 0, 255));
let green = Math.round(clamp((color.green * 255), 0, 255));
let blue = Math.round(clamp((color.blue * 255), 0, 255));
return { 'red': red, 'green': green, 'blue': blue };
}
/**
* Converts a ClutterColor into a JS/CSS color object.
*
* @param {Object} color - ClutterColor to convert.
* @param {Boolean} [alpha = false] - Whether to transfer the alpha value.
*
* @returns {Object} Converted RGB(A) color.
*
*/
function clutter_to_native_color(color, alpha = false) {
let output = { red: color.red, green: color.green, blue: color.blue };
if (alpha) {
output.alpha = color.alpha;
}
return output;
}
/**
* Converts a tuple from a GVariant (typically) into a JS/CSS color object.
*
* @param {Object} color - Tuple to convert.
* @param {Boolean} [alpha = false] - Whether to transfer the alpha value.
*
* @returns {Object} Converted RGB(A) color.
*
*/
function tuple_to_native_color(tuple) {
let color = { red: tuple[0], green: tuple[1], blue: tuple[2] };
if (tuple.length === 4) {
color.alpha = tuple[3];
}
return color;
}
/**
* Compares two colors for equivalency.
*
* @param {Object} a - First color.
* @param {Object} a - Second color.
* @param {Boolean} [alpha = false] - Whether to check the alpha value.
*
* @returns {Boolean} Whether the two colors are equal.
*
*/
function match_colors(a, b, alpha = false) {
let result = (a.red === b.red);
result = result && (a.green === b.green);
result = result && (a.blue === b.blue);
if (alpha) {
result = result && (a.alpha === b.alpha);
}
return result;
}
/**
* Freezes an Object's and its children.
*
* @param {Object} type - Object to freeze.
* @param {Boolean} [recursive = false] - Whether to recursively traverse the object's children.
*
*/
function deep_freeze(type, recursive = false) {
const freeze_children = function(obj) {
Object.keys(obj).forEach(function(value, index, arr) {
if (typeof (value) === 'object' && !Object.isFrozen(value)) {
Object.freeze(value);
if (recursive) {
freeze_children(value);
}
}
});
};
Object.freeze(type);
freeze_children(type);
}
/**
* Prevents any arguments from passing on.
*
* @param {Object} method - Method to call.
*
*/
function strip_args(method) {
return function() {
method.call(this);
};
}