dotfiles/script-resources/common_script_utils.py

81 lines
2.2 KiB
Python
Raw Normal View History

import sys
import os
import subprocess
def platform_not_supported_error():
raise Exception("platform '{}' is not supported!".format(sys.platform))
def run_chooser(choices, prompt=None, async_read=False):
if sys.platform == "darwin":
process_args = ["choose", "-i"]
elif os.name == "posix":
process_args = ["rofi", "-dmenu", "-i", "-format", "i"]
if prompt is not None:
process_args += ["-p", prompt]
if async_read:
process_args += ["-async-pre-read", "0"]
else:
platform_not_supported_error()
chooser_process = subprocess.Popen(
process_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE
)
with chooser_process.stdin as pipe:
for choice in choices:
assert "\n" not in choice
pipe.write(choice.encode())
pipe.write(b"\n")
exit_code = chooser_process.wait()
if exit_code != 0:
raise Exception("chooser process failed with exit code {}".format(exit_code))
chosen_index = int(
# an extra newline is inserted by rofi for whatever reason
chooser_process.stdout.read().rstrip(b"\n")
)
return chosen_index
def send_notification(title, message, url=None):
if sys.platform == "darwin":
process_args = [
"terminal-notifier",
"-title",
title,
"-message",
message,
"-open",
]
if url is not None:
process_args += [url]
elif os.name == "posix":
process_args = [
"notify-send",
"--icon=utilities-terminal",
"--expire-time=3000",
title,
message,
]
else:
platform_not_supported_error()
subprocess.run(process_args, check=True)
def set_clipboard(text):
# TODO: somehow merge program selection with the logic in `zsh/functions.zsh`
if sys.platform == "darwin":
process_args = ["pbcopy"]
elif os.name == "posix":
process_args = ["xsel", "--clipboard", "--input"]
# process_args = ["xclip", "-in", "-selection", "clipboard"]
else:
platform_not_supported_error()
subprocess.run(process_args, input=text.encode(), check=True)