@@ -722,6 +722,8 @@ async def start_gui_for_vm(self, vm, monitor_layout=None):
722722 :param monitor_layout: monitor layout to send; if None, fetch it from
723723 local X server.
724724 """
725+ if getattr (vm , "is_preload" , False ) is True :
726+ return
725727 guid_cmd = self .common_guid_args (vm )
726728 guid_cmd .extend (["-d" , str (vm .xid )])
727729
@@ -748,6 +750,8 @@ async def start_gui_for_stubdomain(self, vm, force=False):
748750
749751 This function is a coroutine.
750752 """
753+ if getattr (vm , "is_preload" , False ) is True :
754+ return
751755 want_stubdom = force
752756 if not want_stubdom and vm .features .check_with_template (
753757 "gui-emulated" , False
@@ -779,6 +783,8 @@ async def start_audio_for_vm(self, vm):
779783
780784 :param vm: VM for which start AUDIO daemon
781785 """
786+ if getattr (vm , "is_preload" , False ) is True :
787+ return
782788 pacat_cmd = [PACAT_DAEMON_PATH , "-l" , self .pacat_domid (vm ), vm .name ]
783789 vm .log .info ("Starting AUDIO" )
784790
@@ -794,6 +800,8 @@ async def start_gui(self, vm, force_stubdom=False, monitor_layout=None):
794800 one for target AppVM is running.
795801 :param monitor_layout: monitor layout configuration
796802 """
803+ if getattr (vm , "is_preload" , False ) is True :
804+ return
797805 guivm = getattr (vm , "guivm" , None )
798806 if guivm != vm .app .local_name :
799807 vm .log .info ("GUI connected to {}. Skipping." .format (guivm ))
@@ -815,6 +823,8 @@ async def start_audio(self, vm):
815823
816824 :param vm: VM for which AUDIO daemon should be started
817825 """
826+ if getattr (vm , "is_preload" , False ) is True :
827+ return
818828 audiovm = getattr (vm , "audiovm" , None )
819829 if audiovm != vm .app .local_name :
820830 vm .log .info ("AUDIO connected to {}. Skipping." .format (audiovm ))
@@ -832,7 +842,7 @@ async def start_audio(self, vm):
832842 def on_domain_spawn (self , vm , _event , ** kwargs ):
833843 """Handler of 'domain-spawn' event, starts GUI daemon for stubdomain"""
834844
835- if not self .is_watched (vm ):
845+ if not self .is_watched (vm ) or getattr ( vm , "is_preload" , False ) is True :
836846 return
837847
838848 try :
@@ -857,7 +867,7 @@ def on_domain_start(self, vm, _event, **kwargs):
857867 """Handler of 'domain-start' event, starts GUI/AUDIO daemon for
858868 actual VM"""
859869
860- if not self .is_watched (vm ):
870+ if not self .is_watched (vm ) or getattr ( vm , "is_preload" , False ) is True :
861871 return
862872
863873 self .xid_cache [vm .name ] = vm .xid , vm .stubdom_xid
@@ -887,15 +897,17 @@ def on_domain_start(self, vm, _event, **kwargs):
887897 def on_connection_established (self , _subject , _event , ** _kwargs ):
888898 """Handler of 'connection-established' event, used to launch GUI/AUDIO
889899 daemon for domains started before this tool."""
890-
891900 monitor_layout = get_monitor_layout ()
892901 self .app .domains .clear_cache ()
893902 for vm in self .app .domains :
894903 try :
895904 if vm .klass == "AdminVM" :
896905 continue
897906
898- if not self .is_watched (vm ):
907+ if (
908+ not self .is_watched (vm )
909+ or getattr (vm , "is_preload" , False ) is True
910+ ):
899911 continue
900912
901913 power_state = vm .get_power_state ()
@@ -937,6 +949,28 @@ def on_domain_stopped(self, vm, _event, **_kwargs):
937949 self .cleanup_guid (stubdom_xid )
938950 self .cleanup_pacat_process (stubdom_xid )
939951
952+ def on_property_preload_set (self , vm , _event , ** _kwargs ):
953+ """Handler of 'property-reset:is_preload' event, used to launch
954+ GUI/AUDIO daemon after preload is marked as used."""
955+ if (
956+ not vm .klass == "DispVM"
957+ or not self .is_watched (vm )
958+ or getattr (vm , "is_preload" , False ) is True
959+ or not vm .is_running ()
960+ ):
961+ return
962+ monitor_layout = get_monitor_layout ()
963+ try :
964+ if "guivm" in self .enabled_services :
965+ asyncio .ensure_future (
966+ self .start_gui (vm , monitor_layout = monitor_layout )
967+ )
968+ if "audiovm" in self .enabled_services :
969+ asyncio .ensure_future (self .start_audio (vm ))
970+ self .xid_cache [vm .name ] = vm .xid , vm .stubdom_xid
971+ except qubesadmin .exc .QubesDaemonCommunicationError as e :
972+ vm .log .warning ("Failed to handle %s: %s" , vm .name , str (e ))
973+
940974 def on_property_audiovm_set (self , vm , event , ** kwargs ):
941975 """Handler for catching event related to dynamic AudioVM set/unset"""
942976 if vm .name not in self .xid_cache :
@@ -1013,6 +1047,9 @@ def register_events(self, events):
10131047 "connection-established" , self .on_connection_established
10141048 )
10151049 events .add_handler ("domain-stopped" , self .on_domain_stopped )
1050+ events .add_handler (
1051+ "property-reset:is_preload" , self .on_property_preload_set
1052+ )
10161053
10171054 for event in [
10181055 "property-set:audiovm" ,
0 commit comments