Improvements to FS.

This commit is contained in:
2025-02-07 23:35:51 -08:00
parent 5075329813
commit ab305f7acf
5 changed files with 13 additions and 56 deletions

View File

@@ -81,41 +81,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
// NOTE: This function is triggered by DirMonitor.
public func fsEventTriggered(_ path: String, _ flags: Int) {
var shouldReload = false
print("PATH: \(path)")
// if containsFlags(key: kFSEventStreamEventFlagNone, in: flags) {
// }
// if containsFlags(key: kFSEventStreamEventFlagRootChanged, in: flags) {
// }
// if containsFlags(key: kFSEventStreamEventFlagMustScanSubDirs, in: flags) {
// }
// if containsFlags(key: kFSEventStreamEventFlagItemInodeMetaMod, in: flags) {
// }
if containsFlags(key: kFSEventStreamEventFlagItemCreated, in: flags) {
print(" CREATED")
shouldReload = true
}
if containsFlags(key: kFSEventStreamEventFlagItemRemoved, in: flags) {
print(" REMOVED")
shouldReload = true
}
if containsFlags(key: kFSEventStreamEventFlagItemCloned, in: flags) {
print(" CLONED")
shouldReload = true
}
if containsFlags(key: kFSEventStreamEventFlagItemRenamed, in: flags) {
print(" RENAMED")
shouldReload = true
}
// TODO: This should also trigger SearchViewController's search re-index.
if shouldReload {
if containsFlags(key: kFSEventStreamEventFlagItemCreated, in: flags) ||
containsFlags(key: kFSEventStreamEventFlagItemRemoved, in: flags) ||
containsFlags(key: kFSEventStreamEventFlagItemCloned, in: flags) ||
containsFlags(key: kFSEventStreamEventFlagItemRenamed, in: flags)
{
for dir in PathManager.shared.paths {
if path.hasPrefix(dir.key) {
PathManager.shared.rebuildIndex(at: dir.key)
}
}
PathManager.shared.refreshFilesystemWatchers()
}
}
}

View File

@@ -16,7 +16,6 @@ class DirMonitor {
private var dirs: NSMutableArray = []
private let queue: DispatchQueue
// var handler: ((Int, UnsafeMutablePointer<UnsafePointer<Int8>>, UnsafeBufferPointer<UInt32>, UnsafeBufferPointer<UInt64>) -> Void)?
private var stream: FSEventStreamRef? = nil
func start() -> Bool {
@@ -26,39 +25,21 @@ class DirMonitor {
var context = FSEventStreamContext()
context.info = Unmanaged.passUnretained(self).toOpaque()
// func test(count: Int, paths: UnsafeMutablePointer<UnsafePointer<Int8>>, flags: UnsafeBufferPointer<UInt32>, ids: UnsafeBufferPointer<UInt64>) { }
// test(count: numEvents, paths: pathsBase, flags: flagsBuffer, ids: eventIDsBuffer)
guard let stream = FSEventStreamCreate(nil,
{
(stream, info, numEvents, eventPaths, eventFlags, eventIds) in
guard let stream = FSEventStreamCreate(nil, { (stream, info, numEvents, eventPaths, eventFlags, eventIds) in
let pathsBase = eventPaths .assumingMemoryBound(to: UnsafePointer<CChar>.self)
let pathsBuffer = UnsafeBufferPointer(start: pathsBase, count: numEvents)
let flagsBuffer = UnsafeBufferPointer(start: eventFlags, count: numEvents)
// let eventIDsBuffer = UnsafeBufferPointer(start: eventIds, count: numEvents)
// stream -> OpaquePointer
// info -> Optional<UnsafeMutableRawPointer>
// numEvents -> Int
// eventPaths -> UnsafeMutableRawPointer
// eventFlags -> UnsafePointer<UInt32>
// eventIds -> UnsafePointer<UInt64>
// pathsBase -> UnsafeMutablePointer<UnsafePointer<Int8>>
// pathsBuffer -> UnsafeBufferPointer<UnsafePointer<Int8>>
// flagsBuffer -> UnsafeBufferPointer<UInt32>
// eventIDsBuffer -> UnsafeBufferPointer<UInt64>
for i in 0..<numEvents {
let flags = Int(flagsBuffer[i])
let url: URL = URL(fileURLWithFileSystemRepresentation: pathsBuffer[i], isDirectory: true, relativeTo: nil)
// NOTE: Since this is a directory monitor, we discard file events.
if !containsFlags(key: kFSEventStreamEventFlagItemIsDir, in: flags) {
// Since this is a directory monitor, we discard file events.
if !containsFlags(key: kFSEventStreamEventFlagItemIsDir, in: flags) || !url.path.hasSuffix(".app") {
continue
}
let url: URL = URL(fileURLWithFileSystemRepresentation: pathsBuffer[i], isDirectory: true, relativeTo: nil)
// NOTE: The delegate callback should always be called on main thread!
DispatchQueue.main.async {
delegate.fsEventTriggered(url.path, flags)
@@ -68,7 +49,7 @@ class DirMonitor {
&context,
self.dirs, // [path as NSString] as NSArray,
UInt64(kFSEventStreamEventIdSinceNow),
1.0,
2.0,
FSEventStreamCreateFlags(kFSEventStreamCreateFlagFileEvents) // FSEventStreamCreateFlags(kFSEventStreamCreateFlagNone)
) else {
return false

View File

@@ -25,6 +25,7 @@ class MenulessWindow: NSWindow {
if event.type == NSEvent.EventType.keyDown {
if modsContains(keys: OSCmd, in: modifiers) && key == kVK_ANSI_W {
performClose(nil)
return true
}
}

View File

@@ -100,6 +100,7 @@ final class PathManager {
// remove or add only needed programs. Thereby, limiting the
// amount of allocations.
public func rebuildIndex(at path: String) {
paths[path] = []
paths[path] = indexDirs(at: path, deepness: 2)
}

View File

@@ -54,8 +54,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, NSPopoverDele
private var contentView: NSView = {
let view = NSView()
// Clip all content to window's rounded frame emulated by
// backgroundView.
// Clip all content to window's rounded frame emulated by backgroundView.
view.wantsLayer = true
view.layer?.masksToBounds = true
view.layer?.cornerRadius = windowCornerRadius