paint_signals.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import GObject from 'gi://GObject';
  2. import Clutter from 'gi://Clutter';
  3. export const PaintSignals = class PaintSignals {
  4. constructor(connections) {
  5. this.buffer = [];
  6. this.connections = connections;
  7. }
  8. connect(actor, blur_effect) {
  9. let paint_effect = new EmitPaintSignal();
  10. let infos = {
  11. actor: actor,
  12. paint_effect: paint_effect
  13. };
  14. let counter = 0;
  15. actor.add_effect(paint_effect);
  16. this.connections.connect(paint_effect, 'update-blur', () => {
  17. try {
  18. // checking if blur_effect.queue_repaint() has been recently called
  19. if (counter === 0) {
  20. counter = 2;
  21. blur_effect.queue_repaint();
  22. }
  23. else counter--;
  24. } catch (e) { }
  25. });
  26. // remove the actor from buffer when it is destroyed
  27. if (
  28. actor.connect &&
  29. (
  30. !(actor instanceof GObject.Object) ||
  31. GObject.signal_lookup('destroy', actor)
  32. )
  33. )
  34. this.connections.connect(actor, 'destroy', () => {
  35. const immutable_buffer = [...this.buffer];
  36. immutable_buffer.forEach(infos => {
  37. if (infos.actor === actor) {
  38. // remove from buffer
  39. let index = this.buffer.indexOf(infos);
  40. this.buffer.splice(index, 1);
  41. }
  42. });
  43. });
  44. this.buffer.push(infos);
  45. }
  46. disconnect_all_for_actor(actor) {
  47. const immutable_buffer = [...this.buffer];
  48. immutable_buffer.forEach(infos => {
  49. if (infos.actor === actor) {
  50. this.connections.disconnect_all_for(infos.paint_effect);
  51. infos.actor.remove_effect(infos.paint_effect);
  52. // remove from buffer
  53. let index = this.buffer.indexOf(infos);
  54. this.buffer.splice(index, 1);
  55. }
  56. });
  57. }
  58. disconnect_all() {
  59. this.buffer.forEach(infos => {
  60. this.connections.disconnect_all_for(infos.paint_effect);
  61. infos.actor.remove_effect(infos.paint_effect);
  62. });
  63. this.buffer = [];
  64. }
  65. };
  66. export const EmitPaintSignal = GObject.registerClass({
  67. GTypeName: 'EmitPaintSignal',
  68. Signals: {
  69. 'update-blur': {
  70. param_types: []
  71. },
  72. }
  73. },
  74. class EmitPaintSignal extends Clutter.Effect {
  75. vfunc_paint(node, paint_context, paint_flags) {
  76. this.emit("update-blur");
  77. super.vfunc_paint(node, paint_context, paint_flags);
  78. }
  79. }
  80. );