Improvements to FS.
This commit is contained in:
@@ -81,41 +81,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|||||||
|
|
||||||
// NOTE: This function is triggered by DirMonitor.
|
// NOTE: This function is triggered by DirMonitor.
|
||||||
public func fsEventTriggered(_ path: String, _ flags: Int) {
|
public func fsEventTriggered(_ path: String, _ flags: Int) {
|
||||||
var shouldReload = false
|
if containsFlags(key: kFSEventStreamEventFlagItemCreated, in: flags) ||
|
||||||
print("PATH: \(path)")
|
containsFlags(key: kFSEventStreamEventFlagItemRemoved, in: flags) ||
|
||||||
// if containsFlags(key: kFSEventStreamEventFlagNone, in: flags) {
|
containsFlags(key: kFSEventStreamEventFlagItemCloned, in: flags) ||
|
||||||
// }
|
containsFlags(key: kFSEventStreamEventFlagItemRenamed, 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 {
|
|
||||||
for dir in PathManager.shared.paths {
|
for dir in PathManager.shared.paths {
|
||||||
if path.hasPrefix(dir.key) {
|
if path.hasPrefix(dir.key) {
|
||||||
PathManager.shared.rebuildIndex(at: dir.key)
|
PathManager.shared.rebuildIndex(at: dir.key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PathManager.shared.refreshFilesystemWatchers()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ class DirMonitor {
|
|||||||
|
|
||||||
private var dirs: NSMutableArray = []
|
private var dirs: NSMutableArray = []
|
||||||
private let queue: DispatchQueue
|
private let queue: DispatchQueue
|
||||||
// var handler: ((Int, UnsafeMutablePointer<UnsafePointer<Int8>>, UnsafeBufferPointer<UInt32>, UnsafeBufferPointer<UInt64>) -> Void)?
|
|
||||||
private var stream: FSEventStreamRef? = nil
|
private var stream: FSEventStreamRef? = nil
|
||||||
|
|
||||||
func start() -> Bool {
|
func start() -> Bool {
|
||||||
@@ -26,39 +25,21 @@ class DirMonitor {
|
|||||||
var context = FSEventStreamContext()
|
var context = FSEventStreamContext()
|
||||||
context.info = Unmanaged.passUnretained(self).toOpaque()
|
context.info = Unmanaged.passUnretained(self).toOpaque()
|
||||||
|
|
||||||
// func test(count: Int, paths: UnsafeMutablePointer<UnsafePointer<Int8>>, flags: UnsafeBufferPointer<UInt32>, ids: UnsafeBufferPointer<UInt64>) { }
|
guard let stream = FSEventStreamCreate(nil, { (stream, info, numEvents, eventPaths, eventFlags, eventIds) in
|
||||||
// test(count: numEvents, paths: pathsBase, flags: flagsBuffer, ids: eventIDsBuffer)
|
|
||||||
|
|
||||||
guard let stream = FSEventStreamCreate(nil,
|
|
||||||
{
|
|
||||||
(stream, info, numEvents, eventPaths, eventFlags, eventIds) in
|
|
||||||
let pathsBase = eventPaths .assumingMemoryBound(to: UnsafePointer<CChar>.self)
|
let pathsBase = eventPaths .assumingMemoryBound(to: UnsafePointer<CChar>.self)
|
||||||
let pathsBuffer = UnsafeBufferPointer(start: pathsBase, count: numEvents)
|
let pathsBuffer = UnsafeBufferPointer(start: pathsBase, count: numEvents)
|
||||||
let flagsBuffer = UnsafeBufferPointer(start: eventFlags, count: numEvents)
|
let flagsBuffer = UnsafeBufferPointer(start: eventFlags, count: numEvents)
|
||||||
// let eventIDsBuffer = UnsafeBufferPointer(start: eventIds, 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 {
|
for i in 0..<numEvents {
|
||||||
let flags = Int(flagsBuffer[i])
|
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.
|
// Since this is a directory monitor, we discard file events.
|
||||||
if !containsFlags(key: kFSEventStreamEventFlagItemIsDir, in: flags) {
|
if !containsFlags(key: kFSEventStreamEventFlagItemIsDir, in: flags) || !url.path.hasSuffix(".app") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
let url: URL = URL(fileURLWithFileSystemRepresentation: pathsBuffer[i], isDirectory: true, relativeTo: nil)
|
|
||||||
|
|
||||||
// NOTE: The delegate callback should always be called on main thread!
|
// NOTE: The delegate callback should always be called on main thread!
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
delegate.fsEventTriggered(url.path, flags)
|
delegate.fsEventTriggered(url.path, flags)
|
||||||
@@ -68,7 +49,7 @@ class DirMonitor {
|
|||||||
&context,
|
&context,
|
||||||
self.dirs, // [path as NSString] as NSArray,
|
self.dirs, // [path as NSString] as NSArray,
|
||||||
UInt64(kFSEventStreamEventIdSinceNow),
|
UInt64(kFSEventStreamEventIdSinceNow),
|
||||||
1.0,
|
2.0,
|
||||||
FSEventStreamCreateFlags(kFSEventStreamCreateFlagFileEvents) // FSEventStreamCreateFlags(kFSEventStreamCreateFlagNone)
|
FSEventStreamCreateFlags(kFSEventStreamCreateFlagFileEvents) // FSEventStreamCreateFlags(kFSEventStreamCreateFlagNone)
|
||||||
) else {
|
) else {
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class MenulessWindow: NSWindow {
|
|||||||
if event.type == NSEvent.EventType.keyDown {
|
if event.type == NSEvent.EventType.keyDown {
|
||||||
if modsContains(keys: OSCmd, in: modifiers) && key == kVK_ANSI_W {
|
if modsContains(keys: OSCmd, in: modifiers) && key == kVK_ANSI_W {
|
||||||
performClose(nil)
|
performClose(nil)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ final class PathManager {
|
|||||||
// remove or add only needed programs. Thereby, limiting the
|
// remove or add only needed programs. Thereby, limiting the
|
||||||
// amount of allocations.
|
// amount of allocations.
|
||||||
public func rebuildIndex(at path: String) {
|
public func rebuildIndex(at path: String) {
|
||||||
|
paths[path] = []
|
||||||
paths[path] = indexDirs(at: path, deepness: 2)
|
paths[path] = indexDirs(at: path, deepness: 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,8 +54,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, NSPopoverDele
|
|||||||
|
|
||||||
private var contentView: NSView = {
|
private var contentView: NSView = {
|
||||||
let view = NSView()
|
let view = NSView()
|
||||||
// Clip all content to window's rounded frame emulated by
|
// Clip all content to window's rounded frame emulated by backgroundView.
|
||||||
// backgroundView.
|
|
||||||
view.wantsLayer = true
|
view.wantsLayer = true
|
||||||
view.layer?.masksToBounds = true
|
view.layer?.masksToBounds = true
|
||||||
view.layer?.cornerRadius = windowCornerRadius
|
view.layer?.cornerRadius = windowCornerRadius
|
||||||
|
|||||||
Reference in New Issue
Block a user