@@ -390,6 +390,7 @@ pub async fn initialize_fig_dir(env: &fig_os_shim::Env) -> anyhow::Result<()> {
390390async fn run_linux_install ( ctx : Arc < Context > , settings : Arc < fig_settings:: Settings > , state : Arc < fig_settings:: State > ) {
391391 use dbus:: gnome_shell:: ShellExtensions ;
392392 use fig_settings:: State ;
393+ use fig_util:: system_info:: linux:: get_display_server;
393394
394395 // install binaries under home local bin
395396 if ctx. env ( ) . in_appimage ( ) {
@@ -402,6 +403,24 @@ async fn run_linux_install(ctx: Arc<Context>, settings: Arc<fig_settings::Settin
402403 } ) ;
403404 }
404405
406+ // Important we log an error if we cannot detect the display server in use.
407+ // If this isn't wayland or x11, the user will probably just see a blank screen.
408+ match get_display_server ( & ctx) {
409+ Ok ( _) => ( ) ,
410+ Err ( fig_util:: Error :: UnknownDisplayServer ( server) ) => {
411+ error ! (
412+ "Unknown value set for XDG_SESSION_TYPE: {}. This must be set to x11 or wayland." ,
413+ server
414+ ) ;
415+ } ,
416+ Err ( err) => {
417+ error ! (
418+ "Unknown error occurred when detecting the display server: {:?}. Is XDG_SESSION_TYPE set to x11 or wayland?" ,
419+ err
420+ ) ;
421+ } ,
422+ }
423+
405424 // GNOME Shell Extension
406425 {
407426 let ctx_clone = Arc :: clone ( & ctx) ;
@@ -457,8 +476,21 @@ where
457476 bundled_gnome_extension_version_path,
458477 bundled_gnome_extension_zip_path,
459478 } ;
479+ use fig_util:: system_info:: linux:: {
480+ DisplayServer ,
481+ get_display_server,
482+ } ;
460483 use tracing:: debug;
461484
485+ let display_server = get_display_server ( ctx) ?;
486+ if display_server != DisplayServer :: Wayland {
487+ debug ! (
488+ "Detected non-Wayland display server: `{:?}`. Not installing the extension." ,
489+ display_server
490+ ) ;
491+ return Ok ( ( ) ) ;
492+ }
493+
462494 if !state. get_bool_or ( "desktop.gnomeExtensionInstallationPermissionGranted" , false ) {
463495 debug ! ( "Permission is not granted to install GNOME extension, doing nothing." ) ;
464496 return Ok ( ( ) ) ;
@@ -961,6 +993,7 @@ echo "{binary_name} {version}"
961993 . await
962994 . unwrap ( )
963995 . with_env_var ( "APPIMAGE" , "1" )
996+ . with_env_var ( "XDG_SESSION_TYPE" , "wayland" )
964997 . with_os ( Os :: Linux )
965998 . with_running_processes ( & [ GNOME_SHELL_PROCESS_NAME ] )
966999 . build_fake ( ) ;
@@ -1017,6 +1050,38 @@ echo "{binary_name} {version}"
10171050 . unwrap ( ) ;
10181051 assert ! ( matches!( status, ExtensionInstallationStatus :: NotInstalled ) ) ;
10191052 }
1053+
1054+ #[ tokio:: test]
1055+ async fn test_extension_not_installed_if_not_wayland ( ) {
1056+ let ctx = Context :: builder ( )
1057+ . with_test_home ( )
1058+ . await
1059+ . unwrap ( )
1060+ . with_env_var ( "APPIMAGE" , "1" )
1061+ . with_os ( Os :: Linux )
1062+ . with_running_processes ( & [ GNOME_SHELL_PROCESS_NAME ] )
1063+ . build_fake ( ) ;
1064+ let shell_extensions = ShellExtensions :: new_fake ( Arc :: downgrade ( & ctx) ) ;
1065+ let extension_version = 1 ;
1066+ write_extension_bundle (
1067+ & ctx,
1068+ & shell_extensions. extension_uuid ( ) . await . unwrap ( ) ,
1069+ extension_version,
1070+ )
1071+ . await ;
1072+ let state = State :: from_slice ( & [ ( "desktop.gnomeExtensionInstallationPermissionGranted" , true . into ( ) ) ] ) ;
1073+
1074+ // When
1075+ install_gnome_shell_extension ( & ctx, & shell_extensions, & state)
1076+ . await
1077+ . unwrap ( ) ;
1078+
1079+ // Then
1080+ let status = get_extension_status ( & ctx, & shell_extensions, Some ( extension_version) )
1081+ . await
1082+ . unwrap ( ) ;
1083+ assert ! ( matches!( status, ExtensionInstallationStatus :: NotInstalled ) ) ;
1084+ }
10201085 }
10211086
10221087 #[ cfg( target_os = "linux" ) ]
0 commit comments