Skip to content

Commit

Permalink
Add mint-remove-flatpak.
Browse files Browse the repository at this point in the history
This was mintinstall-remove-app in the mintinstall package. We
only used it for removing flatpaks via mint-remove-application.

Since it uses only mintcommon code, it makes more sense for it to
live here.
  • Loading branch information
mtwebster committed Oct 23, 2024
1 parent 4c0cf8a commit e75b7e1
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 2 deletions.
4 changes: 2 additions & 2 deletions usr/bin/mint-remove-application
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ class MintRemoveWindow:
if not "flatpak" in desktopFile:
return False

if not os.path.exists('/usr/bin/mintinstall-remove-app'):
if not os.path.exists('/usr/bin/mint-remove-flatpak'):
return False

flatpak_remover = subprocess.Popen(['/usr/bin/mintinstall-remove-app', desktopFile])
flatpak_remover = subprocess.Popen(['/usr/bin/mint-remove-flatpak', desktopFile])
retcode = flatpak_remover.wait()

return retcode == 0
Expand Down
113 changes: 113 additions & 0 deletions usr/bin/mint-remove-flatpak
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#!/usr/bin/python3

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Gdk

import sys
import os
import gettext
import subprocess

from pathlib import Path
from mintcommon.installer import installer
from mintcommon.installer import dialogs
from mintcommon.installer.misc import check_ml

# i18n
gettext.install("mintinstall", "/usr/share/linuxmint/locale")

class AppUninstaller:
def __init__(self, desktopFile):
self.desktopFile = desktopFile

self.error = None
self.installer = installer.Installer().init(self.on_installer_ready)
self.progress_window = None
self.progress_bar = None
self.pkg_name = None

def on_installer_ready(self):
pkg_name = self.get_fp_name()

if pkg_name is None:
print("Package for '%s' not found" % self.desktopFile)
self.on_finished(None, 1)

self.pkginfo = self.installer.find_pkginfo(pkg_name)

if self.pkginfo and self.installer.pkginfo_is_installed(self.pkginfo):
self.installer.select_pkginfo(self.pkginfo,
self.on_installer_info_ready, None,
self.on_uninstall_complete, self.on_uninstall_progress, use_mainloop=True)
else:
print("Package '%s' is not installed" % pkg_name)
self.on_uninstall_complete(None)

def on_installer_info_ready(self, task):
self.task = task
if self.installer.confirm_task(task):
self.installer.execute_task(task)
else:
print("cancel task")
self.installer.cancel_task(task)

def on_uninstall_progress(self, pkginfo, progress, estimating, status_text=None):
if self.progress_window is None:
self.progress_window = Gtk.Dialog()
self.progress_window.set_default_size(400, -1)
self.progress_window.set_title(_("Removing"))
self.progress_window.connect("delete-event", self.dialog_delete_event)

box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, valign=Gtk.Align.CENTER)
self.progress_window.get_content_area().pack_start(box, True, True, 0)

self.pkg_name = Gtk.Label(max_width_chars=45, wrap=True)
box.pack_start(self.pkg_name, True, False, 6)
spinner = Gtk.Spinner(active=True)
spinner.set_size_request(36, 36)
box.pack_start(spinner, True, False, 0)
box.show_all()
self.pkg_name.set_label(pkginfo.get_display_name())

self.progress_window.run()

def dialog_delete_event(self, widget, event):
self.installer.cancel_task(self.task)

def on_installer_info_error(self, task):
pass

def get_fp_name(self):
path = Path(self.desktopFile)

if "flatpak" not in path.parts:
return None

return path.stem

def on_uninstall_complete(self, task):
if task.error_message:
print("Could not remove %s: %s" % (task.pkginfo.name, task.error_message))

if self.progress_window is not None:
# let the window be visible long enough to know what it's doing (uninstalls are fast)
Gdk.threads_add_timeout_seconds(GLib.PRIORITY_DEFAULT, 1, self.destroy_window, None)

Gtk.main_quit()

def destroy_window(self, data=None):
self.progress_window.destroy()
return False

if __name__ == "__main__":

# Exit if the given path does not exist
if len(sys.argv) < 2 or not os.path.exists(sys.argv[1]) or not sys.argv[1].endswith(".desktop"):
print("mint-remove-flatpak: Single argument required, the full path of a desktop file.")
sys.exit(1)

mainwin = AppUninstaller(sys.argv[1])
Gtk.main()

exit(1 if mainwin.error else 0)

0 comments on commit e75b7e1

Please sign in to comment.