提交 e47f1213 编写于 作者: J Joao Moreno

dispatchKeybinding from main

上级 48bd86b4
......@@ -155,7 +155,6 @@ export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry
}
export interface IWindowDriver {
dispatchKeybinding(keybinding: string): TPromise<void>;
click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): TPromise<void>;
doubleClick(selector: string): TPromise<void>;
move(selector: string): TPromise<void>;
......@@ -167,7 +166,6 @@ export interface IWindowDriver {
}
export interface IWindowDriverChannel extends IChannel {
call(command: 'dispatchKeybinding', arg: string): TPromise<void>;
call(command: 'click', arg: [string, number | undefined, number | undefined]): TPromise<void>;
call(command: 'doubleClick', arg: string): TPromise<void>;
call(command: 'move', arg: string): TPromise<void>;
......@@ -185,7 +183,6 @@ export class WindowDriverChannel implements IWindowDriverChannel {
call(command: string, arg?: any): TPromise<any> {
switch (command) {
case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg);
case 'click': return this.driver.click(arg[0], arg[1], arg[2]);
case 'doubleClick': return this.driver.doubleClick(arg);
case 'move': return this.driver.move(arg);
......@@ -207,10 +204,6 @@ export class WindowDriverChannelClient implements IWindowDriver {
constructor(private channel: IWindowDriverChannel) { }
dispatchKeybinding(keybinding: string): TPromise<void> {
return this.channel.call('dispatchKeybinding', keybinding);
}
click(selector: string, xoffset?: number, yoffset?: number): TPromise<void> {
return this.channel.call('click', [selector, xoffset, yoffset]);
}
......
......@@ -9,63 +9,12 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { IDisposable } from 'vs/base/common/lifecycle';
import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/common/driver';
import { IPCClient } from 'vs/base/parts/ipc/common/ipc';
import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO';
import { SimpleKeybinding } from 'vs/base/common/keyCodes';
import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import * as electron from 'electron';
import { USLayoutResolvedKeybinding } from '../../keybinding/common/usLayoutResolvedKeybinding';
import { OS } from 'vs/base/common/platform';
class WindowDriver implements IWindowDriver {
constructor() { }
async dispatchKeybinding(rawKeybinding: string): TPromise<void> {
const [first, second] = KeybindingIO._readUserBinding(rawKeybinding);
await this._dispatchKeybinding(first);
if (second) {
await this._dispatchKeybinding(second);
}
}
private async _dispatchKeybinding(keybinding: SimpleKeybinding | ScanCodeBinding): TPromise<void> {
if (keybinding instanceof ScanCodeBinding) {
throw new Error('ScanCodeBindings not supported');
}
const webContents = electron.remote.getCurrentWebContents();
const noModifiedKeybinding = new SimpleKeybinding(false, false, false, false, keybinding.keyCode);
const resolvedKeybinding = new USLayoutResolvedKeybinding(noModifiedKeybinding, OS);
const keyCode = resolvedKeybinding.getElectronAccelerator();
const modifiers = [];
if (keybinding.ctrlKey) {
modifiers.push('ctrl');
}
if (keybinding.metaKey) {
modifiers.push('meta');
}
if (keybinding.shiftKey) {
modifiers.push('shift');
}
if (keybinding.altKey) {
modifiers.push('alt');
}
webContents.sendInputEvent({ type: 'keyDown', keyCode, modifiers } as any);
webContents.sendInputEvent({ type: 'char', keyCode, modifiers } as any);
webContents.sendInputEvent({ type: 'keyUp', keyCode, modifiers } as any);
await TPromise.timeout(100);
}
click(selector: string, xoffset?: number, yoffset?: number): TPromise<void> {
throw new Error('Method not implemented.');
}
......
......@@ -12,6 +12,13 @@ import { serve as serveNet } from 'vs/base/parts/ipc/node/ipc.net';
import { combinedDisposable, IDisposable } from 'vs/base/common/lifecycle';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IPCServer, IClientRouter } from 'vs/base/parts/ipc/common/ipc';
import { SimpleKeybinding } from 'vs/base/common/keyCodes';
import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding';
import { OS } from 'vs/base/common/platform';
// TODO@joao: bad layering!
import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO';
import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode';
class WindowRouter implements IClientRouter {
......@@ -44,9 +51,50 @@ export class Driver implements IDriver, IWindowDriverRegistry {
.filter(id => this.registeredWindowIds.has(id));
}
dispatchKeybinding(windowId: number, keybinding: string): TPromise<void> {
const windowDriver = this.getWindowDriver(windowId);
return windowDriver.dispatchKeybinding(keybinding);
async dispatchKeybinding(windowId: number, keybinding: string): TPromise<void> {
const [first, second] = KeybindingIO._readUserBinding(keybinding);
await this._dispatchKeybinding(windowId, first);
if (second) {
await this._dispatchKeybinding(windowId, second);
}
}
private async _dispatchKeybinding(windowId: number, keybinding: SimpleKeybinding | ScanCodeBinding): TPromise<void> {
if (keybinding instanceof ScanCodeBinding) {
throw new Error('ScanCodeBindings not supported');
}
const window = this.windowsService.getWindowById(windowId);
const webContents = window.win.webContents;
const noModifiedKeybinding = new SimpleKeybinding(false, false, false, false, keybinding.keyCode);
const resolvedKeybinding = new USLayoutResolvedKeybinding(noModifiedKeybinding, OS);
const keyCode = resolvedKeybinding.getElectronAccelerator();
const modifiers = [];
if (keybinding.ctrlKey) {
modifiers.push('ctrl');
}
if (keybinding.metaKey) {
modifiers.push('meta');
}
if (keybinding.shiftKey) {
modifiers.push('shift');
}
if (keybinding.altKey) {
modifiers.push('alt');
}
webContents.sendInputEvent({ type: 'keyDown', keyCode, modifiers } as any);
webContents.sendInputEvent({ type: 'char', keyCode, modifiers } as any);
webContents.sendInputEvent({ type: 'keyUp', keyCode, modifiers } as any);
await TPromise.timeout(100);
}
click(windowId: number, selector: string, xoffset?: number, yoffset?: number): TPromise<void> {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册