* migrate to astal * Reorganize project structure. * progress * Migrate Dashboard and Window Title modules. * Migrate clock and notification bar modules. * Remove unused code * Media menu * Rework network and volume modules * Finish custom modules. * Migrate battery bar module. * Update battery module and organize helpers. * Migrate workspace module. * Wrap up bar modules. * Checkpoint before I inevitbly blow something up. * Updates * Fix event propagation logic. * Type fixes * More type fixes * Fix padding for event boxes. * Migrate volume menu and refactor scroll event handlers. * network module WIP * Migrate network service. * Migrate bluetooth menu * Updates * Migrate notifications * Update scrolling behavior for custom modules. * Improve popup notifications and add timer functionality. * Migration notifications menu header/controls. * Migrate notifications menu and consolidate notifications menu code. * Migrate power menu. * Dashboard progress * Migrate dashboard * Migrate media menu. * Reduce media menu nesting. * Finish updating media menu bindings to navigate active player. * Migrate battery menu * Consolidate code * Migrate calendar menu * Fix workspace logic to update on client add/change/remove and consolidate code. * Migrate osd * Consolidate hyprland service connections. * Implement startup dropdown menu position allocation. * Migrate settings menu (WIP) * Settings dialo menu fixes * Finish Dashboard menu * Type updates * update submoldule for types * update github ci * ci * Submodule update * Ci updates * Remove type checking for now. * ci fix * Fix a bunch of stuff, losing track... need rest. Brb coffee * Validate dropdown menu before render. * Consolidate code and add auto-hide functionality. * Improve auto-hide behavior. * Consolidate audio menu code * Organize bluetooth code * Improve active player logic * Properly dismiss a notification on action button resolution. * Implement CLI command engine and migrate CLI commands. * Handle variable disposal * Bar component fixes and add hyprland startup rules. * Handle potentially null bindings network and bluetooth bindings. * Handle potentially null wired adapter. * Fix GPU stats * Handle poller for GPU * Fix gpu bar logic. * Clean up logic for stat bars. * Handle wifi and wired bar icon bindings. * Fix battery percentages * Fix switch behavior * Wifi staging fixes * Reduce redundant hyprland service calls. * Code cleanup * Document the option code and reduce redundant calls to optimize performance. * Remove outdated comment. * Add JSDocs * Add meson to build hyprpanel * Consistency updates * Organize commands * Fix images not showing up on notifications. * Remove todo * Move hyprpanel configuration to the ~/.config/hyprpanel directory and add utility commands. * Handle SRC directory for the bundled/built hyprpanel. * Add namespaces to all windows * Migrate systray * systray updates * Update meson to include ts, tsx and scss files. * Remove log from meson * Fix file choose path and make it float. * Added a command to check the dependency status * Update dep names. * Get scale directly from env * Add todo
122 lines
3.4 KiB
TypeScript
122 lines
3.4 KiB
TypeScript
import GObject, { GLib, property, register, signal } from 'astal/gobject';
|
|
import { dependencies, sh } from '../lib/utils';
|
|
import options from '../options';
|
|
import { execAsync } from 'astal/process';
|
|
import { monitorFile } from 'astal/file';
|
|
|
|
const WP = `${GLib.get_home_dir()}/.config/background`;
|
|
|
|
@register({ GTypeName: 'Wallpaper' })
|
|
class Wallpaper extends GObject.Object {
|
|
#blockMonitor = false;
|
|
#isRunning = false;
|
|
|
|
#wallpaper(): void {
|
|
if (!dependencies('swww')) return;
|
|
|
|
sh('hyprctl cursorpos')
|
|
.then((pos) => {
|
|
const transitionCmd = [
|
|
'swww',
|
|
'img',
|
|
'--invert-y',
|
|
'--transition-type',
|
|
'grow',
|
|
'--transition-duration',
|
|
'1.5',
|
|
'--transition-fps',
|
|
'30',
|
|
'--transition-pos',
|
|
pos.replace(' ', ''),
|
|
WP,
|
|
].join(' ');
|
|
|
|
sh(transitionCmd)
|
|
.then(() => {
|
|
this.notify('wallpaper');
|
|
this.emit('changed', true);
|
|
})
|
|
.catch((err) => {
|
|
console.error('Error setting wallpaper:', err);
|
|
});
|
|
})
|
|
.catch((err) => {
|
|
console.error('Error getting cursor position:', err);
|
|
});
|
|
}
|
|
|
|
async #setWallpaper(path: string): Promise<void> {
|
|
this.#blockMonitor = true;
|
|
|
|
try {
|
|
await sh(`cp ${path} ${WP}`);
|
|
this.#wallpaper();
|
|
} catch (error) {
|
|
console.error('Error setting wallpaper:', error);
|
|
} finally {
|
|
this.#blockMonitor = false;
|
|
}
|
|
}
|
|
|
|
setWallpaper(path: string): void {
|
|
this.#setWallpaper(path);
|
|
}
|
|
|
|
isRunning(): boolean {
|
|
return this.#isRunning;
|
|
}
|
|
|
|
@property(String)
|
|
declare wallpaper: string;
|
|
|
|
@signal(Boolean)
|
|
declare changed: (event: boolean) => void;
|
|
|
|
constructor() {
|
|
super();
|
|
|
|
this.wallpaper = WP;
|
|
|
|
options.wallpaper.enable.subscribe(() => {
|
|
if (options.wallpaper.enable.get()) {
|
|
this.#isRunning = true;
|
|
execAsync('swww-daemon')
|
|
.then(() => {
|
|
this.#wallpaper();
|
|
})
|
|
.catch((err) => {
|
|
console.error('Failed to start swww-daemon:', err);
|
|
});
|
|
} else {
|
|
this.#isRunning = false;
|
|
|
|
execAsync('pkill swww-daemon')
|
|
.then(() => {
|
|
console.log('swww-daemon stopped.');
|
|
})
|
|
.catch((err) => {
|
|
console.error('Failed to stop swww-daemon:', err);
|
|
});
|
|
}
|
|
});
|
|
|
|
if (dependencies('swww') && options.wallpaper.enable.get()) {
|
|
this.#isRunning = true;
|
|
|
|
monitorFile(WP, () => {
|
|
if (!this.#blockMonitor) this.#wallpaper();
|
|
});
|
|
|
|
execAsync('swww-daemon')
|
|
.then(() => {
|
|
this.#wallpaper();
|
|
})
|
|
.catch((err) => {
|
|
console.error('Failed to start swww-daemon:', err);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
export default new Wallpaper();
|