The Context Menu
Logitech MX Master 3
The idea for context originated in our frustration of having to reorganize our workbench every time we change the thing we're working on. Code projects may require editor, terminal, and browser to be arranged in a sophisticated grid, while university-related coursework or design tasks require totally different sets of tools and arrangements.
For each context switch, we had to either a) manually close, open and rearrange the respective windows b) manage a separate desktop per context, which can get overwhelming and exhausting to manage
What it does
Context allows you to save your window arrangements with the flick of a finger and enables you to load them just as easily. Context integrates seamlessly with the Logitech MX Master 3, utilizing the extra buttons and thumb scroll wheel to turn window management into an intuitive and satisfying experience.
How we built it
The main logic is handled in a Node/Electron application. Embedded AppleScript is used to handle opening, closing and arranging windows. Using the provided Logitech SDK we integrated the native Mouse events to control the application.
Challenges we ran into
Challenges were mainly coming from AppleScript. The documentation is sparse, and things, like receiving a list of currently active windows or opening a new desktop, can be quite hacky to do. Luckily, there is more than enough content on StackOverflow and there are good libraries to interface with AppleScript in Node.js.
Accomplishments that we are proud of
We are proud to have gotten all the logic with AppleScript to work, as it was quite hard at times to figure out how to interact with macOS through AppleScript.
What we learned
This was the first time we interacted with AppleScript and lower macOS system functions, as well as our first time building a Desktop app using Electron.
What's next for Context
- Migrating the AppleScript logic to use Apple's Accessibility API, which provides better access to system functions and better stability in general.
- Switching from Electron to native Swift, to improve performance and to add a menu bar app for quick interactions
- Extending the UI to allow users to customize and manage contexts visually within a drag-and-drop builder, as well as allowing users to save internal states of applications.