1
0
mirror of https://github.com/bpozdena/OneDriveGUI.git synced 2026-10-24 04:59:17 +03:00

Autostart OneDriveGUI after login

This commit is contained in:
Boris Pozdena
2025-11-24 12:59:50 +01:00
parent 09a9bb3400
commit 31ace555d0
5 changed files with 246 additions and 3 deletions

View File

@@ -28,6 +28,9 @@ class GuiSettingsWindow(QWidget, Ui_gui_settings_window):
self.checkBox_start_minimized.setChecked(self.get_check_box_state("start_minimized"))
self.checkBox_start_minimized.stateChanged.connect(self.set_check_box_state)
self.checkBox_autostart_enabled.setChecked(self.get_check_box_state("autostart_enabled"))
self.checkBox_autostart_enabled.stateChanged.connect(self.handle_autostart_change)
self.lineEdit_client_bin_path.setText(gui_settings.get("client_bin_path"))
self.lineEdit_client_bin_path.textChanged.connect(self.set_client_bin_path)
self.pushButton_client_bin_path.clicked.connect(self.get_bin_path)
@@ -63,6 +66,9 @@ class GuiSettingsWindow(QWidget, Ui_gui_settings_window):
self.pushButton_save.clicked.connect(self.save_settings)
# Sync autostart file with saved setting on startup
self.sync_autostart_on_startup()
def get_bin_path(self):
self.file_dialog = QFileDialog()
self.file_dialog.setFileMode(QFileDialog.ExistingFile)
@@ -111,8 +117,68 @@ class GuiSettingsWindow(QWidget, Ui_gui_settings_window):
logging.info(f"[GUI][SETTINGS] {property} is unchecked")
gui_settings.set(property, "False")
def sync_autostart_on_startup(self):
"""Sync autostart file with saved setting on app startup."""
from utils.autostart import enable_autostart, disable_autostart, is_autostart_enabled
# Get the saved setting
autostart_should_be_enabled = self.get_check_box_state("autostart_enabled")
autostart_is_enabled = is_autostart_enabled()
# If they don't match, sync them
if autostart_should_be_enabled and not autostart_is_enabled:
logging.info("[GUI][SETTINGS] Autostart is enabled in settings but desktop file is missing - creating it")
success = enable_autostart()
if not success:
logging.error("[GUI][SETTINGS] Failed to create autostart file on startup")
elif not autostart_should_be_enabled and autostart_is_enabled:
logging.info("[GUI][SETTINGS] Autostart is disabled in settings but desktop file exists - removing it")
success = disable_autostart()
if not success:
logging.error("[GUI][SETTINGS] Failed to remove autostart file on startup")
else:
logging.info(f"[GUI][SETTINGS] Autostart file is in sync with settings (enabled: {autostart_should_be_enabled})")
def handle_autostart_change(self):
"""Handle autostart checkbox state change - only updates settings, doesn't create/delete files."""
if self.sender().isChecked():
logging.info("[GUI][SETTINGS] Autostart checkbox checked")
gui_settings.set("autostart_enabled", "True")
else:
logging.info("[GUI][SETTINGS] Autostart checkbox unchecked")
gui_settings.set("autostart_enabled", "False")
def save_settings(self):
"""Save all settings and sync autostart file with checkbox state."""
from utils.autostart import enable_autostart, disable_autostart
from PySide6.QtWidgets import QMessageBox
# Save all settings first
gui_settings.save()
# Now sync the autostart file with the saved setting
autostart_should_be_enabled = self.checkBox_autostart_enabled.isChecked()
if autostart_should_be_enabled:
logging.info("[GUI][SETTINGS] Creating autostart file")
success = enable_autostart()
if not success:
logging.error("[GUI][SETTINGS] Failed to create autostart file")
QMessageBox.warning(
self,
"Autostart Error",
"Settings saved, but failed to create autostart file. Please check the logs for details.",
)
else:
logging.info("[GUI][SETTINGS] Removing autostart file")
success = disable_autostart()
if not success:
logging.error("[GUI][SETTINGS] Failed to remove autostart file")
QMessageBox.warning(
self,
"Autostart Error",
"Settings saved, but failed to remove autostart file. Please check the logs for details.",
)
gui_settings_window = GuiSettingsWindow()

View File

@@ -17,6 +17,7 @@ class GuiSettings:
"debug_level": "DEBUG",
"client_bin_path": "onedrive",
"QWebEngine_login": "False",
"autostart_enabled": "False",
}
}

View File

@@ -44,6 +44,13 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBox_autostart_enabled">
<property name="text">
<string>Start OneDriveGUI automatically on login</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>

View File

