Add system features to system box

This commit is contained in:
Mathieu Comandon 2023-12-04 20:27:04 -08:00
parent eb8b3ff1af
commit 799a194908
10 changed files with 96 additions and 51 deletions

View file

@ -10,6 +10,14 @@ from lutris.gui.widgets.common import VBox
class BaseConfigBox(VBox):
settings_accelerators = {}
def __init__(self):
super().__init__(visible=True, spacing=12)
self.accelerators = None
self.set_margin_top(50)
self.set_margin_bottom(50)
self.set_margin_right(80)
self.set_margin_left(80)
def get_section_label(self, text: str) -> Gtk.Label:
label = Gtk.Label(visible=True)
label.set_markup("<b>%s</b>" % text)
@ -24,13 +32,14 @@ class BaseConfigBox(VBox):
label.set_alignment(0, 0.5)
return label
def __init__(self):
super().__init__(visible=True)
self.accelerators = None
self.set_margin_top(50)
self.set_margin_bottom(50)
self.set_margin_right(80)
self.set_margin_left(80)
def _get_framed_options_list_box(self, items):
frame = Gtk.Frame(visible=True, shadow_type=Gtk.ShadowType.ETCHED_IN)
list_box = Gtk.ListBox(visible=True, selection_mode=Gtk.SelectionMode.NONE)
frame.add(list_box)
for item in items:
list_box.add(Gtk.ListBoxRow(child=item, visible=True, activatable=False))
return frame
def get_setting_box(self, setting_key: str, label: str,
default: bool = False,

View file

@ -38,7 +38,7 @@ class PreferencesDialog(GameDialogCommon):
sidebar.add(self.get_sidebar_button("services-stack", _("Sources"), "application-x-addon-symbolic"))
sidebar.add(self.get_sidebar_button("accounts-stack", _("Accounts"), "system-users-symbolic"))
sidebar.add(self.get_sidebar_button("updates-stack", _("Updates"), "system-software-install-symbolic"))
sidebar.add(self.get_sidebar_button("sysinfo-stack", _("Hardware information"), "computer-symbolic"))
sidebar.add(self.get_sidebar_button("sysinfo-stack", _("System"), "computer-symbolic"))
sidebar.add(self.get_sidebar_button("system-stack", _("Global options"), "emblem-system-symbolic"))
hbox.pack_start(sidebar, False, False, 0)
self.stack = Gtk.Stack(visible=True)

View file

@ -2,29 +2,29 @@ from gettext import gettext as _
from gi.repository import Gdk, Gtk
from lutris.gui.config.base_config_box import BaseConfigBox
from lutris.gui.widgets.log_text_view import LogTextView
from lutris.util import linux, system
from lutris.util.graphics.vkquery import is_vulkan_supported
from lutris.util.linux import gather_system_info_str
from lutris.util.wine.wine import is_esync_limit_set, is_fsync_supported, is_installed_systemwide
class SystemBox(Gtk.Box):
settings_options = {
"hide_client_on_game_start": _("Minimize client when a game is launched"),
"hide_text_under_icons": _("Hide text under icons"),
"hide_badges_on_icons": _("Hide badges on icons"),
"show_tray_icon": _("Show Tray Icon"),
}
class SystemBox(BaseConfigBox):
def __init__(self):
super().__init__(
orientation=Gtk.Orientation.VERTICAL,
visible=True,
spacing=6,
margin_top=40,
margin_bottom=40,
margin_right=100,
margin_left=100)
super().__init__()
self._clipboard_buffer = None
self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
self.add(self.get_section_label(_("System features")))
feature_widgets = self.get_feature_widgets()
self.add(self._get_framed_options_list_box(feature_widgets))
sysinfo_label = Gtk.Label(halign=Gtk.Align.START, visible=True)
sysinfo_label.set_markup(_("<b>System information</b>"))
self.pack_start(sysinfo_label, False, False, 0)
sysinfo_frame = Gtk.Frame(visible=True)
scrolled_window = Gtk.ScrolledWindow(visible=True)
@ -34,16 +34,63 @@ class SystemBox(Gtk.Box):
self.sysinfo_view.set_cursor_visible(False)
scrolled_window.add(self.sysinfo_view)
sysinfo_frame.add(scrolled_window)
self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
self.pack_start(sysinfo_frame, True, True, 0)
button_copy = Gtk.Button(_("Copy to Clipboard"), halign=Gtk.Align.START, visible=True)
button_copy.connect("clicked", self._copy_text)
sysinfo_label = Gtk.Label(halign=Gtk.Align.START, visible=True)
sysinfo_label.set_markup(_("<b>System information</b>"))
self.pack_start(sysinfo_label, False, False, 0) # 60, 0)
self.pack_start(sysinfo_frame, True, True, 0) # 60, 24)
self.pack_start(button_copy, False, False, 0) # 60, 486)
self.pack_start(button_copy, False, False, 0)
def get_feature_widgets(self):
"""Return a list of labels related to this system's features"""
yes = _("YES")
no = _("NO")
labels = []
features = [
{
"label": _("Vulkan support:\t<b>%s</b>"),
"callable": is_vulkan_supported,
},
{
"label": _("Esync support:\t<b>%s</b>"),
"callable": is_esync_limit_set,
},
{
"label": _("Fsync support:\t<b>%s</b>"),
"callable": is_fsync_supported,
},
{
"label": _("Wine installed:\t<b>%s</b>"),
"callable": is_installed_systemwide,
},
{
"label": _("Gamescope:\t\t<b>%s</b>"),
"callable": system.can_find_executable,
"args": ("gamescope", )
},
{
"label": _("Mangohud:\t\t<b>%s</b>"),
"callable": system.can_find_executable,
"args": ("mangohud", )
},
{
"label": _("Gamemode:\t\t<b>%s</b>"),
"callable": linux.LINUX_SYSTEM.gamemode_available
},
{
"label": _("Steam:\t\t\t<b>%s</b>"),
"callable": linux.LINUX_SYSTEM.has_steam
},
{
"label": _("In Flatpak:\t\t\t<b>%s</b>"),
"callable": linux.LINUX_SYSTEM.is_flatpak
},
]
for feature in features:
label = Gtk.Label(visible=True, xalign=0)
label.set_markup(feature["label"] % (yes if feature["callable"](*feature.get("args", ())) else no))
labels.append(label)
return labels
def populate(self):
sysinfo_str = gather_system_info_str()
@ -52,5 +99,5 @@ class SystemBox(Gtk.Box):
text_buffer.set_text(sysinfo_str)
self._clipboard_buffer = sysinfo_str
def _copy_text(self, widget): # pylint: disable=unused-argument
def _copy_text(self, _widget):
self.clipboard.set_text(self._clipboard_buffer, -1)

View file

@ -116,15 +116,6 @@ class UpdatesBox(BaseConfigBox):
label.props.wrap = True
return radio_button
def _get_framed_options_list_box(self, items):
frame = Gtk.Frame(visible=True, shadow_type=Gtk.ShadowType.ETCHED_IN)
list_box = Gtk.ListBox(visible=True, selection_mode=Gtk.SelectionMode.NONE)
frame.add(list_box)
for item in items:
list_box.add(Gtk.ListBoxRow(child=item, visible=True, activatable=False))
return frame
def on_download_media_clicked(self, _widget):
self.update_media_box.show_running_markup(_("<i>Checking for missing media...</i>"))
AsyncCall(sync_media, self.on_media_updated)

View file

@ -114,7 +114,7 @@ class steam(Runner):
@property
def runnable_alone(self):
return not linux.LINUX_SYSTEM.is_flatpak
return not linux.LINUX_SYSTEM.is_flatpak()
@property
def appid(self):
@ -144,7 +144,7 @@ class steam(Runner):
return appmanifests[0]
def get_executable(self) -> str:
if linux.LINUX_SYSTEM.is_flatpak:
if linux.LINUX_SYSTEM.is_flatpak():
# Fallback to xgd-open for Steam URIs in Flatpak
return system.find_executable("xdg-open")
if self.runner_config.get("lsi_steam") and system.can_find_executable("lsi-steam"):
@ -221,7 +221,7 @@ class steam(Runner):
command = [binary_path]
else:
# Start through steam
if linux.LINUX_SYSTEM.is_flatpak:
if linux.LINUX_SYSTEM.is_flatpak():
if game_args:
steam_uri = "steam://run/%s//%s/" % (self.appid, game_args)
else:

View file

@ -253,7 +253,7 @@ class web(Runner):
if self.runner_config.get("user_agent"):
command.append("--user-agent")
command.append(self.runner_config.get("user_agent"))
if linux.LINUX_SYSTEM.is_flatpak:
if linux.LINUX_SYSTEM.is_flatpak():
command.append("--no-sandbox")
return {"command": command, "env": self.get_env(False)}

View file

@ -42,9 +42,9 @@ def get_services():
}
if BNET_ENABLED:
_services["battlenet"] = BattleNetService
if not LINUX_SYSTEM.is_flatpak:
if not LINUX_SYSTEM.is_flatpak():
_services["xdg"] = XDGService
if LINUX_SYSTEM.has_steam:
if LINUX_SYSTEM.has_steam():
_services["steam"] = SteamService
_services["steamwindows"] = SteamWindowsService
if system.path_exists(DOLPHIN_GAME_CACHE_FILE):

