#!/bin/env keymap-i3

LOAD("local.km", only_if_exists=True)
LOAD_LIB("led-cmddef.km")

def workspace_slave_all(k, workspace):
    M(k.with_mod(SUPER), GOTO_WORKSPACE(slave=workspace))
    M(k.with_mod(SUPER|SHIFT), CONT_WORKSPACE(slave=workspace))
    M(k.with_mod(SUPER|CTRL), CONT_AND_GOTO_WORKSPACE(slave=workspace))
    M(k.with_mod(SUPER|CTRL|SHIFT), SWAP_WORKSPACE(slave=workspace))

def workspace_master_all(k, workspace):
    M(k.with_mod(SUPER), GOTO_WORKSPACE(master=workspace))
    M(k.with_mod(SUPER|SHIFT), CONT_WORKSPACE(master=workspace))
    M(k.with_mod(SUPER|CTRL), CONT_AND_GOTO_WORKSPACE(master=workspace))
    M(k.with_mod(SUPER|CTRL|SHIFT), SWAP_MASTER_WORKSPACE(master=workspace))

def m_up(mod, *arg, **kvarg):
    M(K_Up(mod), *arg, **kvarg)
    M(K_K(mod), *arg, **kvarg)
def m_left(mod, *arg, **kvarg):
    M(K_Left(mod), *arg, **kvarg)
    M(K_H(mod), *arg, **kvarg)
def m_right(mod, *arg, **kvarg):
    M(K_Right(mod), *arg, **kvarg)
    M(K_L(mod), *arg, **kvarg)
def m_down(mod, *arg, **kvarg):
    M(K_Down(mod), *arg, **kvarg)
    M(K_J(mod), *arg, **kvarg)


def app_workspace(key, workspace, cmd):
    M(key(SUPER), GOTO_WORKSPACE(workspace))
    M(key(SUPER|SHIFT), AND(GOTO_WORKSPACE(workspace), cmd, main=1))
    M(key(SUPER|CTRL), CONT_AND_GOTO_WORKSPACE(workspace))

################ On start run ################
EXEC_ON_STARTUP(CMD("xrdb ~/.Xresources"))
cmd_set_xkbmap = CMD("setxkbmap us,cz -variant ,ucw -option '' -option grp:caps_switch -option grp:switch -option compose:rctrl")
EXEC_ON_STARTUP(cmd_set_xkbmap)
EXEC_ON_STARTUP(CMD("sleep 2; osdd-run & sleep 1;osdc --color=red START"))
EXEC_ON_STARTUP(CMD("/usr/bin/gnome-keyring-deamon --start --components=secrets"))
EXEC_ON_STARTUP(CMD("numlockx on"))
EXEC_ON_STARTUP(TERMINAL(CMD("m-daemon")))

################ View option ################

I3_DIRECT("""
client.focused          #FF0000 #285577 #FFFFFF #FF0000   #FF0000
client.focused_inactive #000000 #000000 #FFFFFF #000000   #000000
client.unfocused        #000000 #000000 #888888 #000000   #000000
client.urgent           #2F343A #900000 #FFFFFF #900000   #900000
client.placeholder      #000000 #0C0C0C #FFFFFF #000000   #000000
client.background       #FFFFFF
for_window [class=".*"] border pixel 1
font pango:monospace 9
"""[1:-1])

I3_DIRECT("""
bar {
        status_command "~/bin/i3csstatus i3 -c .config/i3/i3csstatus.conf -i 2>~/.i3csstatus.log"
}
"""[1:-1])


################ Mouse ################
I3_DIRECT("floating_modifier Mod4")

################ PrintScreen ################
M(K_PrtSc,CMD("maim -suo | tee ~/screenshot.png | xclip -selection clipboard -t image/png"), propagate=100)
M(K_PrtSc(SHIFT),CMD("maim -uo | tee ~/screenshot.png | xclip -selection clipboard -t image/png"), propagate=100)
M(K_PrtSc(SUPER),CMD("maim -uo > ~/screenshot.png && gimp ~/screenshot.png"), propagate=100)

################ OSD ################
for k in [K_Not, K_BackSlash(SUPER)]:
	M(k,CMD('osdc --duration=1 --output=loglast ""'))
	M(k(SHIFT),CMD('osdc --cmd-now=skip --do-not-que= --output=no --duration=1 ""'))
	M(k(CTRL),CMD('osd-clock --output=display'))
	M(k(CTRL+SHIFT),TERMINAL(CMD('tail -n500 ~/.osdd_log;read')))

