/* 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(); }