Canalización (pipeline)
XDragMover se ejecuta como una app de barra de menú en segundo plano que instala un monitor de eventos global a través de la API Quartz Event Services, observando el estado de las teclas modificadoras y del ratón en todo el sistema. Cuando se detecta un gesto que cumple las condiciones, resuelve la ventana objetivo mediante la API de Accesibilidad de macOS y controla directamente su posición o su marco.
Una capa compartida AppSettings (respaldada por UserDefaults)
alimenta en vivo el modificador activo, el tiempo de espera y los patrones de exclusión
a cada par tap/controlador, de modo que los cambios en Ajustes se aplican de inmediato
— sin necesidad de reiniciar. Un StatusMenuController proporciona el
elemento de la barra de menú y las ventanas de Ajustes/Depuración alrededor de esta
canalización central.
Etapas en detalle
- Monitor de eventos global. Un tap de Quartz Event Services observa las teclas modificadoras y los eventos de botón/movimiento del ratón para todo el sistema, no solo las ventanas propias de esta app.
- Event Tap.
WindowMoveEventTap/WindowResizeEventTap/FocusFollowsMouseEventTapcomparan cada evento entrante con elGestureModifierconfigurado (cualquier combinación de Comando/Opción/Control/Mayúsculas, excepto Mayúsculas solo) y reenvían los eventos que cumplen las condiciones a un controlador comprobable. - Controlador.
WindowMoveController/WindowResizeControllerresuelven qué ventana está bajo el cursor, la comprueban contra la lista de exclusión basada en expresiones regulares (comparada con el nombre de la app propietaria) y — si no está excluida — rastrean los deltas del ratón durante todo el arrastre. - API de Accesibilidad. Los cambios de posición y tamaño se aplican directamente mediante atributos de
AXUIElement(AXWindowHandling), el mismo mecanismo que controla el permiso de Accesibilidad de Ajustes del Sistema. - Ventana objetivo. La ventana que se mueve o redimensiona pertenece a la app que esté bajo el cursor — XDragMover funciona de manera uniforme en todas las apps estándar de macOS, sin necesitar integración específica por app.
Permisos
Debido a que observa eventos de entrada en todo el sistema y reposiciona ventanas pertenecientes a otras aplicaciones, XDragMover requiere el permiso de Accesibilidad (Ajustes del Sistema → Privacidad y seguridad → Accesibilidad), concedido una sola vez al primer inicio. No se usan otros permisos especiales, extensiones de kernel ni daemons en segundo plano.