Repository: archlinux/archinstall

Issue:
add polkit to packages since it won't launch without it
I believe polkit is required for sway to launch properly if using the sway profile. 


Discussion:
My only issue with adding this, is that it won't allow users to choose between `seatd` or `polkit` for the `seat`: https://wiki.archlinux.org/title/Sway#Starting

Do users care a lot or can we default to one of them without it being a touchy subject? :)
> My only issue with adding this, is that it won't allow users to choose between `seatd` or `polkit` for the `seat`: https://wiki.archlinux.org/title/Sway#Starting
> 
> 
> 
> Do users care a lot or can we default to one of them without it being a touchy subject? :)

Considering the general user base for Arch Linux, I'd say they care 😄 I know lots that use both. Perhaps having two profiles, sway-polkit and sway-seatd?
> Perhaps having two profiles, sway-polkit and sway-seatd?

Technically speaking that could work, but I think minimizing entries is still a desire for us. So we need a menu option in `_prep_function` that asks which one would be nice :)

Resolving patch:
diff --git a/archinstall/lib/user_interaction/general_conf.py b/archinstall/lib/user_interaction/general_conf.py
--- a/archinstall/lib/user_interaction/general_conf.py
+++ b/archinstall/lib/user_interaction/general_conf.py
@@ -174,7 +174,10 @@ def select_profile(preset) -> Optional[Profile]:
 			storage['profile_minimal'] = False
 			storage['_selected_servers'] = []
 			storage['_desktop_profile'] = None
+			storage['sway_sys_priv_ctrl'] = None
+			storage['arguments']['sway_sys_priv_ctrl'] = None
 			storage['arguments']['desktop-environment'] = None
+			storage['arguments']['gfx_driver'] = None
 			storage['arguments']['gfx_driver_packages'] = None
 			return None
 		case MenuSelectionType.Skip:
diff --git a/profiles/sway.py b/profiles/sway.py
--- a/profiles/sway.py
+++ b/profiles/sway.py
@@ -1,6 +1,12 @@
 # A desktop environment using "Sway"
+from typing import Any, TYPE_CHECKING
+
 import archinstall
 from archinstall import Menu
+from archinstall.lib.menu.menu import MenuSelectionType
+
+if TYPE_CHECKING:
+	_: Any
 
 is_top_level_profile = False
 
@@ -22,7 +28,7 @@ def _check_driver() -> bool:
 	packages = archinstall.storage.get("gfx_driver_packages", [])
 
 	if packages and "nvidia" in packages:
-		prompt = 'The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?'
+		prompt = _('The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?')
 		choice = Menu(prompt, Menu.yes_no(), default_option=Menu.no(), skip=False).run()
 
 		if choice.value == Menu.no():
@@ -30,6 +36,18 @@ def _check_driver() -> bool:
 
 	return True
 
+def _get_system_privelege_control_preference():
+	# need to activate seat service and add to seat group
+	title = str(_('Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)'))
+	title += str(_('\n\nChoose an option to give Sway access to your hardware'))
+	choice = Menu(title, ["polkit", "seatd"]).run()
+
+	if choice.type_ != MenuSelectionType.Selection:
+		return False
+
+	archinstall.storage['sway_sys_priv_ctrl'] = [choice.value]
+	archinstall.arguments['sway_sys_priv_ctrl'] = [choice.value]
+	return True
 
 def _prep_function(*args, **kwargs):
 	"""
@@ -38,6 +56,9 @@ def _prep_function(*args, **kwargs):
 	other code in this stage. So it's a safe way to ask the user
 	for more input before any other installer steps start.
 	"""
+	if not _get_system_privelege_control_preference():
+		return False
+
 	driver = archinstall.select_driver()
 
 	if driver:
@@ -49,15 +70,29 @@ def _prep_function(*args, **kwargs):
 	return False
 
 
+"""
+def _post_install(*args, **kwargs):
+	if "seatd" in sway_sys_priv_ctrl:
+		print(_('After booting, add user(s) to the `seat` user group and re-login to use Sway'))
+	return True
+"""
+
 # Ensures that this code only gets executed if executed
 # through importlib.util.spec_from_file_location("sway", "/somewhere/sway.py")
 # or through conventional import sway
 if __name__ == "sway":
 	if not _check_driver():
-		raise archinstall.lib.exceptions.HardwareIncompatibilityError("Sway does not support the proprietary nvidia drivers.")
+		raise archinstall.lib.exceptions.HardwareIncompatibilityError(_('Sway does not support the proprietary nvidia drivers.'))
 
 	# Install the Sway packages
 	archinstall.storage['installation_session'].add_additional_packages(__packages__)
+	if "seatd" in archinstall.storage['sway_sys_priv_ctrl']:
+		archinstall.storage['installation_session'].add_additional_packages(['seatd'])
+		archinstall.storage['installation_session'].enable_service('seatd')
+	elif "polkit" in archinstall.storage['sway_sys_priv_ctrl']:
+		archinstall.storage['installation_session'].add_additional_packages(['polkit'])
+	else:
+		raise archinstall.lib.exceptions.ProfileError(_('Sway requires either seatd or polkit to run'))
 
 	# Install the graphics driver packages
 	archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(archinstall.storage.get('gfx_driver_packages', None))}")


Test patch: