screenshot.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import * as Main from 'resource:///org/gnome/shell/ui/main.js';
  2. import { Pipeline } from '../conveniences/pipeline.js';
  3. export const ScreenshotBlur = class ScreenshotBlur {
  4. constructor(connections, settings, effects_manager) {
  5. this.connections = connections;
  6. this.settings = settings;
  7. this.screenshot_background_managers = [];
  8. this.effects_manager = effects_manager;
  9. }
  10. enable() {
  11. this._log("blurring screenshot's window selector");
  12. // connect to monitors change
  13. this.connections.connect(Main.layoutManager, 'monitors-changed',
  14. _ => this.update_backgrounds()
  15. );
  16. // update backgrounds when the component is enabled
  17. this.update_backgrounds();
  18. }
  19. update_backgrounds() {
  20. // remove every old background
  21. this.remove_background_actors();
  22. // create new backgrounds for the screenshot window selector
  23. for (let i = 0; i < Main.screenshotUI._windowSelectors.length; i++) {
  24. const window_selector = Main.screenshotUI._windowSelectors[i];
  25. const pipeline = new Pipeline(
  26. this.effects_manager,
  27. global.blur_my_shell._pipelines_manager,
  28. this.settings.screenshot.PIPELINE
  29. );
  30. pipeline.create_background_with_effects(
  31. window_selector._monitorIndex, this.screenshot_background_managers,
  32. window_selector, 'bms-screenshot-blurred-widget', false
  33. );
  34. // prevent old `BackgroundActor` from being accessed, which creates a whole bug of logs
  35. this.connections.connect(window_selector.get_parent(), 'destroy', _ => {
  36. this.screenshot_background_managers.forEach(background_manager => {
  37. if (background_manager.backgroundActor) {
  38. let widget = background_manager.backgroundActor.get_parent();
  39. let parent = widget?.get_parent();
  40. if (parent == window_selector) {
  41. background_manager._bms_pipeline.destroy();
  42. parent.remove_child(widget);
  43. }
  44. }
  45. background_manager.destroy();
  46. });
  47. window_selector.get_children().forEach(child => {
  48. if (child.get_name() == 'bms-screenshot-blurred-widget')
  49. window_selector.remove_child(child);
  50. });
  51. let index = this.screenshot_background_managers.indexOf(window_selector);
  52. this.screenshot_background_managers.splice(index, 1);
  53. });
  54. }
  55. }
  56. update_pipeline() {
  57. this.screenshot_background_managers.forEach(background_manager =>
  58. background_manager._bms_pipeline.change_pipeline_to(
  59. this.settings.screenshot.PIPELINE
  60. )
  61. );
  62. }
  63. remove_background_actors() {
  64. this.screenshot_background_managers.forEach(background_manager => {
  65. background_manager._bms_pipeline.destroy();
  66. if (background_manager.backgroundActor) {
  67. let widget = background_manager.backgroundActor.get_parent();
  68. widget?.get_parent()?.remove_child(widget);
  69. }
  70. background_manager.destroy();
  71. });
  72. Main.screenshotUI._windowSelectors.forEach(window_selector =>
  73. window_selector.get_children().forEach(child => {
  74. if (child.get_name() == 'bms-screenshot-blurred-widget')
  75. window_selector.remove_child(child);
  76. })
  77. );
  78. this.screenshot_background_managers = [];
  79. }
  80. disable() {
  81. this._log("removing blur from screenshot's window selector");
  82. this.remove_background_actors();
  83. this.connections.disconnect_all();
  84. }
  85. _log(str) {
  86. if (this.settings.DEBUG)
  87. console.log(`[Blur my Shell > screenshot] ${str}`);
  88. }
  89. _warn(str) {
  90. console.warn(`[Blur my Shell > screenshot] ${str}`);
  91. }
  92. };