@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'gui_settings_windowfuZzTA.ui'
## Form generated from reading UI file 'gui_settings_window.ui'
##
## Created by: Qt User Interface Compiler version 6.7.2
## Created by: Qt User Interface Compiler version 6.10.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
@@ -44,7 +44,12 @@ class Ui_gui_settings_window(object):
self.checkBox_start_minimized = QCheckBox(self.groupBox)
self.checkBox_start_minimized.setObjectName(u"checkBox_start_minimized")
self.formLayout.setWidget(0, QFormLayout.LabelRole, self.checkBox_start_minimized)
self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.checkBox_start_minimized)
self.checkBox_autostart_enabled = QCheckBox(self.groupBox)
self.checkBox_autostart_enabled.setObjectName(u"checkBox_autostart_enabled")
self.formLayout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.checkBox_autostart_enabled)
self.verticalLayout_3.addLayout(self.formLayout)
@@ -228,6 +233,7 @@ class Ui_gui_settings_window(object):
gui_settings_window.setWindowTitle(QCoreApplication.translate("gui_settings_window", u"OneDriveGUI - Settings", None))
self.groupBox.setTitle(QCoreApplication.translate("gui_settings_window", u"OneDriveGUI behaviour", None))
self.checkBox_start_minimized.setText(QCoreApplication.translate("gui_settings_window", u"Start OneDriveGUI minimized", None))
self.checkBox_autostart_enabled.setText(QCoreApplication.translate("gui_settings_window", u"Start OneDriveGUI automatically on login", None))
self.groupBox_4.setTitle(QCoreApplication.translate("gui_settings_window", u"OneDrive client options", None))
self.label_client_bin_path.setText(QCoreApplication.translate("gui_settings_window", u"Path to OneDrive client binary", None))
self.pushButton_client_bin_path.setText(QCoreApplication.translate("gui_settings_window", u"Browse", None))

163
src/utils/autostart.py Normal file
View File

@@ -0,0 +1,163 @@
"""
Autostart management for OneDriveGUI.
Handles creation and removal of XDG autostart desktop entries.
Supports both AppImage and source installations.
"""
import os
import logging
from pathlib import Path
def is_running_in_appimage() -> bool:
"""
Detect if running inside an AppImage.
Returns:
bool: True if running in AppImage, False otherwise
"""
return os.getenv("APPIMAGE") is not None
def get_executable_path() -> str:
"""
Get the absolute path to the executable.
For AppImage installations, returns the path to the AppImage file.
For source/system installations, returns 'OneDriveGUI' (assumes it's in PATH).
Returns:
str: Executable path or command
"""
appimage_path = os.getenv("APPIMAGE")
if appimage_path:
# Running in AppImage - use the AppImage path
# $APPIMAGE already resolves symlinks
return appimage_path
else:
# Running from source or system installation
# Use command name from PATH (works for AUR and other package managers)
return "OneDriveGUI"
def get_autostart_file_path() -> Path:
"""
Get the path to the autostart desktop file.
Returns:
Path: Path to ~/.config/autostart/OneDriveGUI.desktop
"""
config_dir = Path.home() / ".config" / "autostart"
return config_dir / "OneDriveGUI.desktop"
def is_autostart_enabled() -> bool:
"""
Check if autostart is currently enabled.
Returns:
bool: True if autostart desktop file exists and is not hidden
"""
autostart_file = get_autostart_file_path()
if not autostart_file.exists():
return False
# Check if the desktop file has Hidden=true
try:
with open(autostart_file, "r") as f:
content = f.read()
# If Hidden=true is present, autostart is disabled
if "Hidden=true" in content:
return False
return True
except Exception as e:
logging.error(f"Error checking autostart status: {e}")
return False
def enable_autostart() -> bool:
"""
Enable autostart by creating the desktop file.
Creates ~/.config/autostart/OneDriveGUI.desktop with the appropriate
executable path for either AppImage or source installation.
Returns:
bool: True if successful, False otherwise
"""
try:
autostart_file = get_autostart_file_path()
autostart_dir = autostart_file.parent
# Create autostart directory if it doesn't exist
autostart_dir.mkdir(parents=True, exist_ok=True)
# Get the correct executable path
exec_path = get_executable_path()
# Create desktop file content
desktop_content = f"""[Desktop Entry]
Type=Application
Version=1.0
Name=OneDriveGUI
Comment=A simple GUI for OneDrive Linux client
Exec={exec_path}
Icon=OneDriveGUI
Terminal=false
Categories=Network;Office;
StartupNotify=false
Hidden=false
"""
# Write the desktop file
with open(autostart_file, "w") as f:
f.write(desktop_content)
logging.info(f"Autostart enabled: {autostart_file}")
logging.info(f"Using executable: {exec_path}")
return True
except Exception as e:
logging.error(f"Failed to enable autostart: {e}")
return False
def disable_autostart() -> bool:
"""
Disable autostart by removing the desktop file.
Removes ~/.config/autostart/OneDriveGUI.desktop if it exists.
Returns:
bool: True if successful, False otherwise
"""
try:
autostart_file = get_autostart_file_path()
if autostart_file.exists():
autostart_file.unlink()
logging.info(f"Autostart disabled: {autostart_file}")
else:
logging.info("Autostart file does not exist, nothing to disable")
return True
except Exception as e:
logging.error(f"Failed to disable autostart: {e}")
return False
def get_autostart_info() -> dict:
"""
Get information about the current autostart configuration.
Returns:
dict: Information about autostart status and paths
"""
return {
"enabled": is_autostart_enabled(),
"desktop_file": str(get_autostart_file_path()),
"executable": get_executable_path(),
"is_appimage": is_running_in_appimage(),
}