Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.1.0</string>
<string>1.1.1</string>
<key>CFBundleVersion</key>
<string>1</string>
<string>2</string>
<key>LSMinimumSystemVersion</key>
<string>14.0</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.video</string>
<key>LSUIElement</key>
<true/>
<false/>
<key>NSCameraUsageDescription</key>
<string>Camera Bubble shows your camera in a floating window while you record your screen.</string>
<key>NSHighResolutionCapable</key>
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ want.
- Manual `Start / Pause / Resume` timer
- Timer reset between takes
- Menu-bar controls for the bubble and timer
- A normal Dock icon, Spotlight entry, and Applications/Launchpad presence
- Remembers window size, position, and mirroring
- Native app icon and About panel
- Works across macOS Spaces and full-screen apps
Expand Down
53 changes: 52 additions & 1 deletion Sources/CameraBubble/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {

func applicationDidFinishLaunching(_ notification: Notification) {
configurePanel()
configureMainMenu()
configureStatusItem()
showBubble()
}
Expand All @@ -252,6 +253,52 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
panel.saveFrame(usingName: "CameraBubbleWindow")
}

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
showBubble()
return true
}

private func configureMainMenu() {
let mainMenu = NSMenu()

let appMenuItem = NSMenuItem()
mainMenu.addItem(appMenuItem)
let appMenu = NSMenu()
appMenuItem.submenu = appMenu

let about = appMenu.addItem(
withTitle: "About Camera Bubble",
action: #selector(showAbout),
keyEquivalent: ""
)
about.target = self
appMenu.addItem(.separator())

let show = appMenu.addItem(
withTitle: "Show Camera Bubble",
action: #selector(showBubbleFromMenu),
keyEquivalent: "b"
)
show.target = self

appMenu.addItem(.separator())
appMenu.addItem(
withTitle: "Hide Camera Bubble",
action: #selector(NSApplication.hide(_:)),
keyEquivalent: "h"
)
appMenu.addItem(.separator())

let quit = appMenu.addItem(
withTitle: "Quit Camera Bubble",
action: #selector(NSApplication.terminate(_:)),
keyEquivalent: "q"
)
quit.target = NSApp

NSApp.mainMenu = mainMenu
}

private func configurePanel() {
let defaultSize = NSSize(width: 360, height: 240)
previewView = CameraPreviewView(frame: NSRect(origin: .zero, size: defaultSize))
Expand Down Expand Up @@ -338,6 +385,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
panel.isVisible ? hideBubble() : showBubble()
}

@objc private func showBubbleFromMenu() {
showBubble()
}

private func showBubble() {
panel.orderFrontRegardless()
updateMenuState()
Expand Down Expand Up @@ -410,7 +461,7 @@ enum CameraBubbleApp {
let app = NSApplication.shared
let delegate = AppDelegate()
app.delegate = delegate
app.setActivationPolicy(.accessory)
app.setActivationPolicy(.regular)
app.run()
}
}