diff --git a/ClipCascade_Desktop/src/cli/tray.py b/ClipCascade_Desktop/src/cli/tray.py index a282cfbe..fa004f12 100644 --- a/ClipCascade_Desktop/src/cli/tray.py +++ b/ClipCascade_Desktop/src/cli/tray.py @@ -121,7 +121,7 @@ def create_menu(self, item_: tuple = None): menu_items = [ "", # Menu Separator ("🗒️ Open Logs", self._open_logs), - ("📂 Program Files", self._open_program_location), + ("📂 Config Files", self._open_program_location), "", # Menu Separator ("🏠 Homepage", self._open_homepage), ("❓ Help", self._open_help), @@ -272,7 +272,10 @@ def open_location(self, path): subprocess.run(["xdg-open", path]) def _open_logs(self): - log_file_path = os.path.join(get_program_files_directory(), LOG_FILE_NAME) + if PLATFORM.startswith(LINUX): + log_file_path = os.path.join(get_user_cache_directory(), LOG_FILE_NAME) + else: + log_file_path = os.path.join(get_program_files_directory(), LOG_FILE_NAME) if os.path.exists(log_file_path): try: self.open_location(log_file_path) @@ -288,7 +291,10 @@ def _open_logs(self): def _open_program_location(self): try: - program_location = get_program_files_directory() + if PLATFORM.startswith(LINUX): + program_location = get_user_config_directory() + else: + program_location = get_program_files_directory() self.open_location(program_location) except Exception as e: CustomDialog( diff --git a/ClipCascade_Desktop/src/core/application.py b/ClipCascade_Desktop/src/core/application.py index b568168f..b48b9873 100644 --- a/ClipCascade_Desktop/src/core/application.py +++ b/ClipCascade_Desktop/src/core/application.py @@ -38,19 +38,32 @@ def __init__( mutex_identifier=MUTEX_NAME, ): try: - self.log_file_path = os.path.join( - get_program_files_directory(), log_file_path - ) - self.data_file_path = os.path.join( - get_program_files_directory(), data_file_path - ) + if PLATFORM.startswith(LINUX): + self.log_file_path = os.path.join( + get_user_cache_directory(), log_file_path + ) + self.data_file_path = os.path.join( + get_user_config_directory(), data_file_path + ) + else: + self.log_file_path = os.path.join( + get_program_files_directory(), log_file_path + ) + self.data_file_path = os.path.join( + get_program_files_directory(), data_file_path + ) self.mutex_identifier = mutex_identifier if PLATFORM == MACOS or PLATFORM.startswith(LINUX): - self.lock_file = None # File(lock) object - self.mutex_identifier = os.path.join( - get_program_files_directory(), self.mutex_identifier - ) + self.lock_file = None + if PLATFORM.startswith(LINUX): + self.mutex_identifier = os.path.join( + get_user_cache_directory(), self.mutex_identifier + ) + else: + self.mutex_identifier = os.path.join( + get_program_files_directory(), self.mutex_identifier + ) self.config = Config( file_name=self.data_file_path diff --git a/ClipCascade_Desktop/src/core/constants.py b/ClipCascade_Desktop/src/core/constants.py index 5551f5e7..75858ec4 100644 --- a/ClipCascade_Desktop/src/core/constants.py +++ b/ClipCascade_Desktop/src/core/constants.py @@ -159,3 +159,45 @@ def get_downloads_folder(): - Linux: /home//Downloads """ return os.path.join(get_user_home_directory(), "Downloads") + + +def _ensure_dir_exists(path): + if not os.path.exists(path): + os.makedirs(path) + return path + + +def get_xdg_data_home(): + return os.environ.get("XDG_DATA_HOME") or os.path.join( + get_user_home_directory(), ".local", "share" + ) + + +def get_xdg_config_home(): + return os.environ.get("XDG_CONFIG_HOME") or os.path.join( + get_user_home_directory(), ".config" + ) + + +def get_xdg_cache_home(): + return os.environ.get("XDG_CACHE_HOME") or os.path.join( + get_user_home_directory(), ".cache" + ) + + +def get_user_data_directory(): + if PLATFORM.startswith(LINUX): + return _ensure_dir_exists(os.path.join(get_xdg_data_home(), "clipcascade")) + return get_program_files_directory() + + +def get_user_config_directory(): + if PLATFORM.startswith(LINUX): + return _ensure_dir_exists(os.path.join(get_xdg_config_home(), "clipcascade")) + return get_program_files_directory() + + +def get_user_cache_directory(): + if PLATFORM.startswith(LINUX): + return _ensure_dir_exists(os.path.join(get_xdg_cache_home(), "clipcascade")) + return get_program_files_directory() diff --git a/ClipCascade_Desktop/src/gui/tray.py b/ClipCascade_Desktop/src/gui/tray.py index ccd43a7e..e90a678b 100644 --- a/ClipCascade_Desktop/src/gui/tray.py +++ b/ClipCascade_Desktop/src/gui/tray.py @@ -139,7 +139,7 @@ def create_menu(self, item_: tuple = None): menu_items = [ Menu.SEPARATOR, item("🗒️ Open Logs", self._open_logs), - item("📂 Program Files", self._open_program_location), + item("📂 Config Files", self._open_program_location), Menu.SEPARATOR, item("🏠 Homepage", self._open_homepage), item("❓ Help", self._open_help), @@ -290,7 +290,10 @@ def open_location(self, path): subprocess.run(["xdg-open", path]) def _open_logs(self, icon, item): - log_file_path = os.path.join(get_program_files_directory(), LOG_FILE_NAME) + if PLATFORM.startswith(LINUX): + log_file_path = os.path.join(get_user_cache_directory(), LOG_FILE_NAME) + else: + log_file_path = os.path.join(get_program_files_directory(), LOG_FILE_NAME) if os.path.exists(log_file_path): try: self.open_location(log_file_path) @@ -306,7 +309,10 @@ def _open_logs(self, icon, item): def _open_program_location(self, icon, item): try: - program_location = get_program_files_directory() + if PLATFORM.startswith(LINUX): + program_location = get_user_config_directory() + else: + program_location = get_program_files_directory() self.open_location(program_location) except Exception as e: CustomDialog( @@ -347,17 +353,22 @@ def _on_download(self, icon, item, files): logging.debug("No directory selected. Exiting.") return except RuntimeError as re: - target_directory = os.path.join( - get_program_files_directory(), "downloads" - ) + if PLATFORM.startswith(LINUX): + target_directory = os.path.join( + get_user_data_directory(), "downloads" + ) + else: + target_directory = os.path.join( + get_program_files_directory(), "downloads" + ) if not os.path.exists(target_directory): os.makedirs(target_directory) logging.error( f"A runtime error occurred while starting filedialog to select a directory. Error: {re}.\n" - + f"Setting the default location to the program directory '{target_directory}'." + + f"Setting the default location to '{target_directory}'." ) CustomDialog( - f"ClipCascade 📥: Saving files to the program directory '{target_directory}'.", + f"ClipCascade 📥: Saving files to '{target_directory}'.", msg_type="info", timeout=5000, ).mainloop()