diff --git a/contrib/autoname-workspaces.py b/contrib/autoname-workspaces.py deleted file mode 100755 index 3ec39928..00000000 --- a/contrib/autoname-workspaces.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/python - -# This script requires i3ipc-python package (install it from a system package manager -# or pip). -# It adds icons to the workspace name for each open window. -# Set your keybindings like this: set $workspace1 workspace number 1 -# Add your icons to WINDOW_ICONS. -# Based on https://github.com/maximbaz/dotfiles/blob/master/bin/i3-autoname-workspaces - -import argparse -import i3ipc -import logging -import re -import signal -import sys - -WINDOW_ICONS = { - "firefox": "", -} - -DEFAULT_ICON = "󰀏" - - -def icon_for_window(window): - name = None - if window.app_id is not None and len(window.app_id) > 0: - name = window.app_id.lower() - elif window.window_class is not None and len(window.window_class) > 0: - name = window.window_class.lower() - - if name in WINDOW_ICONS: - return WINDOW_ICONS[name] - - logging.info("No icon available for window with name: %s" % str(name)) - return DEFAULT_ICON - -def rename_workspaces(ipc): - for workspace in ipc.get_tree().workspaces(): - name_parts = parse_workspace_name(workspace.name) - icon_tuple = () - for w in workspace: - if w.app_id is not None or w.window_class is not None: - icon = icon_for_window(w) - if not ARGUMENTS.duplicates and icon in icon_tuple: - continue - icon_tuple += (icon,) - name_parts["icons"] = " ".join(icon_tuple) + " " - new_name = construct_workspace_name(name_parts) - ipc.command('rename workspace "%s" to "%s"' % (workspace.name, new_name)) - - -def undo_window_renaming(ipc): - for workspace in ipc.get_tree().workspaces(): - name_parts = parse_workspace_name(workspace.name) - name_parts["icons"] = None - new_name = construct_workspace_name(name_parts) - ipc.command('rename workspace "%s" to "%s"' % (workspace.name, new_name)) - ipc.main_quit() - sys.exit(0) - - -def parse_workspace_name(name): - return re.match( - "(?P[0-9]+):?(?P\w+)? ?(?P.+)?", name - ).groupdict() - - -def construct_workspace_name(parts): - new_name = str(parts["num"]) - if parts["shortname"] or parts["icons"]: - new_name += ":" - - if parts["shortname"]: - new_name += parts["shortname"] - - if parts["icons"]: - new_name += " " + parts["icons"] - - return new_name - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="This script automatically changes the workspace name in sway depending on your open applications." - ) - parser.add_argument( - "--duplicates", - "-d", - action="store_true", - help="Set it when you want an icon for each instance of the same application per workspace.", - ) - parser.add_argument( - "--logfile", - "-l", - type=str, - default="/tmp/sway-autoname-workspaces.log", - help="Path for the logfile.", - ) - args = parser.parse_args() - global ARGUMENTS - ARGUMENTS = args - - logging.basicConfig( - level=logging.INFO, - filename=ARGUMENTS.logfile, - filemode="w", - format="%(message)s", - ) - - ipc = i3ipc.Connection() - - for sig in [signal.SIGINT, signal.SIGTERM]: - signal.signal(sig, lambda signal, frame: undo_window_renaming(ipc)) - - def window_event_handler(ipc, e): - if e.change in ["new", "close", "move"]: - rename_workspaces(ipc) - - ipc.on("window", window_event_handler) - - rename_workspaces(ipc) - - ipc.main() - diff --git a/contrib/grimshot b/contrib/grimshot deleted file mode 100755 index 1ec19def..00000000 --- a/contrib/grimshot +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/sh - -## Grimshot: a helper for screenshots within sway -## Requirements: -## - `grim`: screenshot utility for wayland -## - `slurp`: to select an area -## - `swaymsg`: to read properties of current window -## - `wl-copy`: clipboard utility -## - `jq`: json utility to parse swaymsg output -## - `notify-send`: to show notifications -## Those are needed to be installed, if unsure, run `grimshot check` -## -## See `man 1 grimshot` or `grimshot usage` for further details. - -getTargetDirectory() { - test -f "${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs" && \ - . "${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs" - - echo "${XDG_SCREENSHOTS_DIR:-${XDG_PICTURES_DIR:-$HOME}}" -} - -NOTIFY=no -CURSOR= - -while [ $# -gt 0 ]; do - key="$1" - - case $key in - -n|--notify) - NOTIFY=yes - shift # past argument - ;; - -c|--cursor) - CURSOR=yes - shift # past argument - ;; - *) # unknown option - break # done with parsing --flags - ;; - esac -done - -ACTION=${1:-usage} -SUBJECT=${2:-screen} -FILE=${3:-$(getTargetDirectory)/$(date -Ins).png} - -if [ "$ACTION" != "save" ] && [ "$ACTION" != "copy" ] && [ "$ACTION" != "check" ]; then - echo "Usage:" - echo " grimshot [--notify] [--cursor] (copy|save) [active|screen|output|area|window] [FILE|-]" - echo " grimshot check" - echo " grimshot usage" - echo "" - echo "Commands:" - echo " copy: Copy the screenshot data into the clipboard." - echo " save: Save the screenshot to a regular file or '-' to pipe to STDOUT." - echo " check: Verify if required tools are installed and exit." - echo " usage: Show this message and exit." - echo "" - echo "Targets:" - echo " active: Currently active window." - echo " screen: All visible outputs." - echo " output: Currently active output." - echo " area: Manually select a region." - echo " window: Manually select a window." - exit -fi - -notify() { - notify-send -t 3000 -a grimshot "$@" -} -notifyOk() { - [ "$NOTIFY" = "no" ] && return - - TITLE=${2:-"Screenshot"} - MESSAGE=${1:-"OK"} - notify "$TITLE" "$MESSAGE" -} -notifyError() { - if [ $NOTIFY = "yes" ]; then - TITLE=${2:-"Screenshot"} - MESSAGE=${1:-"Error taking screenshot with grim"} - notify -u critical "$TITLE" "$MESSAGE" - else - echo "$1" - fi -} - -die() { - MSG=${1:-Bye} - notifyError "Error: $MSG" - exit 2 -} - -check() { - COMMAND=$1 - if command -v "$COMMAND" > /dev/null 2>&1; then - RESULT="OK" - else - RESULT="NOT FOUND" - fi - echo " $COMMAND: $RESULT" -} - -takeScreenshot() { - FILE=$1 - GEOM=$2 - OUTPUT=$3 - if [ -n "$OUTPUT" ]; then - grim ${CURSOR:+-c} -o "$OUTPUT" "$FILE" || die "Unable to invoke grim" - elif [ -z "$GEOM" ]; then - grim ${CURSOR:+-c} "$FILE" || die "Unable to invoke grim" - else - grim ${CURSOR:+-c} -g "$GEOM" "$FILE" || die "Unable to invoke grim" - fi -} - -if [ "$ACTION" = "check" ] ; then - echo "Checking if required tools are installed. If something is missing, install it to your system and make it available in PATH..." - check grim - check slurp - check swaymsg - check wl-copy - check jq - check notify-send - exit -elif [ "$SUBJECT" = "area" ] ; then - GEOM=$(slurp -d) - # Check if user exited slurp without selecting the area - if [ -z "$GEOM" ]; then - exit 1 - fi - WHAT="Area" -elif [ "$SUBJECT" = "active" ] ; then - FOCUSED=$(swaymsg -t get_tree | jq -r 'recurse(.nodes[]?, .floating_nodes[]?) | select(.focused)') - GEOM=$(echo "$FOCUSED" | jq -r '.rect | "\(.x),\(.y) \(.width)x\(.height)"') - APP_ID=$(echo "$FOCUSED" | jq -r '.app_id') - WHAT="$APP_ID window" -elif [ "$SUBJECT" = "screen" ] ; then - GEOM="" - WHAT="Screen" -elif [ "$SUBJECT" = "output" ] ; then - GEOM="" - OUTPUT=$(swaymsg -t get_outputs | jq -r '.[] | select(.focused)' | jq -r '.name') - WHAT="$OUTPUT" -elif [ "$SUBJECT" = "window" ] ; then - GEOM=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp) - # Check if user exited slurp without selecting the area - if [ -z "$GEOM" ]; then - exit 1 - fi - WHAT="Window" -else - die "Unknown subject to take a screen shot from" "$SUBJECT" -fi - -if [ "$ACTION" = "copy" ] ; then - takeScreenshot - "$GEOM" "$OUTPUT" | wl-copy --type image/png || die "Clipboard error" - notifyOk "$WHAT copied to buffer" -else - if takeScreenshot "$FILE" "$GEOM" "$OUTPUT"; then - TITLE="Screenshot of $SUBJECT" - MESSAGE=$(basename "$FILE") - notifyOk "$MESSAGE" "$TITLE" - echo "$FILE" - else - notifyError "Error taking screenshot with grim" - fi -fi diff --git a/contrib/grimshot.1 b/contrib/grimshot.1 deleted file mode 100644 index 2c4c6a95..00000000 --- a/contrib/grimshot.1 +++ /dev/null @@ -1,109 +0,0 @@ -.\" Generated by scdoc 1.11.2 -.\" Complete documentation for this program is not available as a GNU info page -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.nh -.ad l -.\" Begin generated content: -.TH "grimshot" "1" "2022-03-31" -.P -.SH NAME -.P -grimshot - a helper for screenshots within sway -.P -.SH SYNOPSIS -.P -\fBgrimshot\fR [--notify] [--cursor] (copy|save) [TARGET] [FILE] -.br -\fBgrimshot\fR check -.br -\fBgrimshot\fR usage -.P -.SH OPTIONS -.P -\fB--notify\fR -.RS 4 -Show notifications to the user that a screenshot has been taken.\& -.P -.RE -\fB--cursor\fR -.RS 4 -Include cursors in the screenshot.\& -.P -.RE -\fBsave\fR -.RS 4 -Save the screenshot into a regular file.\& Grimshot will write images -files to \fBXDG_SCREENSHOTS_DIR\fR if this is set (or defined -in \fBuser-dirs.\&dir\fR), or otherwise fall back to \fBXDG_PICTURES_DIR\fR.\& -Set FILE to '\&-'\& to pipe the output to STDOUT.\& -.P -.RE -\fBcopy\fR -.RS 4 -Copy the screenshot data (as image/png) into the clipboard.\& -.P -.RE -.SH DESCRIPTION -.P -Grimshot is an easy-to-use screenshot utility for sway.\& It provides a -convenient interface over grim, slurp and jq, and supports storing the -screenshot either directly to the clipboard using wl-copy or to a file.\& -.P -.SH EXAMPLES -.P -An example usage pattern is to add these bindings to your sway config: -.P -.nf -.RS 4 -# Screenshots: -# Super+P: Current window -# Super+Shift+p: Select area -# Super+Alt+p Current output -# Super+Ctrl+p Select a window - -bindsym Mod4+p exec grimshot save active -bindsym Mod4+Shift+p exec grimshot save area -bindsym Mod4+Mod1+p exec grimshot save output -bindsym Mod4+Ctrl+p exec grimshot save window -.fi -.RE -.P -.SH TARGETS -.P -grimshot can capture the following named targets: -.P -\fIactive\fR -.RS 4 -Captures the currently active window.\& -.P -.RE -\fIscreen\fR -.RS 4 -Captures the entire screen.\& This includes all visible outputs.\& -.P -.RE -\fIarea\fR -.RS 4 -Allows manually selecting a rectangular region, and captures that.\& -.P -.RE -\fIwindow\fR -.RS 4 -Allows manually selecting a single window (by clicking on it), and -captures it.\& -.P -.RE -\fIoutput\fR -.RS 4 -Captures the currently active output.\& -.P -.RE -.SH OUTPUT -.P -Grimshot will print the filename of the captured screenshot to stdout if called -with the \fIsave\fR subcommand.\& -.P -.SH SEE ALSO -.P -\fBgrim\fR(1) diff --git a/contrib/grimshot.1.scd b/contrib/grimshot.1.scd deleted file mode 100644 index e356f99d..00000000 --- a/contrib/grimshot.1.scd +++ /dev/null @@ -1,80 +0,0 @@ -grimshot(1) - -# NAME - -grimshot - a helper for screenshots within sway - -# SYNOPSIS - -*grimshot* [--notify] [--cursor] (copy|save) [TARGET] [FILE]++ -*grimshot* check++ -*grimshot* usage - -# OPTIONS - -*--notify* - Show notifications to the user that a screenshot has been taken. - -*--cursor* - Include cursors in the screenshot. - -*save* - Save the screenshot into a regular file. Grimshot will write image - files to *XDG_SCREENSHOTS_DIR* if this is set (or defined - in *user-dirs.dir*), or otherwise fall back to *XDG_PICTURES_DIR*. - Set FILE to '-' to pipe the output to STDOUT. - -*copy* - Copy the screenshot data (as image/png) into the clipboard. - -# DESCRIPTION - -Grimshot is an easy-to-use screenshot utility for sway. It provides a -convenient interface over grim, slurp and jq, and supports storing the -screenshot either directly to the clipboard using wl-copy or to a file. - -# EXAMPLES - -An example usage pattern is to add these bindings to your sway config: - -``` -# Screenshots: -# Super+P: Current window -# Super+Shift+p: Select area -# Super+Alt+p Current output -# Super+Ctrl+p Select a window - -bindsym Mod4+p exec grimshot save active -bindsym Mod4+Shift+p exec grimshot save area -bindsym Mod4+Mod1+p exec grimshot save output -bindsym Mod4+Ctrl+p exec grimshot save window -``` - -# TARGETS - -grimshot can capture the following named targets: - -_active_ - Captures the currently active window. - -_screen_ - Captures the entire screen. This includes all visible outputs. - -_area_ - Allows manually selecting a rectangular region, and captures that. - -_window_ - Allows manually selecting a single window (by clicking on it), and - captures it. - -_output_ - Captures the currently active output. - -# OUTPUT - -Grimshot will print the filename of the captured screenshot to stdout if called -with the _save_ subcommand. - -# SEE ALSO - -*grim*(1) diff --git a/contrib/inactive-windows-transparency.py b/contrib/inactive-windows-transparency.py deleted file mode 100755 index b81134dd..00000000 --- a/contrib/inactive-windows-transparency.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/python - -# This script requires i3ipc-python package (install it from a system package manager -# or pip). -# It makes inactive windows transparent. Use `transparency_val` variable to control -# transparency strength in range of 0…1 or use the command line argument -o. - -import argparse -import i3ipc -import signal -import sys -from functools import partial - -def on_window_focus(inactive_opacity, ipc, event): - global prev_focused - global prev_workspace - - focused_workspace = ipc.get_tree().find_focused() - - if focused_workspace == None: - return - - focused = event.container - workspace = focused_workspace.workspace().num - - if focused.id != prev_focused.id: # https://github.com/swaywm/sway/issues/2859 - focused.command("opacity 1") - if workspace == prev_workspace: - prev_focused.command("opacity " + inactive_opacity) - prev_focused = focused - prev_workspace = workspace - - -def remove_opacity(ipc): - for workspace in ipc.get_tree().workspaces(): - for w in workspace: - w.command("opacity 1") - ipc.main_quit() - sys.exit(0) - - -if __name__ == "__main__": - transparency_val = "0.80" - - parser = argparse.ArgumentParser( - description="This script allows you to set the transparency of unfocused windows in sway." - ) - parser.add_argument( - "--opacity", - "-o", - type=str, - default=transparency_val, - help="set opacity value in range 0...1", - ) - args = parser.parse_args() - - ipc = i3ipc.Connection() - prev_focused = None - prev_workspace = ipc.get_tree().find_focused().workspace().num - - for window in ipc.get_tree(): - if window.focused: - prev_focused = window - else: - window.command("opacity " + args.opacity) - for sig in [signal.SIGINT, signal.SIGTERM]: - signal.signal(sig, lambda signal, frame: remove_opacity(ipc)) - ipc.on("window::focus", partial(on_window_focus, args.opacity)) - ipc.main() \ No newline at end of file