diff --git a/usr/share/snigdhaos-welcome/snigdhaos-welcome.py b/usr/share/snigdhaos-welcome/snigdhaos-welcome.py index fcedb0e..3a61758 100644 --- a/usr/share/snigdhaos-welcome/snigdhaos-welcome.py +++ b/usr/share/snigdhaos-welcome/snigdhaos-welcome.py @@ -12,8 +12,7 @@ from queue import Queue import ui.GUI as GUI from ui.MessageDialog import MessageDialogBootloader gi.require_version("Gtk", "3.0") -gi.require_version("Wnck", "3.0") -from gi.repository import Gtk, GdkPixbuf, GLib, Gdk, Wnck +from gi.repository import Gtk, GdkPixbuf, GLib, Gdk base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) REMOTE_SERVER = "www.google.com" @@ -372,17 +371,28 @@ class Main(Gtk.Window): def on_buttonarandr_clicked(self, widget): + """ + Handles the "Arandr" button click. Checks if Arandr is installed and installs it if needed, + then launches the application. + """ + # Command to launch Arandr app_cmd = ["/usr/bin/arandr"] + + # Command to install Arandr using pacman pacman_cmd = [ - "pkexec", - "pacman", - "-Sy", - "arandr", - "--noconfirm", - "--needed", + "pkexec", # Elevate privileges + "pacman", # Package manager command + "-Sy", # Synchronize package databases + "arandr", # Install the Arandr package + "--noconfirm", # Skip confirmation prompts + "--needed", # Install only if not already installed ] + + # Check if Arandr is installed if not self.check_package_installed("arandr"): + # If not installed, check for the pacman lockfile if not os.path.exists(self.pacman_lockfile): + # Display a warning dialog to inform the user md = Gtk.MessageDialog( parent=self, flags=0, @@ -391,56 +401,72 @@ class Main(Gtk.Window): text="%s was not found\n" % "arandr", title="Warning", ) + # Add "Yes" and "No" buttons for user interaction md.add_buttons("Yes", 1) md.add_buttons("No", 0) - md.format_secondary_markup("Let Snigdha OS - Welcome install it ?") + md.format_secondary_markup("Let Snigdha OS - Welcome install it?") + + # Capture user response response = md.run() md.destroy() - if response == 1: + + if response == 1: # User agrees to install Arandr + # Start the package queue checker in a separate thread threading.Thread( target=self.check_package_queue, daemon=True ).start() + + # Start the package installation in a separate thread threading.Thread( target=self.install_package, args=( - app_cmd, - pacman_cmd, - "arandr", + app_cmd, # Command to launch Arandr after installation + pacman_cmd, # Command to install Arandr + "arandr", # Package name ), daemon=True, ).start() else: + # If the pacman lockfile exists, display an error message print( - "[ERROR]: Pacman lockfile found %s, is another pacman process running ?" + "[ERROR]: Pacman lockfile found %s, is another pacman process running?" % self.pacman_lockfile ) + # Show a warning dialog to notify the user md = Gtk.MessageDialog( parent=self, flags=0, message_type=Gtk.MessageType.WARNING, buttons=Gtk.ButtonsType.OK, - text="Pacman lockfile found %s, is another pacman process running ?" + text="Pacman lockfile found %s, is another pacman process running?" % self.pacman_lockfile, title="Warning", ) md.run() md.destroy() else: + # If Arandr is already installed, launch it in a separate thread threading.Thread(target=self.run_app, args=(app_cmd,), daemon=True).start() + def remove_dev_package(self, pacman_cmd, package): + """ + Removes a specified development package using a given pacman command. + + Args: + pacman_cmd (list): Command to run pacman for removing the package. + package (str): Name of the package to be removed. + """ try: + # Notify the user that package removal has started self.label_notify.set_name("label_style") - GLib.idle_add( - self.label_notify.show, - ) + GLib.idle_add(self.label_notify.show) GLib.idle_add( self.label_notify.set_markup, - "Removing dev package %s" - % package, - ) - GLib.idle_add( - self.label_notify.hide, + "Removing dev package %s" % package, ) + GLib.idle_add(self.label_notify.hide) + + # Execute the pacman command as a subprocess with subprocess.Popen( pacman_cmd, stdout=subprocess.PIPE, @@ -449,48 +475,44 @@ class Main(Gtk.Window): universal_newlines=True, ) as process: while True: + # Check if the process has finished if process.poll() is not None: break + # Output each line of the subprocess's stdout for line in process.stdout: print(line.strip()) - if not self.check_package_installed(package): - print("[INFO]: Pacman %s uninstall completed" % package) - GLib.idle_add( - self.label_notify.show, - ) - self.label_notify.set_name("label_style") - GLib.idle_add( - self.label_notify.set_markup, - "Dev package %s removed" - % package, - ) - GLib.idle_add( - self.label_notify.hide, - ) - else: - print("[ERROR]: Pacman %s uninstall failed" % package) - self.label_notify.set_name("label_style") - GLib.idle_add( - self.label_notify.show, - ) - GLib.idle_add( - self.label_notify.set_markup, - "Failed to remove dev package %s" - % package, - ) + # Check if the package was successfully uninstalled + if not self.check_package_installed(package): + print("[INFO]: Pacman %s uninstall completed" % package) + # Notify the user of successful removal + GLib.idle_add(self.label_notify.show) + self.label_notify.set_name("label_style") + GLib.idle_add( + self.label_notify.set_markup, + "Dev package %s removed" % package, + ) + GLib.idle_add(self.label_notify.hide) + else: + # Notify the user of a failure to uninstall + print("[ERROR]: Pacman %s uninstall failed" % package) + self.label_notify.set_name("label_style") + GLib.idle_add(self.label_notify.show) + GLib.idle_add( + self.label_notify.set_markup, + "Failed to remove dev package %s" % package, + ) except Exception as e: + # Handle exceptions and notify the user print("[ERROR]: Exception in remove_dev_package(): %s" % e) self.label_notify.set_name("label_style") - GLib.idle_add( - self.label_notify.show, - ) + GLib.idle_add(self.label_notify.show) GLib.idle_add( self.label_notify.set_markup, - "Failed to remove dev package %s" - % package, + "Failed to remove dev package %s" % package, ) + def install_package(self, app_cmd, pacman_cmd, package): try: self.label_notify.set_name("label_style")