Merge remote-tracking branch 'atom/master'
This commit is contained in:
commit
dd7036035a
17 changed files with 240 additions and 21 deletions
|
@ -45,6 +45,9 @@ BrowserWindow::_init = ->
|
|||
@on 'focus', (event) =>
|
||||
app.emit 'browser-window-focus', event, this
|
||||
|
||||
# Notify the creation of the window.
|
||||
app.emit 'browser-window-created', {}, this
|
||||
|
||||
BrowserWindow.getFocusedWindow = ->
|
||||
windows = BrowserWindow.getAllWindows()
|
||||
return window for window in windows when window.isFocused()
|
||||
|
|
|
@ -357,6 +357,17 @@ NativeWindowMac::NativeWindowMac(
|
|||
styleMask |= NSTexturedBackgroundWindowMask;
|
||||
}
|
||||
|
||||
std::string titleBarStyle = "default";
|
||||
options.Get(switches::kTitleBarStyle, &titleBarStyle);
|
||||
|
||||
if (base::mac::IsOSYosemiteOrLater()) {
|
||||
// New title bar styles are available in Yosemite or newer
|
||||
if ((titleBarStyle == "hidden") || (titleBarStyle == "hidden-inset")) {
|
||||
styleMask |= NSFullSizeContentViewWindowMask;
|
||||
styleMask |= NSUnifiedTitleAndToolbarWindowMask;
|
||||
}
|
||||
}
|
||||
|
||||
window_.reset([[AtomNSWindow alloc]
|
||||
initWithContentRect:cocoa_bounds
|
||||
styleMask:styleMask
|
||||
|
@ -382,6 +393,20 @@ NativeWindowMac::NativeWindowMac(
|
|||
// We will manage window's lifetime ourselves.
|
||||
[window_ setReleasedWhenClosed:NO];
|
||||
|
||||
// Configure title bar look on Yosemite or newer
|
||||
if (base::mac::IsOSYosemiteOrLater()) {
|
||||
if ((titleBarStyle == "hidden") || (titleBarStyle == "hidden-inset")) {
|
||||
[window_ setTitlebarAppearsTransparent:YES];
|
||||
[window_ setTitleVisibility:NSWindowTitleHidden];
|
||||
if (titleBarStyle == "hidden-inset") {
|
||||
NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"];
|
||||
toolbar.showsBaselineSeparator = NO;
|
||||
[window_ setToolbar:toolbar];
|
||||
[toolbar release];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// On OS X the initial window size doesn't include window frame.
|
||||
bool use_content_size = false;
|
||||
options.Get(switches::kUseContentSize, &use_content_size);
|
||||
|
|
|
@ -37,13 +37,18 @@ wrapWithActivateUvLoop = (func) ->
|
|||
process.activateUvLoop()
|
||||
func.apply this, arguments
|
||||
process.nextTick = wrapWithActivateUvLoop process.nextTick
|
||||
global.setImmediate = wrapWithActivateUvLoop timers.setImmediate
|
||||
global.clearImmediate = timers.clearImmediate
|
||||
|
||||
# setTimeout needs to update the polling timeout of the event loop, when called
|
||||
# under Chromium's event loop the node's event loop won't get a chance to update
|
||||
# the timeout, so we have to force the node's event loop to recalculate the
|
||||
# timeout in browser process.
|
||||
if process.type is 'browser'
|
||||
# setTimeout needs to update the polling timeout of the event loop, when
|
||||
# called under Chromium's event loop the node's event loop won't get a chance
|
||||
# to update the timeout, so we have to force the node's event loop to
|
||||
# recalculate the timeout in browser process.
|
||||
global.setTimeout = wrapWithActivateUvLoop timers.setTimeout
|
||||
global.setInterval = wrapWithActivateUvLoop timers.setInterval
|
||||
global.setImmediate = wrapWithActivateUvLoop timers.setImmediate
|
||||
global.clearImmediate = wrapWithActivateUvLoop timers.clearImmediate
|
||||
else
|
||||
# There are no setImmediate under renderer process by default, so we need to
|
||||
# manually setup them here.
|
||||
global.setImmediate = setImmediate
|
||||
global.clearImmediate = clearImmediate
|
||||
|
|
|
@ -42,6 +42,9 @@ const char kAcceptFirstMouse[] = "accept-first-mouse";
|
|||
// Whether window size should include window frame.
|
||||
const char kUseContentSize[] = "use-content-size";
|
||||
|
||||
// The requested title bar style for the window
|
||||
const char kTitleBarStyle[] = "title-bar-style";
|
||||
|
||||
// The WebPreferences.
|
||||
const char kWebPreferences[] = "web-preferences";
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ extern const char kAlwaysOnTop[];
|
|||
extern const char kNodeIntegration[];
|
||||
extern const char kAcceptFirstMouse[];
|
||||
extern const char kUseContentSize[];
|
||||
extern const char kTitleBarStyle[];
|
||||
extern const char kWebPreferences[];
|
||||
extern const char kZoomFactor[];
|
||||
extern const char kAutoHideMenuBar[];
|
||||
|
|
46
docs-translations/zh-CN/api/accelerator.md
Normal file
46
docs-translations/zh-CN/api/accelerator.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Accelerator
|
||||
|
||||
An accelerator is a string that represents a keyboard shortcut. It can contain
|
||||
multiple modifiers and key codes, combined by the `+` character.
|
||||
|
||||
Examples:
|
||||
|
||||
* `Command+A`
|
||||
* `Ctrl+Shift+Z`
|
||||
|
||||
## Platform notice
|
||||
|
||||
On Linux and Windows, the `Command` key does not have any effect so
|
||||
use `CommandOrControl` which represents `Command` on OS X and `Control` on
|
||||
Linux and Windows to define some accelerators.
|
||||
|
||||
The `Super` key is mapped to the `Windows` key on Windows and Linux and
|
||||
`Cmd` on OS X.
|
||||
|
||||
## Available modifiers
|
||||
|
||||
* `Command` (or `Cmd` for short)
|
||||
* `Control` (or `Ctrl` for short)
|
||||
* `CommandOrControl` (or `CmdOrCtrl` for short)
|
||||
* `Alt`
|
||||
* `Shift`
|
||||
* `Super`
|
||||
|
||||
## Available key codes
|
||||
|
||||
* `0` to `9`
|
||||
* `A` to `Z`
|
||||
* `F1` to `F24`
|
||||
* Punctuations like `~`, `!`, `@`, `#`, `$`, etc.
|
||||
* `Plus`
|
||||
* `Space`
|
||||
* `Backspace`
|
||||
* `Delete`
|
||||
* `Insert`
|
||||
* `Return` (or `Enter` as alias)
|
||||
* `Up`, `Down`, `Left` and `Right`
|
||||
* `Home` and `End`
|
||||
* `PageUp` and `PageDown`
|
||||
* `Escape` (or `Esc` for short)
|
||||
* `VolumeUp`, `VolumeDown` and `VolumeMute`
|
||||
* `MediaNextTrack`, `MediaPreviousTrack`, `MediaStop` and `MediaPlayPause`
|
60
docs-translations/zh-CN/api/global-shortcut.md
Normal file
60
docs-translations/zh-CN/api/global-shortcut.md
Normal file
|
@ -0,0 +1,60 @@
|
|||
# global-shortcut
|
||||
|
||||
`global-shortcut` 模块可以便捷的为您设置(注册/注销)各种自定义操作的快捷键.
|
||||
|
||||
**Note**: 使用此模块注册的快捷键是系统全局的(QQ截图那种), 不要在应用模块(app module)响应 `ready`
|
||||
消息前使用此模块(注册快捷键).
|
||||
|
||||
```javascript
|
||||
var app = require('app');
|
||||
var globalShortcut = require('global-shortcut');
|
||||
|
||||
app.on('ready', function() {
|
||||
// Register a 'ctrl+x' shortcut listener.
|
||||
var ret = globalShortcut.register('ctrl+x', function() {
|
||||
console.log('ctrl+x is pressed');
|
||||
})
|
||||
|
||||
if (!ret) {
|
||||
console.log('registration failed');
|
||||
}
|
||||
|
||||
// Check whether a shortcut is registered.
|
||||
console.log(globalShortcut.isRegistered('ctrl+x'));
|
||||
});
|
||||
|
||||
app.on('will-quit', function() {
|
||||
// Unregister a shortcut.
|
||||
globalShortcut.unregister('ctrl+x');
|
||||
|
||||
// Unregister all shortcuts.
|
||||
globalShortcut.unregisterAll();
|
||||
});
|
||||
```
|
||||
|
||||
## Methods
|
||||
|
||||
`global-shortcut` 模块包含以下函数:
|
||||
|
||||
### `globalShortcut.register(accelerator, callback)`
|
||||
|
||||
* `accelerator` [Accelerator](accelerator.md)
|
||||
* `callback` Function
|
||||
|
||||
注册 `accelerator` 快捷键. 当用户按下注册的快捷键时将会调用 `callback` 函数.
|
||||
|
||||
### `globalShortcut.isRegistered(accelerator)`
|
||||
|
||||
* `accelerator` [Accelerator](accelerator.md)
|
||||
|
||||
查询 `accelerator` 快捷键是否已经被注册过了,将会返回 `true`(已被注册) 或 `false`(未注册).
|
||||
|
||||
### `globalShortcut.unregister(accelerator)`
|
||||
|
||||
* `accelerator` [Accelerator](accelerator.md)
|
||||
|
||||
注销全局快捷键 `accelerator`.
|
||||
|
||||
### `globalShortcut.unregisterAll()`
|
||||
|
||||
注销本应用注册的所有全局快捷键.
|
|
@ -118,6 +118,15 @@ Returns:
|
|||
|
||||
Emitted when a [browserWindow](browser-window.md) gets focused.
|
||||
|
||||
### Event: 'browser-window-created'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `window` BrowserWindow
|
||||
|
||||
Emitted when a new [browserWindow](browser-window.md) is created.
|
||||
|
||||
### Event: 'select-certificate'
|
||||
|
||||
Emitted when a client certificate is requested.
|
||||
|
|
|
@ -70,6 +70,16 @@ Properties `width` and `height` are required.
|
|||
Linux.
|
||||
* `standard-window` Boolean - Uses the OS X's standard window instead of the
|
||||
textured window. Defaults to `true`.
|
||||
* `title-bar-style` String, OS X - specifies the style of window title bar.
|
||||
This option is supported on OS X 10.10 Yosemite and newer. There are three
|
||||
possible values:
|
||||
* `default` or not specified results in the standard gray opaque Mac title
|
||||
bar.
|
||||
* `hidden` results in a hidden title bar and a full size content window, yet
|
||||
the title bar still has the standard window controls ("traffic lights") in
|
||||
the top left.
|
||||
* `hidden-inset` results in a hidden title bar with an alternative look
|
||||
where the traffic light buttons are slightly more inset from the window edge.
|
||||
* `web-preferences` Object - Settings of web page's features, properties:
|
||||
* `node-integration` Boolean - Whether node integration is enabled. Default
|
||||
is `true`.
|
||||
|
|
|
@ -13,6 +13,20 @@ var BrowserWindow = require('browser-window');
|
|||
var win = new BrowserWindow({ width: 800, height: 600, frame: false });
|
||||
```
|
||||
|
||||
### Alternatives on Mac
|
||||
|
||||
On Mac OS X 10.10 Yosemite and newer, there's an alternative way to specify
|
||||
a chromeless window. Instead of setting `frame` to `false` which disables
|
||||
both the titlebar and window controls, you may want to have the title bar
|
||||
hidden and your content extend to the full window size, yet still preserve
|
||||
the window controls ("traffic lights") for standard window actions.
|
||||
You can do so by specifying the new `title-bar-style` option:
|
||||
|
||||
```javascript
|
||||
var BrowserWindow = require('browser-window');
|
||||
var win = new BrowserWindow({ width: 800, height: 600, 'title-bar-style': 'hidden' });
|
||||
```
|
||||
|
||||
## Transparent window
|
||||
|
||||
By setting the `transparent` option to `true`, you can also make the frameless
|
||||
|
|
|
@ -170,11 +170,11 @@ if (process.platform == 'darwin') {
|
|||
{
|
||||
label: 'Hide Others',
|
||||
accelerator: 'Command+Shift+H',
|
||||
role: 'hideothers:'
|
||||
role: 'hideothers'
|
||||
},
|
||||
{
|
||||
label: 'Show All',
|
||||
role: 'unhide:'
|
||||
role: 'unhide'
|
||||
},
|
||||
{
|
||||
type: 'separator'
|
||||
|
|
|
@ -26,19 +26,30 @@ describe 'app module', ->
|
|||
assert.equal app.getName(), 'test-name'
|
||||
app.setName 'Electron Test'
|
||||
|
||||
describe 'focus/blur event', ->
|
||||
describe 'BrowserWindow events', ->
|
||||
w = null
|
||||
beforeEach ->
|
||||
w.destroy() if w?
|
||||
w = new BrowserWindow(show: false, width: 400, height: 400)
|
||||
afterEach ->
|
||||
w.destroy() if w?
|
||||
w = null
|
||||
it 'should emit focus event', (done) ->
|
||||
|
||||
it 'should emit browser-window-focus event when window is focused', (done) ->
|
||||
app.once 'browser-window-focus', (e, window) ->
|
||||
assert.equal w.id, window.id
|
||||
done()
|
||||
w = new BrowserWindow(show: false)
|
||||
w.emit 'focus'
|
||||
|
||||
it 'should emit browser-window-blur event when window is blured', (done) ->
|
||||
app.once 'browser-window-blur', (e, window) ->
|
||||
assert.equal w.id, window.id
|
||||
done()
|
||||
app.once 'browser-window-focus', (e, window) ->
|
||||
assert.equal w.id, window.id
|
||||
w = new BrowserWindow(show: false)
|
||||
w.emit 'blur'
|
||||
|
||||
it 'should emit browser-window-created event when window is created', (done) ->
|
||||
app.once 'browser-window-created', (e, window) ->
|
||||
setImmediate ->
|
||||
assert.equal w.id, window.id
|
||||
done()
|
||||
w = new BrowserWindow(show: false)
|
||||
w.emit 'blur'
|
||||
w.emit 'focus'
|
||||
|
|
|
@ -4,6 +4,7 @@ path = require 'path'
|
|||
remote = require 'remote'
|
||||
http = require 'http'
|
||||
url = require 'url'
|
||||
os = require 'os'
|
||||
|
||||
BrowserWindow = remote.require 'browser-window'
|
||||
|
||||
|
@ -160,6 +161,22 @@ describe 'browser-window module', ->
|
|||
assert.equal size[0], 400
|
||||
assert.equal size[1], 400
|
||||
|
||||
describe '"title-bar-style" option', ->
|
||||
return if process.platform isnt 'darwin'
|
||||
return if parseInt(os.release().split('.')[0]) < 14 # only run these tests on Yosemite or newer
|
||||
|
||||
it 'creates browser window with hidden title bar', ->
|
||||
w.destroy()
|
||||
w = new BrowserWindow(show: false, width: 400, height: 400, 'title-bar-style': 'hidden')
|
||||
contentSize = w.getContentSize()
|
||||
assert.equal contentSize[1], 400
|
||||
|
||||
it 'creates browser window with hidden inset title bar', ->
|
||||
w.destroy()
|
||||
w = new BrowserWindow(show: false, width: 400, height: 400, 'title-bar-style': 'hidden-inset')
|
||||
contentSize = w.getContentSize()
|
||||
assert.equal contentSize[1], 400
|
||||
|
||||
describe '"enable-larger-than-screen" option', ->
|
||||
return if process.platform is 'linux'
|
||||
|
||||
|
|
7
spec/fixtures/module/preload-node-off.js
vendored
Normal file
7
spec/fixtures/module/preload-node-off.js
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
setImmediate(function() {
|
||||
try {
|
||||
console.log([typeof process, typeof setImmediate, typeof global].join(' '));
|
||||
} catch (e) {
|
||||
console.log(e.message);
|
||||
}
|
||||
});
|
|
@ -3,13 +3,13 @@ path = require 'path'
|
|||
http = require 'http'
|
||||
|
||||
describe '<webview> tag', ->
|
||||
@timeout 10000
|
||||
|
||||
fixtures = path.join __dirname, 'fixtures'
|
||||
|
||||
webview = null
|
||||
|
||||
beforeEach ->
|
||||
webview = new WebView
|
||||
|
||||
afterEach ->
|
||||
document.body.removeChild webview
|
||||
|
||||
|
@ -84,6 +84,14 @@ describe '<webview> tag', ->
|
|||
webview.src = "file://#{fixtures}/pages/e.html"
|
||||
document.body.appendChild webview
|
||||
|
||||
it 'preload script can still use "process" in required modules when nodeintegration is off', (done) ->
|
||||
webview.addEventListener 'console-message', (e) ->
|
||||
assert.equal e.message, 'object function object'
|
||||
done()
|
||||
webview.setAttribute 'preload', "#{fixtures}/module/preload-node-off.js"
|
||||
webview.src = "file://#{fixtures}/api/blank.html"
|
||||
document.body.appendChild webview
|
||||
|
||||
it 'receives ipc message in preload script', (done) ->
|
||||
message = 'boom!'
|
||||
listener = (e) ->
|
||||
|
|
2
vendor/brightray
vendored
2
vendor/brightray
vendored
|
@ -1 +1 @@
|
|||
Subproject commit 9b3695cfd5c48a4cdc90e84a863851001ce8dd10
|
||||
Subproject commit 1cfc13fec13a36f3682ee702c32dc2cf22363143
|
2
vendor/node
vendored
2
vendor/node
vendored
|
@ -1 +1 @@
|
|||
Subproject commit 9da7dd871c313d318bc1447a83ba3c7618bbbc18
|
||||
Subproject commit fdb584a0b42e89885f74ed68f279318b0fbff37f
|
Loading…
Reference in a new issue