virtui-manager 1.3.0__tar.gz → 1.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. {virtui_manager-1.3.0/src/virtui_manager.egg-info → virtui_manager-1.5.0}/PKG-INFO +1 -1
  2. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/pyproject.toml +4 -2
  3. virtui_manager-1.5.0/requirements.txt +5 -0
  4. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/setup.cfg +3 -2
  5. {virtui_manager-1.3.0 → virtui_manager-1.5.0/src/virtui_manager.egg-info}/PKG-INFO +1 -1
  6. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/virtui_manager.egg-info/SOURCES.txt +9 -5
  7. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/virtui_manager.egg-info/entry_points.txt +1 -0
  8. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/constants.py +15 -7
  9. virtui_manager-1.5.0/src/vmanager/gui_wrapper.py +89 -0
  10. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/i18n.py +2 -2
  11. virtui_manager-1.5.0/src/vmanager/locale/de/LC_MESSAGES/virtui-manager.mo +0 -0
  12. {virtui_manager-1.3.0/src/vmanager/locales → virtui_manager-1.5.0/src/vmanager/locale}/de/LC_MESSAGES/virtui-manager.po +1217 -1037
  13. virtui_manager-1.5.0/src/vmanager/locale/fr/LC_MESSAGES/virtui-manager.mo +0 -0
  14. {virtui_manager-1.3.0/src/vmanager/locales → virtui_manager-1.5.0/src/vmanager/locale}/fr/LC_MESSAGES/virtui-manager.po +564 -503
  15. virtui_manager-1.5.0/src/vmanager/locale/it/LC_MESSAGES/virtui-manager.mo +0 -0
  16. {virtui_manager-1.3.0/src/vmanager/locales → virtui_manager-1.5.0/src/vmanager/locale}/it/LC_MESSAGES/virtui-manager.po +1205 -1050
  17. {virtui_manager-1.3.0/src/vmanager/locales → virtui_manager-1.5.0/src/vmanager/locale}/virtui-manager.pot +555 -498
  18. virtui_manager-1.5.0/src/vmanager/modals/host_stats.py +199 -0
  19. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/migration_modals.py +1 -1
  20. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/utils_modals.py +1 -1
  21. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/utils.py +18 -1
  22. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vm_actions.py +20 -0
  23. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vm_migration.py +4 -1
  24. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vmanager.css +9 -1
  25. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vmanager.py +101 -16
  26. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vmcard.css +19 -1
  27. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vmcard.py +176 -72
  28. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/webconsole_manager.py +1 -1
  29. virtui_manager-1.3.0/requirements.txt +0 -4
  30. virtui_manager-1.3.0/src/vmanager/locales/fr/LC_MESSAGES/virtui-manager.mo +0 -0
  31. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/LICENSE +0 -0
  32. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/MANIFEST.in +0 -0
  33. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/README.md +0 -0
  34. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/virtui_manager.egg-info/dependency_links.txt +0 -0
  35. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/virtui_manager.egg-info/requires.txt +0 -0
  36. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/virtui_manager.egg-info/top_level.txt +0 -0
  37. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/__init__.py +0 -0
  38. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/config.py +0 -0
  39. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/connection_manager.py +0 -0
  40. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/dialog.css +0 -0
  41. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/events.py +0 -0
  42. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/firmware_manager.py +0 -0
  43. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/libvirt_error_handler.py +0 -0
  44. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/libvirt_utils.py +0 -0
  45. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/__init__.py +0 -0
  46. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/base_modals.py +0 -0
  47. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/bulk_modals.py +0 -0
  48. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/cache_stats_modal.py +0 -0
  49. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/capabilities_modal.py +0 -0
  50. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/config_modal.py +0 -0
  51. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/cpu_mem_pc_modals.py +0 -0
  52. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/custom_migration_modal.py +0 -0
  53. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/disk_pool_modals.py +0 -0
  54. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/host_dashboard_modal.py +0 -0
  55. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/howto_disk_modal.py +0 -0
  56. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/howto_network_modal.py +0 -0
  57. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/howto_overlay_modal.py +0 -0
  58. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/howto_ssh_modal.py +0 -0
  59. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/howto_virtiofs_modal.py +0 -0
  60. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/input_modals.py +0 -0
  61. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/log_modal.py +0 -0
  62. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/network_modals.py +0 -0
  63. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/provisioning_modals.py +0 -0
  64. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/select_server_modals.py +0 -0
  65. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/selection_modals.py +0 -0
  66. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/server_modals.py +0 -0
  67. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/server_prefs_modals.py +0 -0
  68. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/virsh_modals.py +0 -0
  69. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/virtiofs_modals.py +0 -0
  70. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/vm_type_info_modal.py +0 -0
  71. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/vmanager_modals.py +0 -0
  72. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/vmcard_dialog.py +0 -0
  73. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/vmdetails_modals.py +0 -0
  74. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/modals/xml_modals.py +0 -0
  75. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/network_manager.py +0 -0
  76. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/remote_viewer.py +0 -0
  77. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/remote_viewer_gtk4.py +0 -0
  78. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/storage_manager.py +0 -0
  79. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/virtui_dev.py +0 -0
  80. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vm_cache.py +0 -0
  81. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vm_provisioner.py +0 -0
  82. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vm_queries.py +0 -0
  83. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vm_service.py +0 -0
  84. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vmanager_cmd.py +0 -0
  85. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/vmcard_pool.py +0 -0
  86. {virtui_manager-1.3.0 → virtui_manager-1.5.0}/src/vmanager/wrapper.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtui-manager
