@glassnote/client 2.4.12 → 2.4.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/main.js +38 -0
  2. package/package.json +2 -2
package/main.js CHANGED
@@ -561,6 +561,7 @@ app.whenReady().then(() => {
561
561
  correccionesDeGeometria = 0;
562
562
  fijarGeometria();
563
563
  }
564
+ reafirmarAlwaysOnTop();
564
565
  aplicarPassthrough({ forzar: true });
565
566
  });
566
567
 
@@ -749,6 +750,10 @@ function lockChecker() {
749
750
  const SONDEO_CURSOR_MS = 30;
750
751
  // Cada cuanto se repite la posicion aunque el cursor no se haya movido.
751
752
  const REEMISION_QUIETO_MS = 400;
753
+ // Cada cuanto se repone el alwaysOnTop mientras la ventana esta a la vista. Es un
754
+ // SetWindowPos cada tanto: barato al lado de un glass que se queda debajo de todo.
755
+ const REAFIRMAR_ALWAYS_ON_TOP_MS = 4000;
756
+ let ultimaReafirmacion = 0;
752
757
 
753
758
  // El passthrough efectivo sale de dos cosas: lo que pidio el renderer y si el cursor esta
754
759
  // siquiera sobre la ventana.
@@ -770,6 +775,31 @@ const REEMISION_QUIETO_MS = 400;
770
775
  // main, sin tocar lo que el renderer cree: cuando el cursor vuelve a entrar se reaplica
771
776
  // su decision tal cual, y desde ahi los eventos reales —que si llegan con la ventana
772
777
  // clickeable— lo ponen al dia.
778
+ // El "siempre encima" hay que REPONERLO, no basta con pedirlo una vez al arrancar.
779
+ //
780
+ // Electron guarda el nivel de z-order como un estado suyo y solo baja a la API del sistema
781
+ // cuando ESE estado cambia. Si Windows le saca el TOPMOST a la ventana por su cuenta, para
782
+ // Electron la ventana sigue arriba —isAlwaysOnTop() devuelve true— y no lo vuelve a pedir
783
+ // nunca. Medido en una VM de Windows 11: quitandole el TOPMOST a mano con SetWindowPos, la
784
+ // ventana se queda abajo indefinidamente (14 s de muestreo, sin recuperarse una sola vez).
785
+ // De ahi el false y despues el true: pedir true sobre true no reemite nada.
786
+ //
787
+ // Se repone en dos momentos, y hacen falta los dos:
788
+ // - en el evento `show`, que es cada glass que llega;
789
+ // - cada REAFIRMAR_ALWAYS_ON_TOP_MS mientras la ventana este visible, porque un mensaje
790
+ // largo se queda puesto horas y ahi no hay ningun show que lo repare. Quien le quita
791
+ // el TOPMOST no se pudo reproducir —ni con alt+tab, ni con una app a pantalla completa,
792
+ // ni con el ciclo ocultar/mostrar— asi que esto no depende de saber quien es.
793
+ //
794
+ // En Linux no se toca: ahi el "arriba de todo" es _NET_WM_STATE_ABOVE y quitarlo y ponerlo
795
+ // invita al gestor de ventanas a recolocar la ventana, que es justo lo que costo domar.
796
+ function reafirmarAlwaysOnTop() {
797
+ if (!mainWindow || mainWindow.isDestroyed()) return;
798
+ if (process.platform === 'linux') return;
799
+ mainWindow.setAlwaysOnTop(false);
800
+ mainWindow.setAlwaysOnTop(true, 'screen-saver');
801
+ }
802
+
773
803
  function aplicarPassthrough({ forzar = false } = {}) {
774
804
  if (!mainWindow || mainWindow.isDestroyed()) return;
775
805
  const ignorar = passthroughPedidoPorRenderer || cursorFueraDeLaVentana;
@@ -789,6 +819,14 @@ function iniciarSondeoCursor() {
789
819
  sondeoCursor = setInterval(() => {
790
820
  if (!mainWindow || mainWindow.isDestroyed() || !mainWindow.isVisible()) return;
791
821
 
822
+ // Este tick ya corre solo con la ventana a la vista, que es justo cuando importa
823
+ // que este arriba: es el lugar natural para reponer el alwaysOnTop.
824
+ const ahoraMs = Date.now();
825
+ if (ahoraMs - ultimaReafirmacion >= REAFIRMAR_ALWAYS_ON_TOP_MS) {
826
+ ultimaReafirmacion = ahoraMs;
827
+ reafirmarAlwaysOnTop();
828
+ }
829
+
792
830
  // En X11 screen.getCursorScreenPoint() no sirve: con la ventana ignorando el mouse
793
831
  // Chromium se queda sin eventos y devuelve congelada la ultima posicion que vio
794
832
  // (el porque, medido, esta en linuxCursor.js). Se le pregunta al servidor X. En
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassnote/client",
3
- "version": "2.4.12",
3
+ "version": "2.4.14",
4
4
  "description": "GlassNote — cliente de escritorio de notas superpuestas. Se instala con npx, sin instaladores nativos ni firmas.",
5
5
  "main": "main.js",
6
6
  "publishConfig": {
@@ -74,7 +74,7 @@
74
74
  "url": "git+ssh://git@intermarkec/intermarkec/glassnote-electron.git"
75
75
  },
76
76
  "dependencies": {
77
- "@glassnote/renderer": "2.0.11",
77
+ "@glassnote/renderer": "2.0.12",
78
78
  "cors": "^2.8.5",
79
79
  "electron": "^29.4.6",
80
80
  "express": "^4.18.2",