paint_signals.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. this.buffer.forEach(infos => {
  36. if (infos.actor === actor) {
  37. // remove from buffer
  38. let index = this.buffer.indexOf(infos);
  39. this.buffer.splice(index, 1);
  40. }
  41. });
  42. });
  43. this.buffer.push(infos);
  44. }
  45. disconnect_all_for_actor(actor) {
  46. this.buffer.forEach(infos => {
  47. if (infos.actor === actor) {
  48. this.connections.disconnect_all_for(infos.paint_effect);
  49. infos.actor.remove_effect(infos.paint_effect);
  50. // remove from buffer
  51. let index = this.buffer.indexOf(infos);
  52. this.buffer.splice(index, 1);
  53. }
  54. });
  55. }
  56. disconnect_all() {
  57. this.buffer.forEach(infos => {
  58. this.connections.disconnect_all_for(infos.paint_effect);
  59. infos.actor.remove_effect(infos.paint_effect);
  60. });
  61. this.buffer = [];
  62. }
  63. };
  64. export const EmitPaintSignal = GObject.registerClass({
  65. GTypeName: 'EmitPaintSignal',
  66. Signals: {
  67. 'update-blur': {
  68. param_types: []
  69. },
  70. }
  71. },
  72. class EmitPaintSignal extends Clutter.Effect {
  73. vfunc_paint(node, paint_context, paint_flags) {
  74. this.emit("update-blur");
  75. super.vfunc_paint(node, paint_context, paint_flags);
  76. }
  77. }
  78. );