From faeb58ebdd4ef1f84e8999243a077c8197ca0388 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 11 Jul 2016 12:24:35 +0200 Subject: [PATCH] do not call git status when window is not focused related to #901 --- src/vs/base/browser/event.ts | 210 +++++++++--------- .../parts/git/browser/gitServices.ts | 35 ++- 2 files changed, 135 insertions(+), 110 deletions(-) diff --git a/src/vs/base/browser/event.ts b/src/vs/base/browser/event.ts index 34c37b47102..c99881b224f 100644 --- a/src/vs/base/browser/event.ts +++ b/src/vs/base/browser/event.ts @@ -6,113 +6,115 @@ import _Event, { Emitter } from 'vs/base/common/event'; +export type EventHandler = HTMLElement | HTMLDocument | Window; + export interface IDomEvent { - (element: HTMLElement, type: "MSContentZoom", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSGestureChange", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSGestureDoubleTap", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSGestureEnd", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSGestureHold", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSGestureStart", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSGestureTap", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSGotPointerCapture", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSInertiaStart", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSLostPointerCapture", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSManipulationStateChanged", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerCancel", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerDown", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerEnter", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerLeave", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerMove", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerOut", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerOver", useCapture?: boolean): _Event; - (element: HTMLElement, type: "MSPointerUp", useCapture?: boolean): _Event; - (element: HTMLElement, type: "abort", useCapture?: boolean): _Event; - (element: HTMLElement, type: "activate", useCapture?: boolean): _Event; - (element: HTMLElement, type: "ariarequest", useCapture?: boolean): _Event; - (element: HTMLElement, type: "beforeactivate", useCapture?: boolean): _Event; - (element: HTMLElement, type: "beforecopy", useCapture?: boolean): _Event; - (element: HTMLElement, type: "beforecut", useCapture?: boolean): _Event; - (element: HTMLElement, type: "beforedeactivate", useCapture?: boolean): _Event; - (element: HTMLElement, type: "beforepaste", useCapture?: boolean): _Event; - (element: HTMLElement, type: "blur", useCapture?: boolean): _Event; - (element: HTMLElement, type: "canplay", useCapture?: boolean): _Event; - (element: HTMLElement, type: "canplaythrough", useCapture?: boolean): _Event; - (element: HTMLElement, type: "change", useCapture?: boolean): _Event; - (element: HTMLElement, type: "click", useCapture?: boolean): _Event; - (element: HTMLElement, type: "command", useCapture?: boolean): _Event; - (element: HTMLElement, type: "contextmenu", useCapture?: boolean): _Event; - (element: HTMLElement, type: "copy", useCapture?: boolean): _Event; - (element: HTMLElement, type: "cuechange", useCapture?: boolean): _Event; - (element: HTMLElement, type: "cut", useCapture?: boolean): _Event; - (element: HTMLElement, type: "dblclick", useCapture?: boolean): _Event; - (element: HTMLElement, type: "deactivate", useCapture?: boolean): _Event; - (element: HTMLElement, type: "drag", useCapture?: boolean): _Event; - (element: HTMLElement, type: "dragend", useCapture?: boolean): _Event; - (element: HTMLElement, type: "dragenter", useCapture?: boolean): _Event; - (element: HTMLElement, type: "dragleave", useCapture?: boolean): _Event; - (element: HTMLElement, type: "dragover", useCapture?: boolean): _Event; - (element: HTMLElement, type: "dragstart", useCapture?: boolean): _Event; - (element: HTMLElement, type: "drop", useCapture?: boolean): _Event; - (element: HTMLElement, type: "durationchange", useCapture?: boolean): _Event; - (element: HTMLElement, type: "emptied", useCapture?: boolean): _Event; - (element: HTMLElement, type: "ended", useCapture?: boolean): _Event; - (element: HTMLElement, type: "error", useCapture?: boolean): _Event; - (element: HTMLElement, type: "focus", useCapture?: boolean): _Event; - (element: HTMLElement, type: "gotpointercapture", useCapture?: boolean): _Event; - (element: HTMLElement, type: "input", useCapture?: boolean): _Event; - (element: HTMLElement, type: "keydown", useCapture?: boolean): _Event; - (element: HTMLElement, type: "keypress", useCapture?: boolean): _Event; - (element: HTMLElement, type: "keyup", useCapture?: boolean): _Event; - (element: HTMLElement, type: "load", useCapture?: boolean): _Event; - (element: HTMLElement, type: "loadeddata", useCapture?: boolean): _Event; - (element: HTMLElement, type: "loadedmetadata", useCapture?: boolean): _Event; - (element: HTMLElement, type: "loadstart", useCapture?: boolean): _Event; - (element: HTMLElement, type: "lostpointercapture", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mousedown", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mouseenter", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mouseleave", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mousemove", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mouseout", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mouseover", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mouseup", useCapture?: boolean): _Event; - (element: HTMLElement, type: "mousewheel", useCapture?: boolean): _Event; - (element: HTMLElement, type: "paste", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pause", useCapture?: boolean): _Event; - (element: HTMLElement, type: "play", useCapture?: boolean): _Event; - (element: HTMLElement, type: "playing", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointercancel", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointerdown", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointerenter", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointerleave", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointermove", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointerout", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointerover", useCapture?: boolean): _Event; - (element: HTMLElement, type: "pointerup", useCapture?: boolean): _Event; - (element: HTMLElement, type: "progress", useCapture?: boolean): _Event; - (element: HTMLElement, type: "ratechange", useCapture?: boolean): _Event; - (element: HTMLElement, type: "reset", useCapture?: boolean): _Event; - (element: HTMLElement, type: "scroll", useCapture?: boolean): _Event; - (element: HTMLElement, type: "seeked", useCapture?: boolean): _Event; - (element: HTMLElement, type: "seeking", useCapture?: boolean): _Event; - (element: HTMLElement, type: "select", useCapture?: boolean): _Event; - (element: HTMLElement, type: "selectstart", useCapture?: boolean): _Event; - (element: HTMLElement, type: "stalled", useCapture?: boolean): _Event; - (element: HTMLElement, type: "submit", useCapture?: boolean): _Event; - (element: HTMLElement, type: "suspend", useCapture?: boolean): _Event; - (element: HTMLElement, type: "timeupdate", useCapture?: boolean): _Event; - (element: HTMLElement, type: "touchcancel", useCapture?: boolean): _Event; - (element: HTMLElement, type: "touchend", useCapture?: boolean): _Event; - (element: HTMLElement, type: "touchmove", useCapture?: boolean): _Event; - (element: HTMLElement, type: "touchstart", useCapture?: boolean): _Event; - (element: HTMLElement, type: "volumechange", useCapture?: boolean): _Event; - (element: HTMLElement, type: "waiting", useCapture?: boolean): _Event; - (element: HTMLElement, type: "webkitfullscreenchange", useCapture?: boolean): _Event; - (element: HTMLElement, type: "webkitfullscreenerror", useCapture?: boolean): _Event; - (element: HTMLElement, type: "wheel", useCapture?: boolean): _Event; - (element: HTMLElement, type: string, useCapture?: boolean): _Event; + (element: EventHandler, type: "MSContentZoom", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSGestureChange", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSGestureDoubleTap", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSGestureEnd", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSGestureHold", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSGestureStart", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSGestureTap", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSGotPointerCapture", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSInertiaStart", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSLostPointerCapture", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSManipulationStateChanged", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerCancel", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerDown", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerEnter", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerLeave", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerMove", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerOut", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerOver", useCapture?: boolean): _Event; + (element: EventHandler, type: "MSPointerUp", useCapture?: boolean): _Event; + (element: EventHandler, type: "abort", useCapture?: boolean): _Event; + (element: EventHandler, type: "activate", useCapture?: boolean): _Event; + (element: EventHandler, type: "ariarequest", useCapture?: boolean): _Event; + (element: EventHandler, type: "beforeactivate", useCapture?: boolean): _Event; + (element: EventHandler, type: "beforecopy", useCapture?: boolean): _Event; + (element: EventHandler, type: "beforecut", useCapture?: boolean): _Event; + (element: EventHandler, type: "beforedeactivate", useCapture?: boolean): _Event; + (element: EventHandler, type: "beforepaste", useCapture?: boolean): _Event; + (element: EventHandler, type: "blur", useCapture?: boolean): _Event; + (element: EventHandler, type: "canplay", useCapture?: boolean): _Event; + (element: EventHandler, type: "canplaythrough", useCapture?: boolean): _Event; + (element: EventHandler, type: "change", useCapture?: boolean): _Event; + (element: EventHandler, type: "click", useCapture?: boolean): _Event; + (element: EventHandler, type: "command", useCapture?: boolean): _Event; + (element: EventHandler, type: "contextmenu", useCapture?: boolean): _Event; + (element: EventHandler, type: "copy", useCapture?: boolean): _Event; + (element: EventHandler, type: "cuechange", useCapture?: boolean): _Event; + (element: EventHandler, type: "cut", useCapture?: boolean): _Event; + (element: EventHandler, type: "dblclick", useCapture?: boolean): _Event; + (element: EventHandler, type: "deactivate", useCapture?: boolean): _Event; + (element: EventHandler, type: "drag", useCapture?: boolean): _Event; + (element: EventHandler, type: "dragend", useCapture?: boolean): _Event; + (element: EventHandler, type: "dragenter", useCapture?: boolean): _Event; + (element: EventHandler, type: "dragleave", useCapture?: boolean): _Event; + (element: EventHandler, type: "dragover", useCapture?: boolean): _Event; + (element: EventHandler, type: "dragstart", useCapture?: boolean): _Event; + (element: EventHandler, type: "drop", useCapture?: boolean): _Event; + (element: EventHandler, type: "durationchange", useCapture?: boolean): _Event; + (element: EventHandler, type: "emptied", useCapture?: boolean): _Event; + (element: EventHandler, type: "ended", useCapture?: boolean): _Event; + (element: EventHandler, type: "error", useCapture?: boolean): _Event; + (element: EventHandler, type: "focus", useCapture?: boolean): _Event; + (element: EventHandler, type: "gotpointercapture", useCapture?: boolean): _Event; + (element: EventHandler, type: "input", useCapture?: boolean): _Event; + (element: EventHandler, type: "keydown", useCapture?: boolean): _Event; + (element: EventHandler, type: "keypress", useCapture?: boolean): _Event; + (element: EventHandler, type: "keyup", useCapture?: boolean): _Event; + (element: EventHandler, type: "load", useCapture?: boolean): _Event; + (element: EventHandler, type: "loadeddata", useCapture?: boolean): _Event; + (element: EventHandler, type: "loadedmetadata", useCapture?: boolean): _Event; + (element: EventHandler, type: "loadstart", useCapture?: boolean): _Event; + (element: EventHandler, type: "lostpointercapture", useCapture?: boolean): _Event; + (element: EventHandler, type: "mousedown", useCapture?: boolean): _Event; + (element: EventHandler, type: "mouseenter", useCapture?: boolean): _Event; + (element: EventHandler, type: "mouseleave", useCapture?: boolean): _Event; + (element: EventHandler, type: "mousemove", useCapture?: boolean): _Event; + (element: EventHandler, type: "mouseout", useCapture?: boolean): _Event; + (element: EventHandler, type: "mouseover", useCapture?: boolean): _Event; + (element: EventHandler, type: "mouseup", useCapture?: boolean): _Event; + (element: EventHandler, type: "mousewheel", useCapture?: boolean): _Event; + (element: EventHandler, type: "paste", useCapture?: boolean): _Event; + (element: EventHandler, type: "pause", useCapture?: boolean): _Event; + (element: EventHandler, type: "play", useCapture?: boolean): _Event; + (element: EventHandler, type: "playing", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointercancel", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointerdown", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointerenter", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointerleave", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointermove", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointerout", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointerover", useCapture?: boolean): _Event; + (element: EventHandler, type: "pointerup", useCapture?: boolean): _Event; + (element: EventHandler, type: "progress", useCapture?: boolean): _Event; + (element: EventHandler, type: "ratechange", useCapture?: boolean): _Event; + (element: EventHandler, type: "reset", useCapture?: boolean): _Event; + (element: EventHandler, type: "scroll", useCapture?: boolean): _Event; + (element: EventHandler, type: "seeked", useCapture?: boolean): _Event; + (element: EventHandler, type: "seeking", useCapture?: boolean): _Event; + (element: EventHandler, type: "select", useCapture?: boolean): _Event; + (element: EventHandler, type: "selectstart", useCapture?: boolean): _Event; + (element: EventHandler, type: "stalled", useCapture?: boolean): _Event; + (element: EventHandler, type: "submit", useCapture?: boolean): _Event; + (element: EventHandler, type: "suspend", useCapture?: boolean): _Event; + (element: EventHandler, type: "timeupdate", useCapture?: boolean): _Event; + (element: EventHandler, type: "touchcancel", useCapture?: boolean): _Event; + (element: EventHandler, type: "touchend", useCapture?: boolean): _Event; + (element: EventHandler, type: "touchmove", useCapture?: boolean): _Event; + (element: EventHandler, type: "touchstart", useCapture?: boolean): _Event; + (element: EventHandler, type: "volumechange", useCapture?: boolean): _Event; + (element: EventHandler, type: "waiting", useCapture?: boolean): _Event; + (element: EventHandler, type: "webkitfullscreenchange", useCapture?: boolean): _Event; + (element: EventHandler, type: "webkitfullscreenerror", useCapture?: boolean): _Event; + (element: EventHandler, type: "wheel", useCapture?: boolean): _Event; + (element: EventHandler, type: string, useCapture?: boolean): _Event; } -export const domEvent: IDomEvent = (element: HTMLElement, type: string, useCapture?) => { +export const domEvent: IDomEvent = (element: EventHandler, type: string, useCapture?) => { const fn = e => emitter.fire(e); const emitter = new Emitter({ onFirstListenerAdd: () => { diff --git a/src/vs/workbench/parts/git/browser/gitServices.ts b/src/vs/workbench/parts/git/browser/gitServices.ts index 665a06f8613..eddd41c288b 100644 --- a/src/vs/workbench/parts/git/browser/gitServices.ts +++ b/src/vs/workbench/parts/git/browser/gitServices.ts @@ -36,6 +36,7 @@ import * as semver from 'semver'; import { shell } from 'electron'; import {IStorageService, StorageScope} from 'vs/platform/storage/common/storage'; import Event from 'vs/base/common/event'; +import { domEvent } from 'vs/base/browser/event'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; function toReadablePath(path: string): string { @@ -402,6 +403,8 @@ export class GitService extends ee.EventEmitter private statusDelayer: async.ThrottledDelayer; private reactiveStatusDelayer: async.PeriodThrottledDelayer; private autoFetcher: AutoFetcher; + private isStatusPending = false; + private isFocused = false; private _allowHugeRepositories: boolean; get allowHugeRepositories(): boolean { return this._allowHugeRepositories; } @@ -453,7 +456,7 @@ export class GitService extends ee.EventEmitter this.inputCache = this.instantiationService.createInstance(EditorInputCache, this); - this.triggerStatus(); // trigger initial status + this.triggerAutoStatus(true); // trigger initial status if (!storageService.getBoolean(IgnoreOldGitStorageKey, StorageScope.GLOBAL, false)) { this.raw.serviceState().done(state => { @@ -500,10 +503,22 @@ export class GitService extends ee.EventEmitter this._allowHugeRepositories = config.allowLargeRepositories; if (this._allowHugeRepositories) { - this.triggerStatus(); + this.triggerAutoStatus(); } })); this.lifecycleService.onShutdown(this.dispose, this); + + const focusEvent = domEvent(window, 'focus'); + this.toDispose.push(focusEvent(() => { + this.isFocused = true; + + if (this.isStatusPending) { + this.triggerAutoStatus(); + } + })); + + const blurEvent = domEvent(window, 'blur'); + this.toDispose.push(blurEvent(() => this.isFocused = false)); } private onTextFileChange(e:filesCommon.TextFileChangeEvent): void { @@ -513,7 +528,7 @@ export class GitService extends ee.EventEmitter return; } - this.triggerStatus(); + this.triggerAutoStatus(); } private onFileChanges(e: FileChangesEvent): void { @@ -547,12 +562,12 @@ export class GitService extends ee.EventEmitter return; } - this.triggerStatus(); + this.triggerAutoStatus(); } private onGitServiceOperationEnd(e: { operation: git.IGitOperation; }): void { if (e.operation.id === git.ServiceOperations.COMMAND) { - this.triggerStatus(); + this.triggerAutoStatus(); } } @@ -589,7 +604,15 @@ export class GitService extends ee.EventEmitter }); } - private triggerStatus(): void { + private triggerAutoStatus(force = false): void { + this.isStatusPending = true; + + if (!this.isFocused && !force) { + return; + } + + this.isStatusPending = false; + this.reactiveStatusDelayer.trigger(() => this.status()).done(null, e => { if (errors.isPromiseCanceledError(e)) { return; -- GitLab