User-contributed scripts are being moved over to this repository: https://github.com/OctopusET/sway-contribmaster
							parent
							
								
									eebbecc780
								
							
						
					
					
						commit
						bb91b7f5fa
					
				| @ -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<num>[0-9]+):?(?P<shortname>\w+)? ?(?P<icons>.+)?", 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() | ||||
| 
 | ||||
| @ -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 | ||||
| @ -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) | ||||
| @ -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) | ||||
| @ -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() | ||||
					Loading…
					
					
				
		Reference in new issue