reorganize

master
Jordan Orelli 8 years ago
parent b1df5e29e4
commit 3767628a0e

@ -0,0 +1,8 @@
#import <AppKit/AppKit.h>
@interface ProcWatcher : NSObject
+ (instancetype) shared;
- (void) startWatching;
@end

@ -0,0 +1,49 @@
#include "_cgo_export.h"
#import "ProcWatcher.h"
@implementation ProcWatcher
+ (instancetype) shared {
static id sharedInstance;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedInstance = [ProcWatcher new];
});
return sharedInstance;
}
- (void) startWatching {
NSWorkspace* workspace = [NSWorkspace sharedWorkspace];
NSNotificationCenter* notifications = [workspace notificationCenter];
void (^handleAppLaunch) (NSNotification*) = ^(NSNotification* note) {
NSDictionary* info = note.userInfo;
NSRunningApplication* app = info[NSWorkspaceApplicationKey];
NSString* bundleId = app.bundleIdentifier;
AppStarted((GoString){bundleId.UTF8String, bundleId.length});
};
id observerLaunch = [notifications
addObserverForName: NSWorkspaceDidLaunchApplicationNotification
object: workspace
queue: [NSOperationQueue mainQueue]
usingBlock: handleAppLaunch];
void (^handleAppTerminate) (NSNotification*) = ^(NSNotification* note) {
NSDictionary* info = note.userInfo;
NSRunningApplication* app = info[NSWorkspaceApplicationKey];
NSString* bundleId = app.bundleIdentifier;
AppEnded((GoString){bundleId.UTF8String, bundleId.length});
};
id observerTerminate = [notifications
addObserverForName: NSWorkspaceDidTerminateApplicationNotification
object: workspace
queue: [NSOperationQueue mainQueue]
usingBlock: handleAppTerminate];
}
@end

@ -0,0 +1,8 @@
#include "procmon.h"
#include <AppKit/AppKit.h>
#include "ProcWatcher.h"
void MonitorProcesses() {
[[ProcWatcher shared] startWatching];
[[NSRunLoop currentRunLoop] run];
}

@ -2,7 +2,6 @@ package main
import ( import (
"fmt" "fmt"
"runtime"
) )
/* /*
@ -12,12 +11,42 @@ import (
*/ */
import "C" import "C"
//export TheGoFunc var appChanges = make(chan appStateChange, 1)
func TheGoFunc(name string) {
fmt.Printf("hi from c: %s\n", name) type stateChange uint
const (
stateStarted stateChange = iota
stateEnded
)
type appStateChange struct {
stateChange
appname string
}
//export AppStarted
func AppStarted(name string) {
appChanges <- appStateChange{stateStarted, name}
}
//export AppEnded
func AppEnded(name string) {
appChanges <- appStateChange{stateEnded, name}
}
func reportChanges() {
for change := range appChanges {
switch change.stateChange {
case stateStarted:
fmt.Printf("started: %s\n", change.appname)
case stateEnded:
fmt.Printf("terminated: %s\n", change.appname)
}
}
} }
func main() { func main() {
C.TheCFunc() go reportChanges()
runtime.Goexit() C.MonitorProcesses()
} }

@ -1,3 +1 @@
#import <AppKit/AppKit.h> void MonitorProcesses();
void TheCFunc();

@ -1,66 +0,0 @@
#include "procmon.h"
#import "_cgo_export.h"
#import <AppKit/AppKit.h>
@interface ProcWatcher : NSObject
+ (instancetype) shared;
- (void) applicationDidLaunch:(NSNotification*) notification;
@end
@implementation ProcWatcher
+ (instancetype) shared {
static id sharedInstance;
static dispatch_once_t predicate;
NSLog(@"ProcWatcher shared instance accessed");
dispatch_once(&predicate, ^{
TheGoFunc((GoString){"dispatch", 8});
sharedInstance = [ProcWatcher new];
});
return sharedInstance;
}
- (void) applicationDidLaunch:(NSNotification*) notification {
NSDictionary* info = notification.userInfo;
NSRunningApplication* app = info[NSWorkspaceApplicationKey];
NSString* bundleId = app.bundleIdentifier;
NSLog(@"application launched: %@", bundleId);
TheGoFunc((GoString){bundleId.UTF8String, bundleId.length});
}
@end
void TheCFunc() {
NSLog(@"current run loop: %@", [NSRunLoop currentRunLoop]);
NSLog(@"current run loop mode: %@", [[NSRunLoop currentRunLoop] currentMode]);
NSLog(@"current run loop mode: %@", [[NSRunLoop currentRunLoop] currentMode]);
if ([NSThread isMainThread]) {
NSLog(@"TheCFunc is in the main thread");
} else {
NSLog(@"TheCFunc is NOT in the main thread");
}
NSLog(@"hi from nslog");
TheGoFunc((GoString){"hi", 2});
NSArray* running = [[NSWorkspace sharedWorkspace] runningApplications];
NSLog(@"%@", running);
ProcWatcher* pw = [ProcWatcher shared];
NSNotificationCenter* notifications = [[NSWorkspace sharedWorkspace] notificationCenter];
[notifications
addObserver: pw
selector: @selector(applicationDidLaunch:)
name: NSWorkspaceDidLaunchApplicationNotification object: nil];
NSLog(@"thing has finished");
[[NSRunLoop currentRunLoop] run];
}
Loading…
Cancel
Save