Files
dotfiles/.config/i3/i3-workspacer.py
2020-02-15 15:04:47 +01:00

149 lines
5.5 KiB
Python
Executable File

#!/usr/bin/python
import i3ipc # Required for interactions with i3 and its IPC interface
import sys # Required for exiting
import math # Required for rounding
import argparse # Required for easy arguments to command
VERSION = (1, 0)
i3 = i3ipc.Connection()
def go_to_workspace(workspace_number):
if workspace_number <= 0:
workspace_number = 1
i3_command = 'workspace number %s' % (workspace_number)
print('i3 Command: %s' % i3_command)
i3.command(i3_command)
def move_to_workspace(workspace_number):
if workspace_number <= 0:
print('Not doing anything to a negative workspace')
return 1
i3_command = 'move container to workspace number %s' % (workspace_number)
print('i3 Command: %s' % i3_command)
i3.command(i3_command)
def rename_workspace(workspace_name):
i3_command = 'rename workspace to "%s"' % (workspace_name)
print('i3 Command: %s' % i3_command)
i3.command(i3_command)
def get_workspace_number_and_name(workspace_name):
try:
if ': ' in workspace_name:
workspace_number, workspace_name = workspace_name.split(': ')
else:
workspace_number = workspace_name
workspace_number = int(workspace_number)
except ValueError:
print("Unable to parse Workspace's number and name")
return (1, workspace_name)
return (workspace_number, workspace_name)
def make_workspace_name(workspace_number, workspace_name):
return ': '.join([str(workspace_number), workspace_name])
def get_workspace_block(workspace_number):
return int(math.floor((workspace_number-1)/10))*10
def shift_workspace_number(workspace_number, direction, number, exact):
if direction is not None:
if direction == 'up':
workspace_number += 10
elif direction == 'down':
workspace_number -= 10
elif direction == 'next':
workspace_number += 1
elif direction == 'prev':
workspace_number -= 1
elif number is not None:
if exact is True:
workspace_number = number
else:
workspace_block = get_workspace_block(workspace_number)
workspace_number_in_block = number
workspace_number = workspace_block + workspace_number_in_block
return workspace_number
def action_go(workspace_number, workspace_name, args):
workspace_number = shift_workspace_number(workspace_number, args.direction, args.number, args.exact)
go_to_workspace(workspace_number)
def action_move(workspace_number, workspace_name, args):
workspace_number = shift_workspace_number(workspace_number, args.direction, args.number, args.exact)
return move_to_workspace(workspace_number)
def action_rename(workspace_number, workspace_name, args):
if args.number is not None:
workspace_number = args.number
if args.name is not None:
workspace_name = args.name
rename_workspace(make_workspace_name(workspace_number, workspace_name))
def parse_args():
parser = argparse.ArgumentParser(description='simplifying large amounts of i3 workspaces')
parser.set_defaults(action=None)
parser.add_argument('--version', action='version', version="%(prog)s {}.{}".format(*VERSION))
subparsers = parser.add_subparsers(help='check help for each command for required arguments')
parser_go = subparsers.add_parser('go', help="like the 'workspace number' command")
parser_go.set_defaults(action=action_go)
parser_go.add_argument('--exact', action='store_true',
help="number arguments will be the actual workspace number instead of the index in the current block")
group_go = parser_go.add_mutually_exclusive_group(required=True)
group_go.add_argument('-d', '--direction', choices=['up', 'down', 'next', 'prev'],
help='operate relative to the current workspace; up/down = +/- 10')
group_go.add_argument('-n', '--number', type=int,
help='specify workspace number')
parser_move = subparsers.add_parser('move', help="like the 'move container to workspace number' command")
parser_move.set_defaults(action=action_move)
parser_move.add_argument('--exact', action='store_true',
help="number arguments will be the actual workspace number instead of the index in the current block")
group_move = parser_move.add_mutually_exclusive_group(required=True)
group_move.add_argument('-d', '--direction', choices=['up', 'down', 'next', 'prev'],
help='operate relative to the current workspace; up/down = +/- 10')
group_move.add_argument('-n', '--number', type=int,
help='specify workspace number')
parser_rename = subparsers.add_parser('rename', help="like the 'rename workspace to' command")
parser_rename.set_defaults(action=action_rename)
parser_rename.add_argument('-na', '--name',
help='change the name of the current workspace')
parser_rename.add_argument('-nu', '--number', type=int,
help='change the number of the current workspace')
args = parser.parse_args()
if args.action is None:
parser.print_help()
return
return args
def main():
args = parse_args()
workspace_name = i3.get_tree().find_focused().workspace().name
workspace_number, workspace_name = get_workspace_number_and_name(workspace_name)
sys.exit(args.action(workspace_number, workspace_name, args))
if __name__ == '__main__':
main()