From c65c4aa3c886ec619e1fa3c62cb26ba5565e7719 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 14:29:49 -0700 Subject: [PATCH 01/11] Rename global-keymap-spec to keymap-spec --- spec/atom/{global-keymap-spec.coffee => keymap-spec.coffee} | 0 spec/atom/root-view-spec.coffee | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename spec/atom/{global-keymap-spec.coffee => keymap-spec.coffee} (100%) diff --git a/spec/atom/global-keymap-spec.coffee b/spec/atom/keymap-spec.coffee similarity index 100% rename from spec/atom/global-keymap-spec.coffee rename to spec/atom/keymap-spec.coffee diff --git a/spec/atom/root-view-spec.coffee b/spec/atom/root-view-spec.coffee index 3cf907750..37f2c1cdb 100644 --- a/spec/atom/root-view-spec.coffee +++ b/spec/atom/root-view-spec.coffee @@ -319,7 +319,7 @@ describe "RootView", -> expect(editor1.buffer.url).not.toBe expectedUrl expect(editor2.buffer.url).toBe expectedUrl - describe "global keymap wiring", -> + describe "keymap wiring", -> commandHandler = null beforeEach -> commandHandler = jasmine.createSpy('commandHandler') From ed36f7d440f52112a36c8b0b4f9609af0c93e763 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 14:48:41 -0700 Subject: [PATCH 02/11] Store user configuration file path in App.coffee --- src/atom/app.coffee | 2 ++ src/atom/window.coffee | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/atom/app.coffee b/src/atom/app.coffee index 72530397d..64c5a947c 100644 --- a/src/atom/app.coffee +++ b/src/atom/app.coffee @@ -8,11 +8,13 @@ class App keymap: null windows: null tabText: null + userConfigurationPath: null constructor: (@loadPath, nativeMethods)-> @windows = [] @setUpKeymap() @tabText = " " + @userConfigurationPath = "~/.atom" setUpKeymap: -> @keymap = new Keymap() diff --git a/src/atom/window.coffee b/src/atom/window.coffee index ed8af4494..7c6e130e2 100644 --- a/src/atom/window.coffee +++ b/src/atom/window.coffee @@ -19,7 +19,7 @@ windowAdditions = startup: (url) -> @setUpKeymap() @attachRootView(url) - @loadUserConfig() + @loadUserConfiguration() $(window).on 'close', => @close() $(window).focus() atom.windowOpened this @@ -46,12 +46,13 @@ windowAdditions = @rootView = new RootView {url} $(@rootViewParentSelector).append @rootView - loadUserConfig: (path="~/.atom") -> - absolutePath = fs.absolute(path) + loadUserConfiguration: -> + absolutePath = fs.absolute(atom.userConfigurationPath) try require absolutePath if fs.exists(absolutePath) catch error console.error "Failed to load `#{absolutePath}`", error + @showConsole() requireStylesheet: (path) -> fullPath = require.resolve(path) From 0317dada8e1a6243a569725f75932d6e0e464158 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 15:56:05 -0700 Subject: [PATCH 03/11] meta-, opens user configuration file --- src/atom/app.coffee | 4 +++- src/atom/keymap.coffee | 4 ++++ src/atom/window.coffee | 5 ++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/atom/app.coffee b/src/atom/app.coffee index 64c5a947c..0f7a7f19f 100644 --- a/src/atom/app.coffee +++ b/src/atom/app.coffee @@ -1,4 +1,6 @@ Keymap = require 'keymap' +fs = require 'fs' + $ = require 'jquery' _ = require 'underscore' require 'underscore-extensions' @@ -14,7 +16,7 @@ class App @windows = [] @setUpKeymap() @tabText = " " - @userConfigurationPath = "~/.atom" + @userConfigurationPath = require.resolve(fs.absolute("~/.atom")) setUpKeymap: -> @keymap = new Keymap() diff --git a/src/atom/keymap.coffee b/src/atom/keymap.coffee index bfdc484c3..770ee67f4 100644 --- a/src/atom/keymap.coffee +++ b/src/atom/keymap.coffee @@ -13,14 +13,18 @@ class Keymap @bindKeys "*", 'meta-n': 'newWindow' 'meta-o': 'open' + 'meta-,': 'open-user-configuration' @_newWindow = => $native.newWindow() @_open = => url = $native.openDialog() atom.open(url) if url + @_openUserConfiguration = => + atom.open(atom.userConfigurationPath) $(document).on 'newWindow', @_newWindow $(document).on 'open', @_open + $(document).on 'open-user-configuration', @_openUserConfiguration unbindDefaultKeys: -> $(document).unbind 'newWindow', @_newWindow diff --git a/src/atom/window.coffee b/src/atom/window.coffee index 7c6e130e2..c041cad01 100644 --- a/src/atom/window.coffee +++ b/src/atom/window.coffee @@ -47,11 +47,10 @@ windowAdditions = $(@rootViewParentSelector).append @rootView loadUserConfiguration: -> - absolutePath = fs.absolute(atom.userConfigurationPath) try - require absolutePath if fs.exists(absolutePath) + require atom.userConfigurationPath if fs.exists(atom.userConfigurationPath) catch error - console.error "Failed to load `#{absolutePath}`", error + console.error "Failed to load `#{atom.userConfigurationPath}`", error @showConsole() requireStylesheet: (path) -> From 7924179c45a6db8d80e7b739a2de9e9845ec2a68 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 16:12:19 -0700 Subject: [PATCH 04/11] $native.write creates intermediate directories if they don't exists --- Atom/src/native_handler.mm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Atom/src/native_handler.mm b/Atom/src/native_handler.mm index 5b48d36f9..c5686719c 100644 --- a/Atom/src/native_handler.mm +++ b/Atom/src/native_handler.mm @@ -51,6 +51,13 @@ bool NativeHandler::Execute(const CefString& name, NSString *path = stringFromCefV8Value(arguments[0]); NSString *content = stringFromCefV8Value(arguments[1]); + NSFileManager *fm = [NSFileManager defaultManager]; + + // Create parent directories if they don't exist + BOOL exists = [fm fileExistsAtPath:[path stringByDeletingLastPathComponent] isDirectory:nil]; + if (!exists) { + [fm createDirectoryAtPath:[path stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil]; + } NSError *error = nil; BOOL success = [content writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error]; @@ -62,7 +69,9 @@ bool NativeHandler::Execute(const CefString& name, std::string exception = "Cannot write to '"; exception += [path UTF8String]; exception += "'"; - } + } + + return true; } else if (name == "absolute") { NSString *path = stringFromCefV8Value(arguments[0]); From 890eb91cf164eb438f409615b970e8b1794a1445 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 16:12:40 -0700 Subject: [PATCH 05/11] Put config file in ~/.atom/atom.coffee --- src/atom/app.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom/app.coffee b/src/atom/app.coffee index 0f7a7f19f..eb5f07c5b 100644 --- a/src/atom/app.coffee +++ b/src/atom/app.coffee @@ -16,7 +16,7 @@ class App @windows = [] @setUpKeymap() @tabText = " " - @userConfigurationPath = require.resolve(fs.absolute("~/.atom")) + @userConfigurationPath = fs.absolute "~/.atom/atom.coffee" setUpKeymap: -> @keymap = new Keymap() From 081ec9774771de4d6edec9d7e13e4ebd5d1cde28 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 16:18:45 -0700 Subject: [PATCH 06/11] Use dashes instead of camelCase for event names --- src/atom/keymap.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/atom/keymap.coffee b/src/atom/keymap.coffee index 770ee67f4..329437569 100644 --- a/src/atom/keymap.coffee +++ b/src/atom/keymap.coffee @@ -11,7 +11,7 @@ class Keymap bindDefaultKeys: -> @bindKeys "*", - 'meta-n': 'newWindow' + 'meta-n': 'new-window' 'meta-o': 'open' 'meta-,': 'open-user-configuration' @@ -22,12 +22,12 @@ class Keymap @_openUserConfiguration = => atom.open(atom.userConfigurationPath) - $(document).on 'newWindow', @_newWindow + $(document).on 'new-window', @_newWindow $(document).on 'open', @_open $(document).on 'open-user-configuration', @_openUserConfiguration unbindDefaultKeys: -> - $(document).unbind 'newWindow', @_newWindow + $(document).unbind 'new-window', @_newWindow $(document).unbind 'open', @_open bindKeys: (selector, bindings) -> From fc1b350efded5c664beb6033fcb80c02085352e7 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 16:25:24 -0700 Subject: [PATCH 07/11] Expose AtomController's context --- Atom/src/AtomController.h | 2 ++ Atom/src/AtomController.mm | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Atom/src/AtomController.h b/Atom/src/AtomController.h index c5b7ff43d..7dd479aa0 100644 --- a/Atom/src/AtomController.h +++ b/Atom/src/AtomController.h @@ -19,6 +19,8 @@ class ClientHandler; - (id)initSpecsWithAtomContext:(CefRefPtr)atomContext; - (id)initBenchmarksWithAtomContext:(CefRefPtr)atomContext; +- (CefRefPtr)context; + - (void)createBrowser; @property (nonatomic, retain) IBOutlet NSView *webView; diff --git a/Atom/src/AtomController.mm b/Atom/src/AtomController.mm index 16d53d2ab..c34ddefd0 100644 --- a/Atom/src/AtomController.mm +++ b/Atom/src/AtomController.mm @@ -60,6 +60,10 @@ CefBrowser::CreateBrowser(window_info, _clientHandler.get(), [indexURLString UTF8String], settings); } +- (CefRefPtr)context { + return _clientHandler->GetBrowser()->GetMainFrame()->GetV8Context(); +} + #pragma mark BrowserDelegate - (void)loadStart { From 1a4627442f8edeca38fbcc238cb9769530659b05 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 16:25:55 -0700 Subject: [PATCH 08/11] Atom.open returns the AtomController created --- Atom/src/Atom.h | 2 +- Atom/src/Atom.mm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Atom/src/Atom.h b/Atom/src/Atom.h index 1f4f314c1..2e7a2297e 100755 --- a/Atom/src/Atom.h +++ b/Atom/src/Atom.h @@ -12,7 +12,7 @@ class ClientHandler; CefRefPtr _clientHandler; } -- (void)open:(NSString *)path; +- (AtomController *)open:(NSString *)path; - (IBAction)runSpecs:(id)sender; - (IBAction)runBenchmarks:(id)sender; diff --git a/Atom/src/Atom.mm b/Atom/src/Atom.mm index b3f2449ed..9afc909be 100755 --- a/Atom/src/Atom.mm +++ b/Atom/src/Atom.mm @@ -60,8 +60,8 @@ CefBrowser::CreateBrowser(window_info, _clientHandler.get(), [indexURLString UTF8String], settings); } -- (void)open:(NSString *)path { - [[AtomController alloc] initWithPath:path atomContext:[self atomContext]]; +- (AtomController *)open:(NSString *)path { + return [[AtomController alloc] initWithPath:path atomContext:[self atomContext]]; } - (IBAction)runSpecs:(id)sender { From eded1e30cfbe158b72ddcacc919ccdd915f3d7e4 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 16:26:22 -0700 Subject: [PATCH 09/11] $native.open returns the window where the file was opened. --- Atom/src/native_handler.mm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Atom/src/native_handler.mm b/Atom/src/native_handler.mm index c5686719c..e8ea44102 100644 --- a/Atom/src/native_handler.mm +++ b/Atom/src/native_handler.mm @@ -1,6 +1,7 @@ #import "native_handler.h" #import "include/cef.h" #import "Atom.h" +#import "AtomController.h" NSString *stringFromCefV8Value(const CefRefPtr& value) { std::string cc_value = value->GetStringValue().ToString(); @@ -233,12 +234,15 @@ bool NativeHandler::Execute(const CefString& name, } else if (name == "open") { NSString *path = stringFromCefV8Value(arguments[0]); - [NSApp open:path]; + AtomController *atomController = [(Atom *)NSApp open:path]; + + CefRefPtr context = [atomController context]; + retval = context->GetGlobal(); return true; } else if (name == "newWindow") { - [NSApp open:nil]; + [(Atom *)NSApp open:nil]; return true; } From 5ba3952b8fcd553acc4c1b9d4a5af019f0c95b03 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 17:18:19 -0700 Subject: [PATCH 10/11] Block $native.open until window is completely loaded. --- Atom/src/AtomController.h | 6 ++++-- Atom/src/AtomController.mm | 15 ++++++++++++--- Atom/src/native_handler.mm | 6 ++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Atom/src/AtomController.h b/Atom/src/AtomController.h index 7dd479aa0..f2e8e6dd1 100644 --- a/Atom/src/AtomController.h +++ b/Atom/src/AtomController.h @@ -10,6 +10,8 @@ class ClientHandler; NSString *_bootstrapScript; NSString *_pathToOpen; + BOOL _loaded; + CefRefPtr _atomContext; CefRefPtr _clientHandler; } @@ -19,11 +21,11 @@ class ClientHandler; - (id)initSpecsWithAtomContext:(CefRefPtr)atomContext; - (id)initBenchmarksWithAtomContext:(CefRefPtr)atomContext; -- (CefRefPtr)context; - - (void)createBrowser; +- (void)blockUntilBrowserLoaded; @property (nonatomic, retain) IBOutlet NSView *webView; +@property (nonatomic, readonly) CefRefPtr clientHandler; @end diff --git a/Atom/src/AtomController.mm b/Atom/src/AtomController.mm index c34ddefd0..69e3f6428 100644 --- a/Atom/src/AtomController.mm +++ b/Atom/src/AtomController.mm @@ -7,6 +7,7 @@ @implementation AtomController @synthesize webView=_webView; +@synthesize clientHandler=_clientHandler; - (void)dealloc { [_bootstrapScript release]; @@ -20,6 +21,7 @@ self = [super initWithWindowNibName:@"ClientWindow"]; _bootstrapScript = [bootstrapScript retain]; _atomContext = atomContext; + _loaded = false; [self.window makeKeyAndOrderFront:nil]; [self createBrowser]; @@ -60,13 +62,16 @@ CefBrowser::CreateBrowser(window_info, _clientHandler.get(), [indexURLString UTF8String], settings); } -- (CefRefPtr)context { - return _clientHandler->GetBrowser()->GetMainFrame()->GetV8Context(); +- (void)blockUntilBrowserLoaded { + NSRunLoop *runLoop = [NSRunLoop mainRunLoop]; + while (!_loaded) { + [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0]]; + } } #pragma mark BrowserDelegate - - (void)loadStart { + _loaded = false; CefRefPtr context = _clientHandler->GetBrowser()->GetMainFrame()->GetV8Context(); CefRefPtr global = context->GetGlobal(); @@ -86,6 +91,10 @@ context->Exit(); } +- (void)loadEnd { + _loaded = true; +} + - (bool)keyEventOfType:(cef_handler_keyevent_type_t)type code:(int)code modifiers:(int)modifiers diff --git a/Atom/src/native_handler.mm b/Atom/src/native_handler.mm index e8ea44102..f75aa99d5 100644 --- a/Atom/src/native_handler.mm +++ b/Atom/src/native_handler.mm @@ -2,6 +2,7 @@ #import "include/cef.h" #import "Atom.h" #import "AtomController.h" +#import "client_handler.h" NSString *stringFromCefV8Value(const CefRefPtr& value) { std::string cc_value = value->GetStringValue().ToString(); @@ -235,9 +236,10 @@ bool NativeHandler::Execute(const CefString& name, else if (name == "open") { NSString *path = stringFromCefV8Value(arguments[0]); AtomController *atomController = [(Atom *)NSApp open:path]; + [atomController blockUntilBrowserLoaded]; - CefRefPtr context = [atomController context]; - retval = context->GetGlobal(); + CefRefPtr clientHandler = [atomController clientHandler]; + retval = clientHandler->GetBrowser()->GetMainFrame()->GetV8Context()->GetGlobal(); return true; } From e6b3dd7b43bf21d7127369f67978acf4a52a91a5 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 20 Mar 2012 17:18:45 -0700 Subject: [PATCH 11/11] If ~/.atom/atom.coffee doesn't exist, insert some default text. --- src/atom/keymap.coffee | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/atom/keymap.coffee b/src/atom/keymap.coffee index 329437569..d0734b72e 100644 --- a/src/atom/keymap.coffee +++ b/src/atom/keymap.coffee @@ -1,7 +1,9 @@ -$ = require 'jquery' +fs = require 'fs' BindingSet = require 'binding-set' Specificity = require 'specificity' +$ = require 'jquery' + module.exports = class Keymap bindingSetsBySelector: null @@ -20,7 +22,9 @@ class Keymap url = $native.openDialog() atom.open(url) if url @_openUserConfiguration = => - atom.open(atom.userConfigurationPath) + openedWindow = atom.open(atom.userConfigurationPath) + defaultConfiguration = "# This is run when a window is loaded!\nconsole.log('see!')" + openedWindow.rootView.editor.buffer.setText defaultConfiguration unless fs.exists(atom.userConfigurationPath) $(document).on 'new-window', @_newWindow $(document).on 'open', @_open