You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

114 lines
3.8 KiB

-- The QuickScreenshot plugin:
--
-- Allows the user to save a region to disk as png image.
-- To be used so that users can save various diagrams, etc
-- to their directory of choice; useful when creating a lot
-- of diagrams for presentation.
--
-- TODO:
-- o Support for Windows and macOS is missing. To add support
-- you must edit the functions 'existsUtility' and 'go' to
-- use the right system programs.
--
-- Returns 'true' if the system utility exists;
-- returns 'false' otherwise. This is a dangerous function,
-- since the argument to popen is not sanitized.
-- The programmer must ensure that the argument to
-- existsUtility() is sanitized (not malicious).
function existsUtility(utility)
if operatingSystem == "Windows" then
-- Windows not supported yet.
elseif operatingSystem == "Darwin" then
-- macOS not supported yet.
else
local f = assert(io.popen("command -v " .. utility))
local s = assert(f:read('*a'))
f:close()
return s ~= ""
end
end
-- Return one of "Windows", "Linux", "Darwin", "FreeBSD",
-- "OpenBSD" or "NetBSD", etc.
function findOS()
if package.config:sub(1,1) == '\\' then
return "Windows"
else
local f = assert(io.popen("uname -s", 'r'))
local s = assert(f:read('*a'))
f:close()
return s
end
end
-- Register all Toolbar actions and intialize all UI stuff
function initUi()
ref = app.registerUi({["menu"] = "QuickScreenshot", ["callback"] = "go", ["accelerator"] = "<Shift><Alt>t"});
operatingSystem = findOS() -- What's the operating system?
end
-- This is the callback that gets executed when the user
-- activates the plugin via the menu or hotkey.
--
-- This function executes a screenshot utility to capture
-- the region the user selects. Then, it calls 'app.saveAs'
-- to create a "Save As" dialog for the user to choose the
-- filename where the image should reside.
function go()
local windowsUtilities = {} -- list of windows programs here
local macUtilities = {} -- list of macOS programs here
local elseUtilities = -- list of programs for other systems
{ "scrot --overwrite --select --silent "
-- gnome-screenshot behaves oddly (pollutes the window)
-- the line is added here to be indicative of what
-- adding another utility looks like.
--
-- , "gnome-screenshot --area --file="
}
-- Different operating systems have different
-- screenshot utilities, so we check the OS here
if operatingSystem == "Windows" then
app.msgbox("Windows not supported yet.", {[1] = "OK"})
elseif operatingSystem == "Darwin" then
app.msgbox("macOS not supported yet.", {[1] = "OK"})
else
-- This becomes true if at least one screenshot
-- utility is available on the system
local foundUtility = false
-- Check utility availability and use it
for i,command in ipairs(elseUtilities) do
utilityName = command:match("%S+")
if existsUtility(utilityName) then
local tmpFilename = os.tmpname() .. ".png"
-- The file extension is added in order to avoid the giblib error: no image grabbed
-- see https://stackoverflow.com/questions/26326664/scrot-giblib-error-saving-to-file-failed
local runCommand = assert(io.popen(command .. tmpFilename .. " &"))
runCommand:read('*all')
runCommand:close()
-- Launch the "Save As" dialog
local filename = app.saveAs("Untitled.png")
if not filename then
os.remove(tmpFilename)
return
end
local res, msg = app.glib_rename(tmpFilename, filename)
if not res then print(msg) end
foundUtility = true
break
end
end
-- No utility available on the system, inform the user
if not foundUtility then
print("Missing screenshot utility.")
print("Please install one of:")
for i,command in ipairs(elseUtilities) do
print(command:match("%S+"))
end
return
end
end
end