actually make vm swich displays properly or whatever

This commit is contained in:
modeco80
2024-07-10 18:43:35 -04:00
parent bee25b5381
commit 048f08b00b
2 changed files with 17 additions and 5 deletions

View File

@@ -113,14 +113,22 @@ export default class CollabVMServer {
this.OnDisplayResized(initSize); this.OnDisplayResized(initSize);
vm.GetDisplay().on('resize', (size: Size) => this.OnDisplayResized(size)); // vm.GetDisplay().on('resize', (size: Size) => this.OnDisplayResized(size));
vm.GetDisplay().on('rect', (rect: Rect) => this.OnDisplayRectangle(rect)); // vm.GetDisplay().on('rect', (rect: Rect) => this.OnDisplayRectangle(rect));
this.VM = vm; this.VM = vm;
// hack but whatever (TODO: less rickity) // hack but whatever (TODO: less rickity)
if (config.vm.type == 'qemu') { if (config.vm.type == 'qemu') {
(vm as QemuVM).on('statechange', (newState: VMState) => { (vm as QemuVM).on('statechange', (newState: VMState) => {
if(newState == VMState.Started) {
this.logger.Info("started!!");
// well aware this sucks but whatever
this.VM.GetDisplay().on('resize', (size: Size) => this.OnDisplayResized(size));
this.VM.GetDisplay().on('rect', (rect: Rect) => this.OnDisplayRectangle(rect));
}
if (newState == VMState.Stopped) { if (newState == VMState.Stopped) {
this.logger.Info('stopped ?'); this.logger.Info('stopped ?');
setTimeout(async () => { setTimeout(async () => {

View File

@@ -37,7 +37,7 @@ export class QemuVM extends EventEmitter {
private qemuProcess: ExecaChildProcess | null = null; private qemuProcess: ExecaChildProcess | null = null;
private display: QemuDisplay; private display: QemuDisplay | null;
private definition: QemuVmDefinition; private definition: QemuVmDefinition;
private addedAdditionalArguments = false; private addedAdditionalArguments = false;
@@ -137,7 +137,7 @@ export class QemuVM extends EventEmitter {
} }
GetDisplay() { GetDisplay() {
return this.display; return this.display!;
} }
/// Private fun bits :) /// Private fun bits :)
@@ -260,6 +260,7 @@ export class QemuVM extends EventEmitter {
self.qmpInstance.on('close', onQmpError); self.qmpInstance.on('close', onQmpError);
self.qmpInstance.on('error', (e: Error) => { self.qmpInstance.on('error', (e: Error) => {
self.VMLog().Error("QMP Error: {0}", e.message); self.VMLog().Error("QMP Error: {0}", e.message);
onQmpError();
}); });
self.qmpInstance.on('event', async (ev) => { self.qmpInstance.on('event', async (ev) => {
@@ -277,7 +278,7 @@ export class QemuVM extends EventEmitter {
self.qmpInstance.on('qmp-ready', async (hadError) => { self.qmpInstance.on('qmp-ready', async (hadError) => {
self.VMLog().Info('QMP ready'); self.VMLog().Info('QMP ready');
self.display.Connect(); self.display?.Connect();
// QMP has been connected so the VM is ready to be considered started // QMP has been connected so the VM is ready to be considered started
self.qmpFailCount = 0; self.qmpFailCount = 0;
@@ -299,6 +300,9 @@ export class QemuVM extends EventEmitter {
private async DisconnectDisplay() { private async DisconnectDisplay() {
try { try {
this.display?.Disconnect(); this.display?.Disconnect();
// create a new display (and gc the old one)
this.display = new QemuDisplay(this.GetVncPath());
} catch (err) { } catch (err) {
// oh well lol // oh well lol
} }