155 lines
6.4 KiB
JavaScript
155 lines
6.4 KiB
JavaScript
|
const { Gio, GLib } = imports.gi;
|
||
|
import App from 'resource:///com/github/Aylur/ags/app.js';
|
||
|
import * as Utils from 'resource:///com/github/Aylur/ags/utils.js';
|
||
|
const { execAsync, exec } = Utils;
|
||
|
// import Todo from "../../services/todo.js";
|
||
|
import { darkMode } from '../.miscutils/system.js';
|
||
|
|
||
|
export function hasUnterminatedBackslash(inputString) {
|
||
|
// Use a regular expression to match a trailing odd number of backslashes
|
||
|
const regex = /\\+$/;
|
||
|
return regex.test(inputString);
|
||
|
}
|
||
|
|
||
|
export function launchCustomCommand(command) {
|
||
|
const args = command.toLowerCase().split(' ');
|
||
|
if (args[0] == '>raw') { // Mouse raw input
|
||
|
Utils.execAsync('hyprctl -j getoption input:accel_profile')
|
||
|
.then((output) => {
|
||
|
const value = JSON.parse(output)["str"].trim();
|
||
|
if (value != "[[EMPTY]]" && value != "") {
|
||
|
execAsync(['bash', '-c', `hyprctl keyword input:accel_profile '[[EMPTY]]'`]).catch(print);
|
||
|
}
|
||
|
else {
|
||
|
execAsync(['bash', '-c', `hyprctl keyword input:accel_profile flat`]).catch(print);
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
else if (args[0] == '>img') { // Change wallpaper
|
||
|
execAsync([`bash`, `-c`, `${App.configDir}/scripts/color_generation/switchwall.sh`, `&`]).catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>color') { // Generate colorscheme from color picker
|
||
|
execAsync([`bash`, `-c`, `${App.configDir}/scripts/color_generation/switchcolor.sh --pick`, `&`]).catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>light') { // Light mode
|
||
|
darkMode.value = false;
|
||
|
execAsync([`bash`, `-c`, `mkdir -p ${GLib.get_user_cache_dir()}/ags/user && sed -i "1s/.*/light/" ${GLib.get_user_cache_dir()}/ags/user/colormode.txt`])
|
||
|
.then(execAsync(['bash', '-c', `${App.configDir}/scripts/color_generation/switchcolor.sh`]))
|
||
|
.catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>dark') { // Dark mode
|
||
|
darkMode.value = true;
|
||
|
execAsync([`bash`, `-c`, `mkdir -p ${GLib.get_user_cache_dir()}/ags/user && sed -i "1s/.*/dark/" ${GLib.get_user_cache_dir()}/ags/user/colormode.txt`])
|
||
|
.then(execAsync(['bash', '-c', `${App.configDir}/scripts/color_generation/switchcolor.sh`]))
|
||
|
.catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>badapple') { // Black and white
|
||
|
execAsync([`bash`, `-c`, `mkdir -p ${GLib.get_user_cache_dir()}/ags/user && sed -i "3s/.*/monochrome/" ${GLib.get_user_cache_dir()}/ags/user/colormode.txt`])
|
||
|
.then(execAsync(['bash', '-c', `${App.configDir}/scripts/color_generation/switchcolor.sh`]))
|
||
|
.catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>material') { // Use material colors
|
||
|
execAsync([`bash`, `-c`, `mkdir -p ${GLib.get_user_cache_dir()}/ags/user && echo "material" > ${GLib.get_user_cache_dir()}/ags/user/colorbackend.txt`]).catch(print)
|
||
|
.then(execAsync(['bash', '-c', `${App.configDir}/scripts/color_generation/switchwall.sh --noswitch`]).catch(print))
|
||
|
.catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>pywal') { // Use Pywal (ik it looks shit but I'm not removing)
|
||
|
execAsync([`bash`, `-c`, `mkdir -p ${GLib.get_user_cache_dir()}/ags/user && echo "pywal" > ${GLib.get_user_cache_dir()}/ags/user/colorbackend.txt`]).catch(print)
|
||
|
.then(execAsync(['bash', '-c', `${App.configDir}/scripts/color_generation/switchwall.sh --noswitch`]).catch(print))
|
||
|
.catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>todo') { // Todo
|
||
|
Todo.add(args.slice(1).join(' '));
|
||
|
}
|
||
|
else if (args[0] == '>shutdown') { // Shut down
|
||
|
execAsync([`bash`, `-c`, `systemctl poweroff || loginctl poweroff`]).catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>reboot') { // Reboot
|
||
|
execAsync([`bash`, `-c`, `systemctl reboot || loginctl reboot`]).catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>sleep') { // Sleep
|
||
|
execAsync([`bash`, `-c`, `systemctl suspend || loginctl suspend`]).catch(print);
|
||
|
}
|
||
|
else if (args[0] == '>logout') { // Log out
|
||
|
execAsync([`bash`, `-c`, `pkill Hyprland || pkill sway`]).catch(print);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export function execAndClose(command, terminal) {
|
||
|
App.closeWindow('overview');
|
||
|
if (terminal) {
|
||
|
execAsync([`bash`, `-c`, `${userOptions.apps.terminal} fish -C "${command}"`, `&`]).catch(print);
|
||
|
}
|
||
|
else
|
||
|
execAsync(command).catch(print);
|
||
|
}
|
||
|
|
||
|
export function couldBeMath(str) {
|
||
|
const regex = /^[0-9.+*/-]/;
|
||
|
return regex.test(str);
|
||
|
}
|
||
|
|
||
|
export function expandTilde(path) {
|
||
|
if (path.startsWith('~')) {
|
||
|
return GLib.get_home_dir() + path.slice(1);
|
||
|
} else {
|
||
|
return path;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getFileIcon(fileInfo) {
|
||
|
let icon = fileInfo.get_icon();
|
||
|
if (icon) {
|
||
|
// Get the icon's name
|
||
|
return icon.get_names()[0];
|
||
|
} else {
|
||
|
// Default icon for files
|
||
|
return 'text-x-generic';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export function ls({ path = '~', silent = false }) {
|
||
|
let contents = [];
|
||
|
try {
|
||
|
let expandedPath = expandTilde(path);
|
||
|
if (expandedPath.endsWith('/'))
|
||
|
expandedPath = expandedPath.slice(0, -1);
|
||
|
let folder = Gio.File.new_for_path(expandedPath);
|
||
|
|
||
|
let enumerator = folder.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
|
||
|
let fileInfo;
|
||
|
while ((fileInfo = enumerator.next_file(null)) !== null) {
|
||
|
let fileName = fileInfo.get_display_name();
|
||
|
let fileType = fileInfo.get_file_type();
|
||
|
|
||
|
let item = {
|
||
|
parentPath: expandedPath,
|
||
|
name: fileName,
|
||
|
type: fileType === Gio.FileType.DIRECTORY ? 'folder' : 'file',
|
||
|
icon: getFileIcon(fileInfo),
|
||
|
};
|
||
|
|
||
|
// Add file extension for files
|
||
|
if (fileType === Gio.FileType.REGULAR) {
|
||
|
let fileExtension = fileName.split('.').pop();
|
||
|
item.type = `${fileExtension}`;
|
||
|
}
|
||
|
|
||
|
contents.push(item);
|
||
|
contents.sort((a, b) => {
|
||
|
const aIsFolder = a.type.startsWith('folder');
|
||
|
const bIsFolder = b.type.startsWith('folder');
|
||
|
if (aIsFolder && !bIsFolder) {
|
||
|
return -1;
|
||
|
} else if (!aIsFolder && bIsFolder) {
|
||
|
return 1;
|
||
|
} else {
|
||
|
return a.name.localeCompare(b.name); // Sort alphabetically within folders and files
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
} catch (e) {
|
||
|
if (!silent) console.log(e);
|
||
|
}
|
||
|
return contents;
|
||
|
}
|