Improvements to FS.
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user