Me gustaría poder generar una lista, y con suerte acceder una por una, de todas las ventanas abiertas de cualquier aplicación específica sin importar en qué escritorio se encuentren, junto con el espacio de trabajo del escritorio (espacio de control de la misión) en el que se encuentra cada una.
En general, AppleScript y otras herramientas de Apple parecen ser capaces de listar sólo aquellas que son visibles en el Espacio de Trabajo del Escritorio activo (lo que parece bastante tonto y como si Apple internamente no supiera realmente cómo utilizar la función de Mission Control).
Muchas aplicaciones tienen un menú de Windows que enumera todas las ventanas abiertas de esa aplicación, pero eso parece que tendría que tener macros específicas para gestionar las listas de cada aplicación diferente. Eso no es lo ideal. Y no es completo, porque esas listas dentro de la aplicación simplemente enumeran el título de la ventana, el nombre del archivo o lo que sea y no el espacio de trabajo del escritorio.
En concreto, para empezar, quiero listar todas las ventanas abiertas de TextEdit y todas las ventanas abiertas de Typora. Tienen UIs muy diferentes para mostrar esa lista ellos mismos.
Eventualmente, me gustaría tener una pequeña ventana de aplicación en la esquina de cada espacio de trabajo de escritorio que muestre un nombre u otra identificación para ese espacio de escritorio. Entonces podría cambiar a un escritorio diferente activando esa ventana de aplicación y poniéndola en segundo plano.
Lo más significativo es que esto me permitiría cambiar a la el mismo escritorio de trabajo incluso si he reordenado el orden de los escritorios en Mission Control (porque la ventana de destino se movería con todo el escritorio). Normalmente, Mission Control cambia la numeración de los escritorios y las teclas de acceso rápido asignadas apuntan al escritorio que se encuentre en esa posición numérica. En mi opinión, este es uno de los principales defectos de Mission Control que ha impedido que la gente lo utilice ampliamente.
Hasta ahora he encontrado el método/función JSX de Apple $.CGWindowListCopyWindowInfo(16, 0)
El primer argumento establece algunos filtros en los datos devueltos. Aquí 16
es el valor de la constante $.kCGWindowListExcludeDesktopElements
que excluye los iconos del escritorio, el propio escritorio y algunas otras "ventanas" que no se pueden ver. El segundo argumento es un ID de ventana para poder seleccionar las ventanas que están delante o detrás de esa ventana específica, así 0
muestra todas las ventanas.
Este método suele arrojar cientos de elementos que necesitan ser filtrados y masajeados. Esta es una entrada formateada por js-beautify:
$({
"kCGWindowLayer": $(0),
"kCGWindowAlpha": $(1),
"kCGWindowMemoryUsage": $(1248),
"kCGWindowSharingState": $(1),
"kCGWindowOwnerPID": $(1410),
"kCGWindowNumber": $(322),
"kCGWindowOwnerName": $("TextEdit"),
"kCGWindowStoreType": $(1),
"kCGWindowBounds": $({
"X": $(0),
"Height": $(679),
"Y": $(23),
"Width": $(385)
}),
"kCGWindowName": $("Which Apps Have I Used.rtf")
}),
En este ejemplo, el kCGWindowBounds
colóquelo en el margen izquierdo de la pantalla, en la parte superior (inmediatamente debajo de la barra de herramientas), un poco más alto que ancho. Bien. Pero no me dice que en Mission Control está en Desktop 16
.
Si tuviera varias pantallas, podría averiguar en qué pantalla estaba porque esos valores tratan todas las pantallas diferentes como un único escritorio. Un X
de más de 1440 (el ancho de la pantalla de mi portátil) lo pondría en el monitor a la derecha de mi portátil, si éste estuviera más a la izquierda.
Pero, ¿CÓMO puedo determinar en qué espacio de trabajo del escritorio de Mission Control se encuentra esa ventana de aplicación concreta? Especialmente, ¿cómo puedo determinar eso para un número de Windows, sin tener que activar e ir a cada ventana para averiguar qué escritorio está activo ahora?
Hay algunas aplicaciones que han podido hacer algo así en el pasado, en particular HyperSpace y CurrentKey, pero HyperSpace no funcionaba más allá de OSX 10.11 y CurrentKey se ha retirado debido a las limitaciones de tiempo en el apoyo a una aplicación gratuita y la incapacidad de apoyar el sistema operativo Monterey.
.
¿Alguna idea?