3
- Version: 1.3.0
3
+ Version: 1.5.0
4
4
  Summary: Terminal-based interface to manage virtual machines using libvirt
5
5
  Home-page: https://aginies.github.io/virtui-manager/
6
6
  Author: Antoine Ginies
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "virtui-manager"
7
- version = "1.3.0"
7
+ version = "1.5.0"
8
8
  description = "Terminal-based interface to manage virtual machines using libvirt"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -64,6 +64,8 @@ Changelog = "https://github.com/aginies/virtui-manager/releases"
64
64
  virtui-manager = "vmanager.wrapper:main"
65
65
  virtui-manager-cmd = "vmanager.wrapper:cmd_main"
66
66
  virtui-remote-viewer = "vmanager.wrapper:remote_viewer_main"
67
+ virtui-gui = "vmanager.gui_wrapper:main"
68
+
67
69
 
68
70
  [tool.setuptools]
69
71
  package-dir = {"" = "src"}
@@ -72,7 +74,7 @@ package-dir = {"" = "src"}
72
74
  where = ["src"]
73
75
 
74
76
  [tool.setuptools.package-data]
75
- vmanager = ["*.css", "*.md", "locales/*.pot", "locales/*/LC_MESSAGES/*.mo", "locales/*/LC_MESSAGES/*.po"]
77
+ vmanager = ["*.css", "*.md", "locale/*.pot", "locale/*/LC_MESSAGES/*.mo", "locale/*/LC_MESSAGES/*.po"]
76
78
 
77
79
  [tool.black]
78
80
  line-length = 100
@@ -0,0 +1,5 @@
1
+ textual
2
+ libvirt-python==10.0.0
3
+ pyyaml
4
+ markdown-it-py
5
+ websockify
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = virtui-manager
3
- version = 1.3.0
3
+ version = 1.5.0
4
4
  description = Terminal-based interface to manage virtual machines using libvirt
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -51,6 +51,7 @@ console_scripts =
51
51
  virtui-manager = vmanager.wrapper:main
52
52
  virtui-manager-cmd = vmanager.wrapper:cmd_main
53
53
  virtui-remote-viewer = vmanager.wrapper:remote_viewer_main
54
+ virtui-gui = vmanager.gui_wrapper:main
54
55
 
55
56
  [options.extras_require]
56
57
  dev =
@@ -63,7 +64,7 @@ webconsole =
63
64
  websockify>=0.10.0
64
65
 
65
66
  [options.package_data]
