ActivityWatch/aw-watcher-window

View on GitHub
aw_watcher_window/printAppStatus.jxa

Summary

Maintainability
Test Coverage
#!/usr/bin/osascript -l JavaScript

// adapted from:
// https://gist.github.com/EvanLovely/cb01eafb0d61515c835ecd56f6ac199a

// new to jxa?
// - https://apple-dev.groups.io/g/jxa/wiki/3202
// - interactive repl: `osascript -il JavaScript`
// - API reference: Script Editor -> File -> Open Dictionary

var seApp         = Application("System Events");
var oProcess      = seApp.processes.whose({frontmost: true})[0];
var appName       = oProcess.displayedName();

// as of 05/01/21 incognio & url are not actively used in AW
// variables must be set to `undefined` since this script is re-run via osascript
// and the previously set values will be cached otherwise
var url = undefined, incognito = undefined, title = undefined;

// it's not possible to get the URL from firefox
// https://stackoverflow.com/questions/17846948/does-firefox-offer-applescript-support-to-get-url-of-windows

switch(appName) {
  case "Safari":
    // incognito is not available via safari applescript
    url = Application(appName).documents[0].url();
    title = Application(appName).documents[0].name();
    break;
  case "Google Chrome":
  case "Google Chrome Canary":
  case "Chromium":
  case "Brave Browser":
    const activeWindow = Application(appName).windows[0];
    const activeTab = activeWindow.activeTab();

    url = activeTab.url();
    title = activeTab.name();
    incognito = activeWindow.mode() === 'incognito';
    break;
  case "Firefox":
  case "Firefox Developer Edition":
    title = Application(appName).windows[0].name();
    break;
  default:
    mainWindow = oProcess.
      windows().
      find(w => w.attributes.byName("AXMain").value() === true)

    // in some cases, the primary window of an application may not be found
    // this occurs rarely and seems to be triggered by switching to a different application
    if(mainWindow) {
      title = mainWindow.
        attributes.
        byName("AXTitle").
        value()
    }
}

// key names must match expected names in lib.py
JSON.stringify({
  app: appName,
  url,
  title,
  incognito
});