init commit
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
import os
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from talon import Context, Module, actions, app, clip, cron, screen, settings, ui
|
||||
from talon.canvas import Canvas
|
||||
|
||||
mod = Module()
|
||||
|
||||
mod.tag("screenshot_disabled", desc="Activating this tag disables screenshot commands")
|
||||
|
||||
default_folder = ""
|
||||
if app.platform == "windows":
|
||||
default_folder = os.path.expanduser(os.path.join("~", r"OneDrive\\Pictures"))
|
||||
if not os.path.isdir(default_folder):
|
||||
default_folder = os.path.join("~", "Pictures")
|
||||
|
||||
mod.setting(
|
||||
"screenshot_folder",
|
||||
type=str,
|
||||
default=default_folder,
|
||||
desc="Where to save screenshots. Note this folder must exist.",
|
||||
)
|
||||
|
||||
|
||||
@mod.action_class
|
||||
class Actions:
|
||||
def screenshot(screen_number: Optional[int] = None):
|
||||
"""Takes a screenshot of the entire screen and saves it to the pictures folder.
|
||||
Optional screen number can be given to use screen other than main."""
|
||||
selected_screen = get_screen(screen_number)
|
||||
actions.user.screenshot_rect(selected_screen.rect)
|
||||
|
||||
def screenshot_window():
|
||||
"""Takes a screenshot of the active window and saves it to the pictures folder"""
|
||||
win = ui.active_window()
|
||||
actions.user.screenshot_rect(win.rect, title=win.app.name)
|
||||
|
||||
def screenshot_selection():
|
||||
"""Triggers an application that is capable of taking a screenshot of a portion of the screen"""
|
||||
|
||||
def screenshot_selection_clip():
|
||||
"""Triggers an application that is capable of taking a screenshot of a portion of the screen and adding to clipboard"""
|
||||
|
||||
def screenshot_settings():
|
||||
"""Opens the settings UI for screenshots.
|
||||
Only applies to Mac for now
|
||||
"""
|
||||
if app.platform == "mac":
|
||||
actions.key("cmd-shift-5")
|
||||
else:
|
||||
app.notify("Not supported on this operating system")
|
||||
|
||||
def screenshot_clipboard(screen_number: Optional[int] = None):
|
||||
"""Takes a screenshot of the entire screen and saves it to the clipboard.
|
||||
Optional screen number can be given to use screen other than main."""
|
||||
selected_screen = get_screen(screen_number)
|
||||
clipboard_rect(selected_screen.rect)
|
||||
|
||||
def screenshot_window_clipboard():
|
||||
"""Takes a screenshot of the active window and saves it to the clipboard"""
|
||||
win = ui.active_window()
|
||||
clipboard_rect(win.rect)
|
||||
|
||||
def screenshot_rect(
|
||||
rect: ui.Rect, title: str = "", screen_num: Optional[int] = None
|
||||
):
|
||||
"""Allow other modules this screenshot a rectangle"""
|
||||
selected_screen = get_screen(screen_num)
|
||||
flash_rect(rect)
|
||||
img = screen.capture_rect(rect)
|
||||
path = get_screenshot_path(title)
|
||||
img.write_file(path)
|
||||
|
||||
|
||||
def clipboard_rect(rect: ui.Rect):
|
||||
flash_rect(rect)
|
||||
img = screen.capture_rect(rect)
|
||||
clip.set_image(img)
|
||||
|
||||
|
||||
def get_screenshot_path(title: str = ""):
|
||||
if title:
|
||||
title = f" - {title.replace('.', '_')}"
|
||||
date = datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
|
||||
filename = f"Screenshot {date}{title}.png"
|
||||
folder_path = settings.get("user.screenshot_folder")
|
||||
path = os.path.expanduser(os.path.join(folder_path, filename))
|
||||
return os.path.normpath(path)
|
||||
|
||||
|
||||
def flash_rect(rect: ui.Rect):
|
||||
def on_draw(c):
|
||||
c.paint.style = c.paint.Style.FILL
|
||||
c.paint.color = "ffffff"
|
||||
c.draw_rect(rect)
|
||||
cron.after("150ms", canvas.close)
|
||||
|
||||
canvas = Canvas.from_rect(rect)
|
||||
canvas.register("draw", on_draw)
|
||||
canvas.freeze()
|
||||
|
||||
|
||||
def get_screen(screen_number: Optional[int] = None) -> ui.Screen:
|
||||
if screen_number is None:
|
||||
return screen.main_screen()
|
||||
return actions.user.screens_get_by_number(screen_number)
|
||||
|
||||
|
||||
ctx_mac = Context()
|
||||
ctx_mac.matches = r"""
|
||||
os: mac
|
||||
"""
|
||||
|
||||
|
||||
@ctx_mac.action_class("user")
|
||||
class UserActionsMac:
|
||||
def screenshot_selection():
|
||||
actions.key("cmd-shift-4")
|
||||
|
||||
def screenshot_selection_clip():
|
||||
actions.key("cmd-ctrl-shift-4")
|
||||
|
||||
|
||||
ctx_win = Context()
|
||||
ctx_win.matches = r"""
|
||||
os: windows
|
||||
"""
|
||||
|
||||
|
||||
@ctx_win.action_class("user")
|
||||
class UserActionsWin:
|
||||
def screenshot_selection():
|
||||
actions.key("super-shift-s")
|
||||
|
||||
def screenshot_selection_clip():
|
||||
actions.key("super-shift-s")
|
||||
|
||||
|
||||
ctx_linux = Context()
|
||||
ctx_linux.matches = r"""
|
||||
os: linux
|
||||
"""
|
||||
|
||||
|
||||
@ctx_linux.action_class("user")
|
||||
class UserActionsLinux:
|
||||
def screenshot_selection():
|
||||
actions.key("shift-printscr")
|
||||
@@ -0,0 +1,12 @@
|
||||
not tag: user.screenshot_disabled
|
||||
-
|
||||
|
||||
^grab screen$: user.screenshot()
|
||||
^grab screen <number_small>$: user.screenshot(number_small)
|
||||
^grab window$: user.screenshot_window()
|
||||
^grab selection$: user.screenshot_selection()
|
||||
^grab selection clip$: user.screenshot_selection_clip()
|
||||
^grab settings$: user.screenshot_settings()
|
||||
^grab screen clip$: user.screenshot_clipboard()
|
||||
^grab screen <number_small> clip$: user.screenshot_clipboard(number_small)
|
||||
^grab window clip$: user.screenshot_window_clipboard()
|
||||
Reference in New Issue
Block a user