66
- vmanager = *.css, *.md, locales/*.pot, locales/*/LC_MESSAGES/*.mo, locales/*/LC_MESSAGES/*.po
67
+ vmanager = *.css, *.md, locale/*.pot, locale/*/LC_MESSAGES/*.mo, locale/*/LC_MESSAGES/*.po
67
68
 
68
69
  [egg_info]
69
70
  tag_build =
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtui-manager
3
- Version: 1.3.0
3
+ Version: 1.5.0
4
4
  Summary: Terminal-based interface to manage virtual machines using libvirt
5
5
  Home-page: https://aginies.github.io/virtui-manager/
6
6
  Author: Antoine Ginies
@@ -17,6 +17,7 @@ src/vmanager/constants.py
17
17
  src/vmanager/dialog.css
18
18
  src/vmanager/events.py
19
19
  src/vmanager/firmware_manager.py
20
+ src/vmanager/gui_wrapper.py
20
21
  src/vmanager/i18n.py
21
22
  src/vmanager/libvirt_error_handler.py
22
23
  src/vmanager/libvirt_utils.py
@@ -40,11 +41,13 @@ src/vmanager/vmcard.py
40
41
  src/vmanager/vmcard_pool.py
41
42
  src/vmanager/webconsole_manager.py
42
43
  src/vmanager/wrapper.py
43
- src/vmanager/locales/virtui-manager.pot
44
- src/vmanager/locales/de/LC_MESSAGES/virtui-manager.po
45
- src/vmanager/locales/fr/LC_MESSAGES/virtui-manager.mo
46
- src/vmanager/locales/fr/LC_MESSAGES/virtui-manager.po
47
- src/vmanager/locales/it/LC_MESSAGES/virtui-manager.po
44
+ src/vmanager/locale/virtui-manager.pot
45
+ src/vmanager/locale/de/LC_MESSAGES/virtui-manager.mo
46
+ src/vmanager/locale/de/LC_MESSAGES/virtui-manager.po
47
+ src/vmanager/locale/fr/LC_MESSAGES/virtui-manager.mo
48
+ src/vmanager/locale/fr/LC_MESSAGES/virtui-manager.po
49
+ src/vmanager/locale/it/LC_MESSAGES/virtui-manager.mo
50
+ src/vmanager/locale/it/LC_MESSAGES/virtui-manager.po
48
51
  src/vmanager/modals/__init__.py
49
52
  src/vmanager/modals/base_modals.py
50
53
  src/vmanager/modals/bulk_modals.py
@@ -55,6 +58,7 @@ src/vmanager/modals/cpu_mem_pc_modals.py
55
58
  src/vmanager/modals/custom_migration_modal.py
56
59
  src/vmanager/modals/disk_pool_modals.py
57
60
  src/vmanager/modals/host_dashboard_modal.py
61
+ src/vmanager/modals/host_stats.py
58
62
  src/vmanager/modals/howto_disk_modal.py
59
63
  src/vmanager/modals/howto_network_modal.py
60
64
  src/vmanager/modals/howto_overlay_modal.py
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
+ virtui-gui = vmanager.gui_wrapper:main
2
3
  virtui-manager = vmanager.wrapper:main
3
4
  virtui-manager-cmd = vmanager.wrapper:cmd_main
4
5
  virtui-remote-viewer = vmanager.wrapper:remote_viewer_main
@@ -38,7 +38,7 @@ class AppInfo:
38
38
  """Define app data"""
39
39
  name = "virtui-manager"
40
40
  namecase = "VirtUI Manager"
41
- version = "1.3.0"
41
+ version = "1.5.0"
42
42
 
43
43
  class VmAction:
44
44
  """Defines constants for VM action types."""
@@ -63,6 +63,7 @@ class ButtonLabels:
63
63
  """Constants for button labels"""
64
64
  ADD = _("Add")
65
65
  SAVE = _("Save")
66
+ HIBERNATE_VM = _("Hibernate VM")
66
67
  SAVE_CHANGES = _("Save Changes")
67
68
  CREATE_NETWORK = _("Create Network")
68
69
  INSTALL = _("Install")
@@ -76,6 +77,7 @@ class ButtonLabels:
76
77
  RESUME = _("Resume")
77
78
  CONFIGURE = _("Configure")
78
79
  WEB_CONSOLE = _("Web Console")
80
+ TEXT_CONSOLE = _("Text Console")
79
81
  CONNECT = _("Connect")
80
82
  SNAPSHOT = _("Snapshot")
81
83
  RESTORE_SNAPSHOT = _("Restore Snapshot")
@@ -144,8 +146,8 @@ class ButtonLabels:
144
146
  BULK_CMD = _("[b][#FFD700]B[/][/]ulk CMD")
145
147
  PATTERN_SELECT = _("[b][#FFD700]P[/][/]attern Sel")
146
148
  CONFIG = _("Config")
147
- PREVIOUS_PAGE = _("Previous Page")
148
- NEXT_PAGE = _("Next Page")
149
+ PREVIOUS_PAGE = _("\\[Previous Page]")
150
+ NEXT_PAGE = _("\\[Next Page]")
149
151
  YES = _("Yes")
150
152
  NO = _("No")
151
153
  CANCEL = _("Cancel")
@@ -205,9 +207,7 @@ class TabTitles:
205
207
  """Constants for tab titles"""
206
208
  MANAGE = _("Manage")
207
209
  OTHER = _("Other")
208
- SNAPSHOT = _("Snapshot")
209
- SNAPSHOTS = _("Snapshots")
210
- OVERLAY = _("Overlay")
210
+ STATE_MANAGEMENT = _("State Management")
211
211
  SNAP_OVER_UPDATE = _("Updating Data...")
212
212
  ACTIVE_ALLOCATION = _("Active Allocation")
213
213
  TOTAL_ALLOCATION = _("Total Allocation")
@@ -406,6 +406,10 @@ class StaticText:
406
406
  TOPOLOGY = _("Topology:")
407
407
  WAITING_TO_START_COLLECTION = _("Waiting to start collection...")
408
408
  COLLECTING_VM_INFO = _("Collecting VM info: {current}/{total}")
409
+ EDIT_VIRTIOFS_MOUNT = _("Edit VirtIO-FS")
410
+ LATEST_SNAPSHOT = _("Latest Snapshot:")
411
+ NO_SNAPSHOTS_CREATED = _("No Snapshots created")
412
+ SELECT_OVERLAY_DISCARD = _("Select overlay disk to discard:")
409
413
 
410
414
  class SparklineLabels:
411
415
  """Constants for sparkline labels"""
@@ -684,11 +688,13 @@ class DialogMessages:
684
688
  CONFIRM_REMOVE_USB_DEVICE_TEMPLATE = _("Are you sure you want to remove USB device '{description}'?")
685
689
  CONFIRM_REMOVE_SCSI_CONTROLLER_TEMPLATE = _("Are you sure you want to remove SCSI controller '{model}' at index '{index}'?")
686
690
  CONFIRM_REMOVE_VIRTIOFS_TEMPLATE = _("Are you sure you want to remove VirtIO-FS mount '{target_path}'?")
691
+ CONFIRM_DISCARD_CHANGES = _("Are you sure you want to discard changes in '{target_disk}' and revert t o its backing file? This action cannot be undone.")
692
+ CONFIRM_MERGE_CHANGES = _("Are you sure you want to merge changes from '{target_disk}' into its backing file?")
687
693
 
688
694
 
689
695
  class QuickMessages:
690
696
  """Constants for quick messages"""
691
- REMOTE_VIEWER_SELECTED = _("The remove viewer {viewer} has been selected.")
697
+ REMOTE_VIEWER_SELECTED = _("The remote viewer {viewer} has been selected.")
692
698
  VM_DATA_LOADED = _("VM data loaded. Displaying VMs...")
693
699
  FILTER_RUNNING_VMS = _("Filter: Running VMs")
694
700
  FILTER_ALL_VMS = _("Filter: All VMs")
@@ -750,6 +756,7 @@ class SuccessMessages:
750
756
  NETWORK_UPDATED_TEMPLATE = _("Network {name} updated successfully.")
751
757
  VM_NAME_SANITIZED_TEMPLATE = _("VM name sanitized: '{original}' -> '{sanitized}'")
752
758
  VM_STARTED_TEMPLATE = _("VM '{vm_name}' started.")
759
+ VM_SAVED_TEMPLATE = _("VM '{vm_name}' saved (hibernated).")
753
760
  REMOTE_VIEWER_STARTED_TEMPLATE = _("Remote viewer {viewer} started for {vm_name}")
754
761
  VM_DEFINED_CONFIGURE_TEMPLATE = _("VM '{vm_name}' defined. Please configure and start it.")
755
762
  VM_CREATED_SUCCESSFULLY_TEMPLATE = _("VM '{vm_name}' created successfully!")
@@ -811,3 +818,4 @@ class ProgressMessages:
811
818
  CONNECTING_TO_SERVER = _("Connecting to [b]{uri}[/b]...")
812
819
  CONFIG_UPDATED_REFRESHING_VM_LIST = _("Configuration updated. Refreshing VM list...")
813
820
  LOADING_VM_DATA_FROM_REMOTE_SERVERS = _("Loading VM data from remote server(s)...")
821
+ COMMITTING_CHANGES_FOR = _("Committing changes for {name}...")
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env python3
2
+ import sys
3
+ import os
4
+ import gi
5
+
6
+ # Require GTK 3.0 and Vte 2.91
7
+ try:
8
+ gi.require_version('Gtk', '3.0')
9
+ gi.require_version('Vte', '2.91')
10
+ except ValueError as e:
11
+ print(f"Error: Missing required libraries. {e}")
12
+ sys.exit(1)
13
+
14
+ from gi.repository import Gtk, Vte, GLib, Pango
15
+
16
+ class VirtuiWrapper(Gtk.Window):
17
+ def __init__(self):
18
+ super().__init__(title="Virtui Manager Console")
19
+
20
+ self.set_default_size(1200, 1024)
21
+ self.terminal = Vte.Terminal()
22
+ self.terminal.set_size(92, 34)
23
+
24
+ font_desc = Pango.FontDescription("Monospace 12")
25
+ self.terminal.set_font(font_desc)
26
+
27
+ self.terminal.set_scrollback_lines(10000)
28
+
29
+ self.terminal.connect("child-exited", self.on_child_exited)
30
+
31
+ # Add terminal to a ScrolledWindow to handle scrolling
32
+ scrolled_window = Gtk.ScrolledWindow()
33
+ scrolled_window.set_hexpand(True)
34
+ scrolled_window.set_vexpand(True)
35
+ scrolled_window.add(self.terminal)
36
+
37
+ self.add(scrolled_window)
38
+
39
+ self.connect("destroy", Gtk.main_quit)
40
+ self.spawn_app()
41
+
42
+ def spawn_app(self):
43
+ # python3 -m vmanager.wrapper
44
+ cmd = [sys.executable, "-m", "vmanager.wrapper"]
45
+ env = os.environ.copy()
46
+
47
+ # Calculate src directory relative to this script
48
+ # This script is in src/vmanager/gui_wrapper.py
49
+ script_dir = os.path.dirname(os.path.realpath(__file__))
50
+ src_dir = os.path.dirname(script_dir)
51
+
52
+ current_pythonpath = env.get("PYTHONPATH", "")
53
+ if src_dir not in current_pythonpath:
54
+ env["PYTHONPATH"] = f"{src_dir}:{current_pythonpath}" if current_pythonpath else src_dir
55
+
56
+ # Convert env to list of strings "KEY=VALUE" for spawn_async
57
+ envv = [f"{k}={v}" for k, v in env.items()]
58
+
59
+ try:
60
+ # Vte.Terminal.spawn_async(pty_flags, working_directory, argv, envv, spawn_flags, child_setup, child_setup_data, timeout, cancellable, callback, user_data)
61
+ self.terminal.spawn_async(
62
+ Vte.PtyFlags.DEFAULT,
63
+ os.getcwd(), # Working directory
64
+ cmd, # Command arguments
65
+ envv, # Environment
66
+ GLib.SpawnFlags.DEFAULT,
67
+ None, # child_setup
68
+ None, # child_setup_data
69
+ -1, # timeout
70
+ None, # cancellable
71
+ None, # callback
72
+ None # user_data
73
+ )
74
+ except Exception as e:
75
+ error_msg = f"Error spawning application: {e}\n"
76
+ self.terminal.feed(error_msg.encode('utf-8'))
77
+ print(error_msg)
78
+
79
+ def on_child_exited(self, terminal, status):
80
+ print(f"Child exited with status: {status}")
81
+ Gtk.main_quit()
82
+
83
+ def main():
84
+ app = VirtuiWrapper()
85
+ app.show_all()
86
+ Gtk.main()
87
+
88
+ if __name__ == "__main__":
89
+ main()
@@ -3,9 +3,9 @@ import os
3
3
  import locale
4
4
  import logging
5
5
 
6
- # Setup path to locales
6
+ # Setup path to locale
7
7
  # This assumes the 'locales' directory is next to this file
8
- LOCALE_DIR = os.path.join(os.path.dirname(__file__), 'locales')
8
+ LOCALE_DIR = os.path.join(os.path.dirname(__file__), 'locale')
9
9
  DOMAIN = 'virtui-manager'
10
10
 
11
11
  _ = lambda s: s