# SPDX-License-Identifier: GPL-3.0-or-later
import logging
import os
-import time
import signal
import sys
-import shutil
import tools.config
import tools.helpers.ipc
from tools import services
@dbus.service.method("id.waydro.SessionManager", in_signature='', out_signature='')
def Stop(self):
do_stop(self.args, self.looper)
- stop_container()
+ stop_container(quit_session=False)
def service(args, looper):
dbus_obj = DbusSessionManager(looper, dbus.SessionBus(), '/SessionManager', args)
looper.run()
-def start(args, unlocked_cb=None):
+def start(args, unlocked_cb=None, background=True):
try:
name = dbus.service.BusName("id.waydro.Session", dbus.SessionBus(), do_not_queue=True)
except dbus.exceptions.NameExistsException:
unlocked_cb()
return
- session = copy.copy(tools.config.session_defaults);
+ session = copy.copy(tools.config.session_defaults)
+
+ # TODO: also support WAYLAND_SOCKET?
wayland_display = session["wayland_display"]
if wayland_display == "None" or not wayland_display:
logging.warning('WAYLAND_DISPLAY is not set, defaulting to "wayland-0"')
+ wayland_display = session["wayland_display"] = "wayland-0"
+
+ if os.path.isabs(wayland_display):
+ wayland_socket_path = wayland_display
+ else:
+ xdg_runtime_dir = session["xdg_runtime_dir"]
+ if xdg_runtime_dir == "None" or not xdg_runtime_dir:
+ logging.error(f"XDG_RUNTIME_DIR is not set; please don't start a Waydroid session with 'sudo'!")
+ sys.exit(1)
+ wayland_socket_path = os.path.join(xdg_runtime_dir, wayland_display)
+ if not os.path.exists(wayland_socket_path):
+ logging.error(f"Wayland socket '{wayland_socket_path}' doesn't exist; are you running a Wayland compositor?")
+ sys.exit(1)
+
waydroid_data = session["waydroid_data"]
if not os.path.isdir(waydroid_data):
os.makedirs(waydroid_data)
+
dpi = tools.helpers.props.host_get(args, "ro.sf.lcd_density")
if dpi == "":
dpi = os.getenv("GRID_UNIT_PX")
dpi = "0"
session["lcd_density"] = dpi
+ session["background_start"] = "true" if background else "false"
+
mainloop = GLib.MainLoop()
def sigint_handler(data):
do_stop(args, mainloop)
- stop_container()
+ stop_container(quit_session=False)
def sigusr_handler(data):
do_stop(args, mainloop)
try:
tools.helpers.ipc.DBusContainerService().Start(session)
except dbus.DBusException as e:
+ logging.debug(e)
if e.get_dbus_name().startswith("org.freedesktop.DBus.Python"):
logging.error(e.get_dbus_message().splitlines()[-1])
else:
try:
tools.helpers.ipc.DBusSessionService().Stop()
except dbus.DBusException:
- stop_container()
+ stop_container(quit_session=True)
-def stop_container():
+def stop_container(quit_session):
try:
- tools.helpers.ipc.DBusContainerService().Stop()
+ tools.helpers.ipc.DBusContainerService().Stop(quit_session)
except dbus.DBusException:
pass