Presentations on an ultrawide monitor

13 May 2024 in Odds and Ends

I love having an ultra wide monitor, but it does make presenting tricky at times. All of the available conferencing systems allow you to share either a single window, or all of your screen. For most people, sharing a single window which is the right size works.

For me, it doesn’t. Most of the time I’m switching between a code editor, web browser and terminal. I need a way to share a 1080p section of my screen, no matter which window it’s showing.

Here are the two options I use:

  1. Use Zoom to share a specific area of the screen + Hammerspoon to position the windows
  2. Use DeskPad + any other conferencing tool

Zoom and Hammerspoon

This is the approach I use 99% of the time. It fits my existing workflow with a single display and allows me to drag things in to view as needed (or rather, use the Hammerspoon shortcut below).

This approach consists of two sections. The first is to position the window where it needs to be using Hammerspoon. I have a keyboard binding for this:

lua
function setWindowPosition(key, w,h,x,y)
hs.hotkey.bind({"cmd", "alt", "ctrl", "shift"}, key, function()
local win = hs.window.focusedWindow()
local cursize = win:size()
cursize.w = w
cursize.h = h
local f = win:frame()
f.x = x
f.y = y
win:setFrame(f)
win:setSize(cursize)
end)
end
setWindowPosition("P", 1920, 1080, 2420, 285) -- Right

2420, 285 places the window 2420px from the left, and 285px down from the top of my screen. This is just below where my camera is mounted, allowing me to see the window and also look at the camera.

The second trick is to use Zoom’s “Portion of screen” option and select the area of the screen that your window covers.

Zoom advanced sharing options

At this point the core problem is solved, but there’s one remaining thing that frustrated me. The app switcher shows when I cmd+tab, but some icons are cut off as I’m only sharing part of the screen.

To solve this, I bind specific windows to a keyboard shortcut with Hammerspoon and switch using the keyboard. This prevents the app switcher from showing on screen.

I use cmd+alt+ctrl+shift+y to bind the focused window to y, and cmd+alt+ctrl+y to switch to it instantly. I have six hotkeys bound, which provides plenty of windows if I need them.

lua
function windowSwitch(binder)
local windowId = 0;
hs.hotkey.bind({"cmd", "alt", "ctrl", "shift" }, binder, function()
windowId = hs.window.focusedWindow():id();
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, binder, function()
hs.window.find(windowId):focus();
end)
end
windowSwitch("y")
windowSwitch("u")
windowSwitch("i")
windowSwitch("h")
windowSwitch("j")
windowSwitch("k")

DeskPad

Not all conferencing systems allow you to share a portion of your screen like Zoom. If I’m presenting through an app that doesn’t allow you to share a specific area and I need to show multiple windows, I use DeskPad.

DeskPad adds a virtual screen to your Mac, and an app that shows what’s on that screen. This allows you to share your entire “screen” whilst still keeping the majority of your ultra wide available for other things.

I configure DeskPad’s screen to be above my usual screen to make it easy to drag windows on to it.

If you’re feeling really fancy, you can combine DeskPad and Hammerspoon to move windows to DeskPad with a keyboard shortcut:

lua
hs.hotkey.bind({"cmd", "alt", "ctrl" }, ".", function()
hs.window.focusedWindow():moveToScreen('Deskpad'):maximize()
end)

The End

If you're using Zoom, I can highly recommend the first approach. I use it daily and it hasn't failed me yet. If you're using a conferencing platform that doesn't allow you to share a portion of your screen, DeskPad is a great tool that lets you share a virtual screen at the resolution you desire.