View file

@ -243,7 +243,7 @@ class VkPhysicalDeviceProperties(Structure):
@lru_cache(maxsize=None)
def is_vulkan_supported():
def is_vulkan_supported() -> bool:
"""
Returns True iff vulkan library can be loaded, initialized,
and reports at least one physical device available.

View file

@ -236,7 +236,6 @@ class LinuxSystem: # pylint: disable=too-many-public-methods
logger.exception("Unable to determine NVidia version: %s", ex)
return False
@property
def has_steam(self):
"""Return whether Steam is installed locally"""
return (
@ -250,7 +249,6 @@ class LinuxSystem: # pylint: disable=too-many-public-methods
"""Return the display server used"""
return os.environ.get("XDG_SESSION_TYPE", "unknown")
@property
def is_flatpak(self):
"""Check is we are running inside Flatpak sandbox"""
return system.path_exists("/.flatpak-info")

View file

@ -15,7 +15,7 @@ from lutris.util.log import logger
def get_lutris_executable():
if LINUX_SYSTEM.is_flatpak:
if LINUX_SYSTEM.is_flatpak():
return "flatpak run net.lutris.Lutris"
return "lutris"
@ -101,7 +101,7 @@ def create_launcher(game_slug, game_id, game_name, launch_config_name=None, desk
logger.debug("Creating Desktop icon in %s", launcher_path)
shutil.copy(tmp_launcher_path, launcher_path)
if menu:
user_dir = os.path.expanduser("~/.local/share") if LINUX_SYSTEM.is_flatpak else GLib.get_user_data_dir()
user_dir = os.path.expanduser("~/.local/share") if LINUX_SYSTEM.is_flatpak() else GLib.get_user_data_dir()
menu_path = os.path.join(user_dir, "applications")
os.makedirs(menu_path, exist_ok=True)
launcher_path = os.path.join(menu_path, launcher_filename)