From 0fdfac9d110cbd8e9f84dd3cb93180b6302ed054 Mon Sep 17 00:00:00 2001 From: Mahesh Kommareddi Date: Sun, 31 Aug 2025 21:56:00 -0400 Subject: [PATCH] remote display fixes --- QemuVmManager.Console/Program.cs | 95 +++++++++++++++++++++++- QemuVmManager.Core/QemuCommandBuilder.cs | 18 ++++- 2 files changed, 108 insertions(+), 5 deletions(-) diff --git a/QemuVmManager.Console/Program.cs b/QemuVmManager.Console/Program.cs index d3ae8db..caadb1d 100644 --- a/QemuVmManager.Console/Program.cs +++ b/QemuVmManager.Console/Program.cs @@ -126,9 +126,13 @@ class Program case "network": await HandleNetworkCommandsAsync(arguments); break; - case "port": - await HandlePortCommandsAsync(arguments); - break; + case "port": + await HandlePortCommandsAsync(arguments); + break; + + case "config": + await HandleConfigCommandsAsync(vmService, arguments); + break; case "exit": case "quit": System.Console.WriteLine("Goodbye!"); @@ -1275,6 +1279,91 @@ class Program portForwards.Add(portForward); await SavePortForwardsAsync(portForwards); } + + static async Task HandleConfigCommandsAsync(VmManagementService vmService, string[] arguments) + { + if (arguments.Length < 3) + { + System.Console.WriteLine("Usage: config "); + System.Console.WriteLine("Settings:"); + System.Console.WriteLine(" display [port] - Set display type (gtk, vnc, spice)"); + System.Console.WriteLine(" vga - Set VGA type (std, virtio, qxl)"); + System.Console.WriteLine(" memory - Set memory size in GB"); + System.Console.WriteLine(" cpu - Set CPU cores"); + System.Console.WriteLine("Examples:"); + System.Console.WriteLine(" config ubuntu-desktop display vnc 5900"); + System.Console.WriteLine(" config ubuntu-desktop display gtk"); + System.Console.WriteLine(" config ubuntu-desktop vga std"); + return; + } + + var vmName = arguments[0]; + var setting = arguments[1].ToLower(); + var value = arguments[2]; + + var config = vmService.GetVmConfiguration(vmName); + if (config == null) + { + System.Console.WriteLine($"VM '{vmName}' not found."); + return; + } + + try + { + switch (setting) + { + case "display": + config.Display.Type = value; + if (arguments.Length > 3 && value == "vnc") + { + config.Display.SpicePort = int.Parse(arguments[3]); + } + System.Console.WriteLine($"Display type set to '{value}' for VM '{vmName}'"); + break; + + case "vga": + config.Display.Vga = value; + System.Console.WriteLine($"VGA type set to '{value}' for VM '{vmName}'"); + break; + + case "memory": + if (int.TryParse(value, out int memorySize)) + { + config.Memory.Size = memorySize; + System.Console.WriteLine($"Memory set to {memorySize}GB for VM '{vmName}'"); + } + else + { + System.Console.WriteLine("Invalid memory size. Please specify a number."); + } + break; + + case "cpu": + if (int.TryParse(value, out int cpuCores)) + { + config.Cpu.Cores = cpuCores; + System.Console.WriteLine($"CPU cores set to {cpuCores} for VM '{vmName}'"); + } + else + { + System.Console.WriteLine("Invalid CPU cores. Please specify a number."); + } + break; + + default: + System.Console.WriteLine($"Unknown setting '{setting}'"); + break; + } + + // Save the updated configuration + await vmService.UpdateVmConfigurationAsync(vmName, config); + System.Console.WriteLine($"Configuration updated successfully for VM '{vmName}'"); + } + catch (Exception ex) + { + System.Console.WriteLine($"Error updating configuration: {ex.Message}"); + } + } } public class PortForward diff --git a/QemuVmManager.Core/QemuCommandBuilder.cs b/QemuVmManager.Core/QemuCommandBuilder.cs index b3667e9..dff4e20 100644 --- a/QemuVmManager.Core/QemuCommandBuilder.cs +++ b/QemuVmManager.Core/QemuCommandBuilder.cs @@ -324,8 +324,22 @@ public class QemuCommandBuilder _arguments.Add(displayType); - _arguments.Add("-vga"); - _arguments.Add(display.Vga); + // For X11 forwarding compatibility, use std VGA instead of virtio + // This avoids GLX/OpenGL issues when forwarding over X11 + if (displayType == "gtk" || displayType == "x11") + { + _arguments.Add("-vga"); + _arguments.Add("std"); // Use standard VGA for better X11 compatibility + + // Add software rendering options to avoid GLX issues + _arguments.Add("-device"); + _arguments.Add("virtio-gpu-pci,edid=off"); // Use virtio-gpu without EDID + } + else + { + _arguments.Add("-vga"); + _arguments.Add(display.Vga); + } if (display.EnableSpice) {