diff --git a/xsanecli.py b/xsanecli.py index 3587800..7710012 100755 --- a/xsanecli.py +++ b/xsanecli.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # GIMP 3.0 plug-in for scanning via XSane -# Copyright (C) 2024 Lee Yingtong Li (RunasSudo) +# Copyright (C) 2024-2025 Lee Yingtong Li (RunasSudo) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,6 +28,7 @@ import sys import tempfile DEVICE_NAME = None # e.g. DEVICE_NAME = 'escl:http://10.0.0.1:80' +SCAN_MULTIPLE = True def xsanecli_run(procedure, config, run_data, *args): # Get temporary directory @@ -38,26 +39,30 @@ def xsanecli_run(procedure, config, run_data, *args): args = ['xsane', '--save', '--no-mode-selection', '--force-filename', png_out, '--print-filenames'] + ([DEVICE_NAME] if DEVICE_NAME else []) proc = subprocess.Popen(args, stdout=subprocess.PIPE, encoding='utf-8') - # Wait until XSane prints the name of the scanned file, indicating scanning is finished - # This blocks Python but that is ok because GIMP UI is not affected - result = proc.stdout.readline().strip() + while True: + # Wait until XSane prints the name of the scanned file, indicating scanning is finished + # This blocks Python but that is ok because GIMP UI is not affected + result = proc.stdout.readline().strip() + + if result == '': + # XSane was closed + break + + if result != 'XSANE_IMAGE_FILENAME: ' + png_out: + Gimp.message('Unexpected XSane result') + return Gimp.ValueArray.new_from_values([GObject.Value(Gimp.PDBStatusType, Gimp.PDBStatusType.EXECUTION_ERROR)]) + + # Open image + image = Gimp.file_load(Gimp.RunMode.NONINTERACTIVE, Gio.File.new_for_path(png_out)) + Gimp.Display.new(image) + + # Remove temporary files + os.unlink(png_out) + + if not SCAN_MULTIPLE: + proc.terminate() + break - proc.terminate() - - if result == '': - # XSane was closed - return Gimp.ValueArray.new_from_values([GObject.Value(Gimp.PDBStatusType, Gimp.PDBStatusType.CANCEL)]) - - if result != 'XSANE_IMAGE_FILENAME: ' + png_out: - Gimp.message('Unexpected XSane result') - return Gimp.ValueArray.new_from_values([GObject.Value(Gimp.PDBStatusType, Gimp.PDBStatusType.EXECUTION_ERROR)]) - - # Open image - image = Gimp.file_load(Gimp.RunMode.NONINTERACTIVE, Gio.File.new_for_path(png_out)) - Gimp.Display.new(image) - - # Remove temporary files - os.unlink(png_out) os.rmdir(tempdir) return Gimp.ValueArray.new_from_values([GObject.Value(Gimp.PDBStatusType, Gimp.PDBStatusType.SUCCESS), GObject.Value(Gimp.Image.__gtype__, image)])