diff --git a/lib/components/term-group.js b/lib/components/term-group.js
index b588eef2..ee6df1fa 100644
--- a/lib/components/term-group.js
+++ b/lib/components/term-group.js
@@ -13,7 +13,6 @@ class TermGroup_ extends React.PureComponent {
super(props, context);
this.bound = new WeakMap();
this.termRefs = {};
- this.sizeChanged = false;
this.onTermRef = this.onTermRef.bind(this);
}
@@ -103,16 +102,6 @@ class TermGroup_ extends React.PureComponent {
return ;
}
- componentWillReceiveProps(nextProps) {
- if (this.props.termGroup.sizes != nextProps.termGroup.sizes || nextProps.sizeChanged) {
- this.term && this.term.fitResize();
- // Indicate to children that their size has changed even if their ratio hasn't
- this.sizeChanged = true;
- } else {
- this.sizeChanged = false;
- }
- }
-
render() {
const {childGroups, termGroup} = this.props;
if (termGroup.sessionUid) {
@@ -123,10 +112,7 @@ class TermGroup_ extends React.PureComponent {
const props = getTermGroupProps(
child.uid,
this.props.parentProps,
- Object.assign({}, this.props, {
- termGroup: child,
- sizeChanged: this.sizeChanged
- })
+ Object.assign({}, this.props, {termGroup: child})
);
return ;
diff --git a/lib/components/term.js b/lib/components/term.js
index 978f5eb7..735bb298 100644
--- a/lib/components/term.js
+++ b/lib/components/term.js
@@ -1,4 +1,4 @@
-/* global Blob,URL,requestAnimationFrame */
+/* global Blob,URL,requestAnimationFrame,ResizeObserver */
import React from 'react';
import {Terminal} from 'xterm';
import * as fit from 'xterm/lib/addons/fit/fit';
@@ -78,8 +78,6 @@ export default class Term extends React.PureComponent {
props.ref_(props.uid, this);
this.termWrapperRef = null;
this.termRect = null;
- this.onOpen = this.onOpen.bind(this);
- this.onWindowResize = this.onWindowResize.bind(this);
this.onWindowPaste = this.onWindowPaste.bind(this);
this.onTermWrapperRef = this.onTermWrapperRef.bind(this);
this.onMouseUp = this.onMouseUp.bind(this);
@@ -111,8 +109,6 @@ export default class Term extends React.PureComponent {
this.term.focus();
}
- this.onOpen(this.termOptions);
-
if (props.onTitle) {
this.disposableListeners.push(this.term.addDisposableListener('title', props.onTitle));
}
@@ -149,10 +145,6 @@ export default class Term extends React.PureComponent {
);
}
- window.addEventListener('resize', this.onWindowResize, {
- passive: true
- });
-
window.addEventListener('paste', this.onWindowPaste, {
capture: true
});
@@ -160,15 +152,6 @@ export default class Term extends React.PureComponent {
terms[this.props.uid] = this;
}
- onOpen() {
- // we need to delay one frame so that styles
- // get applied and we can make an accurate measurement
- // of the container width and height
- requestAnimationFrame(() => {
- this.fitResize();
- });
- }
-
getTermDocument() {
// eslint-disable-next-line no-console
console.warn(
@@ -181,10 +164,6 @@ export default class Term extends React.PureComponent {
return document;
}
- onWindowResize() {
- this.fitResize();
- }
-
// intercepting paste event for any necessary processing of
// clipboard data, if result is falsy, paste event continues
onWindowPaste(e) {
@@ -281,12 +260,6 @@ export default class Term extends React.PureComponent {
this.termOptions = nextTermOptions;
- if (!this.props.isTermActive && nextProps.isTermActive) {
- requestAnimationFrame(() => {
- this.fitResize();
- });
- }
-
if (
this.props.fontSize !== nextProps.fontSize ||
this.props.fontFamily !== nextProps.fontFamily ||
@@ -304,6 +277,21 @@ export default class Term extends React.PureComponent {
onTermWrapperRef(component) {
this.termWrapperRef = component;
+
+ if (component) {
+ this.resizeObserver = new ResizeObserver(() => {
+ if (this.resizeTimeout) {
+ return;
+ }
+ this.resizeTimeout = setTimeout(() => {
+ delete this.resizeTimeout;
+ this.fitResize();
+ }, 0);
+ });
+ this.resizeObserver.observe(component);
+ } else {
+ this.resizeObserver.disconnect();
+ }
}
componentWillUnmount() {
@@ -318,10 +306,6 @@ export default class Term extends React.PureComponent {
this.disposableListeners.forEach(handler => handler.dispose());
this.disposableListeners = [];
- window.removeEventListener('resize', this.onWindowResize, {
- passive: true
- });
-
window.removeEventListener('paste', this.onWindowPaste, {
capture: true
});
diff --git a/lib/components/terms.js b/lib/components/terms.js
index f76ea0b6..41d6e330 100644
--- a/lib/components/terms.js
+++ b/lib/components/terms.js
@@ -85,7 +85,7 @@ export default class Terms extends React.Component {
render() {
const shift = !isMac && this.props.termGroups.length > 1;
return (
-
+
{this.props.customChildrenBefore}
{this.props.termGroups.map(termGroup => {
const {uid} = termGroup;
@@ -152,11 +152,34 @@ export default class Terms extends React.Component {
left: 0;
bottom: 0;
color: #fff;
- transition: ${isMac ? 'none' : 'margin-top 0.3s ease'};
}
.terms_termsShifted {
margin-top: 68px;
+ animation: shift-down 0.2s ease-out;
+ }
+
+ .terms_termsNotShifted {
+ margin-top: 34px;
+ animation: shift-up 0.3s ease;
+ }
+
+ @keyframes shift-down {
+ 0% {
+ transform: translateY(-34px);
+ }
+ 100% {
+ transform: translateY(0px);
+ }
+ }
+
+ @keyframes shift-up {
+ 0% {
+ transform: translateY(34px);
+ }
+ 100% {
+ transform: translateY(0px);
+ }
}
.terms_termGroup {