################ PLAYERCTL ################
M(K_X(SUPER+SHIFT), CMD("playerctl play-pause"))

################ PLAYERCTL ################
M(K_PlayPause, CMD("playerctl play-pause"))
M(K_PlayPause2, CMD("playerctl play-pause"))
M(K_PlayPause3, CMD("playerctl play-pause"))
M(K_Next, CMD("playerctl play-pause"))

with ADD_MODIFICATOR(SUPER):

    ################ Standard workspaces ################
    for i in range(13):
        workspace_slave_all(KEY(1, i), i)

    for i in range(1, 13):
        workspace_master_all(KEY(0, i), i)

    M(K("/"), WORKSPACE_GUI())
    M(K("."), MOVE_WORKSPACE("next"))
    M(K(","),            GOTO_WORKSPACE         (slave="alloc", notify=True))
    M(K(",", SHIFT),      GOTO_WORKSPACE         (master="alloc", notify=True))
    M(K(",", CTRL),       CONT_AND_GOTO_WORKSPACE(slave="alloc", notify=True))
    M(K(",", SHIFT|CTRL), CONT_AND_GOTO_WORKSPACE(master="alloc", notify=True))
    m_down (CTRL,       GOTO_WORKSPACE(master="next-skip", notify=True))
    m_up   (CTRL,       GOTO_WORKSPACE(master="next-skip", notify=True))
    m_left (CTRL,       GOTO_WORKSPACE(slave="prev-skip", notify=True))
    m_right(CTRL,       GOTO_WORKSPACE(slave="next-skip", notify=True))
    m_down (CTRL|SHIFT, GOTO_WORKSPACE(master="next", notify=True))
    m_up   (CTRL|SHIFT, GOTO_WORKSPACE(master="next", notify=True))
    m_left (CTRL|SHIFT, GOTO_WORKSPACE(slave="prev-limit", notify=True))
    m_right(CTRL|SHIFT, GOTO_WORKSPACE(slave="next-limit", notify=True))

    ################ WM Control  ################
    M(K_V, SPLIT_CONT("splitv"))
    M(K_G, SPLIT_CONT("splith"))
    M(K_T, SPLIT_CONT("tabbed"))

    M(K_E, LAYOUT_CONT("toggle split"))
    M(K_S, LAYOUT_CONT("stacking"))
    M(K_W, LAYOUT_CONT("tabbed"))

    directions = ["left", "right", "up", "down"]

    for d in directions:
        locals()[f'm_{d}'](MODIFICATOR_NONE, FOCUS_CONT(d))
        locals()[f'm_{d}'](SHIFT,            MOVE_CONT(d))


    with M(K_R, GO_MODE(STD_MODE("resize"))).action.mode:
        for d in directions:
            locals()[f'm_{d}'](0, RESIZE_CONT(d, 12))
            locals()[f'm_{d}'](SHIFT, RESIZE_CONT(d, 2))

    M(K_Space, FOCUS_CONT("floating"))
    M(K_A, FOCUS_CONT("parent"))
    M(K_A(SHIFT), FOCUS_CONT("child"))

    M(K_F,           CONT_TOGGLE("fullscreen"))
    M(K_Space(SHIFT), CONT_TOGGLE("floating"))
    M(K_Space(CTRL),  CONT_TOGGLE("sticky"))

    M(K_R(SHIFT), RESTART_MANAGER())
    M(K_R(CTRL|SHIFT), RESTART_MANAGER("v2"))
    M(K_E(SHIFT), EXIT_PROG())
    M(K_S(SHIFT), EXIT_SHUTDOWN())
    M(K_S(CTRL), EXIT_SUSPEND())
    M(K_R(CTRL), EXIT_RESTART())
    M(K_E(CTRL), EXIT_LOCK())

    M(K_P, CMD("~/.config/i3/i3-toggle-border"))

    M(K_Q, CMD("~/.config/i3/i3-kill"))
    M(K_Q(SHIFT), release_action=CMD("xkill"))
    M(K_Q(CTRL), release_action=CMD("killall xkill"))

    with M(K_ESC, GO_MODE(MODE("LOCK-MOD-ESC"))).action.mode:
        M(K_ESC(SUPER), GO_MODE(GET_MODE(-2)))
    with M(K_ESC(SHIFT), GO_MODE(MODE("LOCK-MOD-SHIFT-ESC"))).action.mode:
        M(K_ESC(SUPER|SHIFT), GO_MODE(GET_MODE(-2)))

    with M(K_X, GO_MODE(STD_MODE("System-modifikator"))).action.mode:
        M(KEY(2,1), LIGHT(raw=0))
        M(KEY(2,2), LIGHT(change=-0.9))
        M(KEY(2,3), LIGHT(change=-0.15))
        M(KEY(2,4), LIGHT(change=+0.15))
        M(KEY(2,5), LIGHT(change=+0.9))

        M(KEY(3,1), VOLUME(val=0))
        M(KEY(3,2), VOLUME(change=-0.1))
        M(KEY(3,3), VOLUME(change=-0.02))
        M(KEY(3,4), VOLUME(change=+0.02))
        M(KEY(3,5), VOLUME(change=+0.1))

        M(KEY(4,1), CMD('osdd-run & sleep 1;osdc --color=red RESTART'))
        M(KEY(4,1, SHIFT), CMD('osdc --color=red test --color=blue 123456789 --color=green 123456789123456789123456789123456789123456789123456789 --color=white 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789'))
        def bind_osd_enable(k, output):
            M(k, CMD(f'osdc --cmd-now=enable:{output} --color=red Enable {output}'))
            M(k(SHIFT), CMD(f'osdc --cmd-after=disable:{output} --color=red Disable {output}'))
        bind_osd_enable(KEY(4, 2), "led")
        bind_osd_enable(KEY(4, 3), "loglast")
        bind_osd_enable(KEY(4, 4), "display0")
        bind_osd_enable(KEY(4, 5), "display1")

        M(K_B, cmd_set_xkbmap)
        M(K_H, ROOT_MODE_AND(CMD("blueman-manager")))
        M(K_Y, ROOT_MODE_AND(CMD("alsamixer")))

        LOAD("xrandr.km", only_if_exists=True)



    ################ APPS ################
    # terminal
    M(K_Enter, TERMINAL(terminal_type=1))
    M(K_Not, TERMINAL(terminal_type=0))

    # app launcher
    M(K_D, CMD(ALTERNATIVES("rofi -show combi", "dmenu_run")))
    M(K_D(CTRL), CMD("xfce-appfinder"))
    M(K_D(SHIFT), CMD("dmenu_run"))

    # web
    M(K_C, CMD(ALTERNATIVES("chromium", "google-chrome", "firefox")))
    M(K_C(SHIFT), CMD(f"{ALTERNATIVES('chromium', 'google-chrome')} --incognito"))
    M(K_C(CTRL|SHIFT), CMD(f"{ALTERNATIVES('chromium', 'google-chrome')} --user-data-dir=$(mktemp -d)"))
    M(K_C(CTRL), CMD("firefox"))

    # Tea timer
    I3_DIRECT("""
    for_window [title="Tea Timer"] floating enable
    for_window [title="Tea Timer"] sticky enable
    """)
    M(K(";"), CMD("tt"))
    M(K(";")(SHIFT), CMD("tt 2:00"))
    M(K(";")(CTRL), CMD("tt 3:00"))
    M(K(";")(CTRL|SHIFT), CMD("tt 5:00"))

    # Mail
    I3_DIRECT('for_window [title="MAIL"] move container to workspace MAIL')
    app_workspace(K_M, "MAIL", TERMINAL(CMD("m-daemon")))

    # Zoom
    I3_DIRECT("""
    for_window [class="zoom"] move container to workspace ZOOM
    for_window [title="^zoom$" class="zoom"] floating enable
    for_window [title="Zoom - Free Account" class="zoom"] floating disable
    """)
    app_workspace(K_Z, "ZOOM", CMD("zoom"))

    # File browser
    M(K_N, CMD("nemo"))

    # Pasman
    def bind_pasman(key, getter):
        M(key, CMD(f"pasman-osd {getter} xall"))
        M(key(SHIFT), CMD(f"pasman-osd {getter} xuser"))
        M(key(CTRL), CMD(f"pasman-osd {getter} xpasswd"))

    bind_pasman(K_U, "rofi")
    bind_pasman(K_I, "clip")
    bind_pasman(K_O, "chrome")
    bind_pasman(K("["), "roficlip")
    bind_pasman(K("]"), "rofichrome")

    M(K_V(SHIFT), release_action=CMD('xdotool keyup super shift ctrl alt; xdotool type --clearmodifiers "$(date +%Y-%m-%d)"'))

    with M(K_T(SHIFT), GO_MODE(STD_MODE("TABLE-jug9/1"))).action.mode:
        table_all_keys("jug9", "1")
        
    with M(K_B, GO_MODE(STD_MODE("LED-jug9/1"))).action.mode:
        LOAD("led-jug9-1.km")
