diff --git a/kwm/.config/kwm/config.zon b/kwm/.config/kwm/config.zon new file mode 100644 index 0000000..ed3832d --- /dev/null +++ b/kwm/.config/kwm/config.zon @@ -0,0 +1,1400 @@ +.{ + // environment variables + // used by processes spawned by kwm + .env = .{ + // .{ "key", "value" }, + }, + + // working direction of processes spawned by kwm + .working_directory = .home, + + .startup_cmds = .{ + .{ "sh", "/home/wball/.config/kwm/init.sh" }, + }, + + // .none + // or + // .theme = .{ .name = []const u8, .size = u32 } + .xcursor_theme = .none, + + // solid color background + // note: set this to .none if you use other wallpaper program like `swaybg`, orelse it will be covered by this and unable to see + // .background = .{ .color = 0x33000000 }, + .background = .none, + + .bar = .{ + .show_default = true, + // .top + // .bottom + .position = .bottom, + .font = "Iosevka Nerd Font:size=15", + .color = .{ + .normal = .{ + .fg = 0xcdd6f4ff, + .bg = 0x1e1e2eff, + }, + .select = .{ + .fg = 0x1e1e2eff, + .bg = 0xcdd6f4ff, + }, + }, + .status = .stdin, + // .status = .{ .text = "^#ff0000ffk^#00ff00ffw^#0000ffffm" }, // .stdin or .{ .fifo = "fifo file path" }, could use ^#RGBA to switch text color, and use ^#! to switch back to default color + // bar clicked callback + // each part supports left/right/middle/side/extra/forward/back/task + // set .none to disable + .click = .{ + .tags = .{ + // could use 0 there because it will be replace with the tag clicked + .left = .{ .action = .{ .set_output_tag = .{ .tag = .{ .tag = 0 } } } }, + .right = .{ .action = .{ .toggle_output_tag = .{ .mask = 0 } } }, + .middle = .{ .action = .{ .toggle_window_tag = .{ .mask = 0 } } }, + }, + .layout = .{ + .left = .{ .action = .switch_to_previous_layout }, + }, + .mode = .{ + .left = .{ .action = .{ .switch_mode = .{ .mode = "default" } } }, + }, + .title = .{ + .left = .{ .action = .{ .zoom = .{ .swap = false } } }, + }, + .status = .{ + .middle = .{ .action = .{ .spawn = .{ .argv = .{"foot"} } } }, + }, + }, + }, + + .sloppy_focus = false, + + // .none + // .on_focus_changed: warp cursor to the center of window focused + // .on_output_changed: warp cursor to the center of output focused + .cursor_warp = .none, + + // if to remember last floating geometry + .remember_floating_geometry = false, + + .auto_swallow = true, + + // .top: stack top + // .bottom: stack bottom + // .stack_top: for tile and deck layout + // .above_focused + // .below_focused + .default_attach_mode = .{ + .tile = .top, + .grid = .top, + .monocle = .top, + .deck = .stack_top, + .scroller = .below_focused, + .float = .top, + }, + + // .csd + // .ssd + .default_window_decoration = .ssd, + + // window border + .border = .{ + .width = 3, + .color = .{ + .focus = 0xf5c2e7ff, + .unfocus = 0x586e75ff, + }, + }, + + // tags show on bar + .tags = .{ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, + + // .tile + // .grid + // .monocle + // .deck + // .scroller + // .float + .default_layout = .tile, + .layout = .{ + .tile = .{ + .nmaster = 1, + .mfact = 0.55, + .inner_gap = 12, + .outer_gap = 9, + + // .left + // .right + // .top + // .bottom + .master_location = .left, + }, + .grid = .{ + .outer_gap = 9, + .inner_gap = 12, + + // .horizontal + // .vertical + .direction = .horizontal, + }, + .monocle = .{ + .gap = 9, + }, + .deck = .{ + .inner_gap = 12, + .outer_gap = 9, + + // .left + // .right + // .top + // .bottom + .master_location = .left, + }, + .scroller = .{ + .mfact = 0.5, + .inner_gap = 16, + .outer_gap = 9, + }, + }, + + // layout tags show on bar + .layout_tag = .{ + .tile = .{ + .left = "[]=", + .right = "=[]", + .top = "[^]", + .bottom = "[_]", + }, + .grid = .{ + .horizontal = "|+|", + .vertical = "|||", + }, + .monocle = "[=]", + .deck = .{ + .left = "[D]=", + .right = "=[D]", + .top = "[D^]", + .bottom = "[D_]", + }, + .scroller = "[==]", + .float = "><>", + }, + + // key/pointer bindings + .bindings = .{ + // repeat info for key repeat event, different with the repeat_info of input device + .repeat_info = .{ + .rate = 50, + .delay = 300, + }, + + // mode tags show on bar + // display full mode string by default + .mode_tag = .{ + .{ "default", "" }, // hide mode tag in default mode + .{ "passthrough", "P" }, // only show "P" on bar in passthrough mode + .{ "floating", "F" }, // only show "F" on bar in floating mode + }, + + // list of key bindings + // full scheme: + // mode: string(< 16 bytes) + // "default" and "lock" are defined by default + // "default" is the default mode, if you not set `mode`, the binding will be seemed as "default" mode + // when the session locked, kwm will switch to "lock" mode + // you could define any other mode + // keysym: keysym string + // modifiers: + // a struct with fields: shift, ctrl, mod1, mod3, mod4, mod5, and all of these fields are `false` by default + // set modifiers to .{} means key binding without any modifier + // event: key binding trigger event + // there are two options: + // .event = .{ + // .repeat = action + // } + // after the key pressed, the action will repeatly trigger until key released or any another key pressed + // + // .event = .{ + // .click = .{ + // .pressed = null or action, default is null + // .released = null or action, default is null + // } + // } + // the corrosponding action will only trigger once when key pressed or released + // the pressed action and released action could define at the same time + .key = .{ + .{ + .keysym = "r", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .reload_config, + }, + }, + }, + + // passthrough + .{ + .keysym = "Escape", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_mode = .{ .mode = "passthrough" }, + }, + }, + }, + }, + .{ + .mode = "passthrough", + .keysym = "Escape", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_mode = .{ .mode = "default" }, + }, + }, + }, + }, + + // floating + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_mode = .{ .mode = "floating", .auto_quit = .once_unbound_pressed }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "l", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .horizontal = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "h", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .horizontal = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "j", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .vertical = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "k", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .vertical = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "l", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .horizontal = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "h", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .horizontal = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "j", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .vertical = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "k", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .vertical = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "l", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .right }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "h", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .left }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "j", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .bottom }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "k", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .top }, + }, + }, + }, + }, + + // default + .{ + .keysym = "q", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .quit = .{ .exit_session = true }, + }, + }, + }, + }, + .{ + .keysym = "c", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .close, + }, + }, + }, + .{ + .keysym = "c", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"/home/wball/.config/kwm/toggle_caffeine.sh"} }, + }, + }, + }, + }, + .{ + .keysym = "d", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "dunstctl", "close" } }, + }, + }, + }, + }, + .{ + .keysym = "Print", + .modifiers = .{ .mod4 = false }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "/home/wball/.config/kwm/screenshot.sh", "clip" } }, + }, + }, + }, + }, + .{ + .keysym = "Print", + .modifiers = .{ .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "/home/wball/.config/kwm/screenshot.sh", "menu" } }, + }, + }, + }, + }, + .{ + .keysym = "b", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "bluetoothctl", "connect", "88:C9:E8:D7:60:85" } }, + }, + }, + }, + }, + .{ + .keysym = "b", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "bluetoothctl", "disconnect", "88:C9:E8:D7:60:85" } }, + }, + }, + }, + }, + .{ + .keysym = "z", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"books.sh"} }, + }, + }, + }, + }, + .{ + .keysym = "y", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"papers.sh"} }, + }, + }, + }, + }, + .{ + .keysym = "e", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "emacsclient", "--create-frame", "--alternate-editor='emacs" } }, + }, + }, + }, + }, + .{ + .keysym = "p", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"/home/wball/.config/kwm/power_mode.sh"} }, + }, + }, + }, + }, + .{ + .keysym = "n", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "/home/wball/.config/kwm/pianobar.sh", "n" } }, + }, + }, + }, + }, + .{ + .keysym = "s", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"/home/wball/.config/pianobar/change_station.sh"} }, + }, + }, + }, + }, + .{ + .keysym = "p", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "/home/wball/.config/kwm/pianobar.sh", "p" } }, + }, + }, + }, + }, + .{ + .keysym = "c", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"/home/wball/.config/pianobar/display_info.sh"} }, + }, + }, + }, + }, + .{ + .keysym = "XF86AudioRaiseVolume", + .modifiers = .{ + .mod4 = false, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "audio", "sink", "--plus" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86AudioLowerVolume", + .modifiers = .{ + .mod4 = false, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "audio", "sink", "--minus" } }, + // .spawn = .{ .argv = .{ "/home/wball/.config/kwm/volume.sh", "down", "0.02" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86AudioRaiseVolume", + .modifiers = .{ + .shift = true, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "audio", "sink", "--plus10" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86AudioLowerVolume", + .modifiers = .{ + .shift = true, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "audio", "sink", "--minus10" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86AudioMute", + .modifiers = .{ + .ctrl = false, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "audio", "sink", "--mute" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86MonBrightnessUp", + .modifiers = .{ + .ctrl = false, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "bright", "--plus10" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86MonBrightnessDown", + .modifiers = .{ + .ctrl = false, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "bright", "--minus10" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86MonBrightnessUp", + .modifiers = .{ + .shift = true, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "bright", "--plus" } }, + }, + }, + }, + }, + .{ + .keysym = "XF86MonBrightnessDown", + .modifiers = .{ + .shift = true, + }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "bright", "--minus" } }, + }, + }, + }, + }, + .{ + .keysym = "Return", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"foot"} }, + }, + }, + }, + }, + .{ + .keysym = "h", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .focus_master_return, + }, + }, + }, + .{ + .keysym = "l", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .focus_master_return, + }, + }, + }, + .{ + .keysym = "b", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .toggle_bar, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .forward, .skip = .floating }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .reverse, .skip = .floating }, + }, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .swap = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .swap = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "period", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_output_iter = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "comma", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_output_iter = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "period", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .send_to_output = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "comma", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .send_to_output = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "m", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .toggle_fullscreen = .{ .in_window = true }, + }, + }, + }, + }, + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .toggle_fullscreen = .{ .in_window = false }, + }, + }, + }, + }, + .{ + .keysym = "space", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .switch_to_previous_layout, + }, + }, + }, + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .toggle_floating, + }, + }, + }, + .{ + .keysym = "s", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .toggle_sticky, + }, + }, + }, + .{ + .keysym = "a", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .toggle_swallow, + }, + }, + }, + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .float }, + }, + }, + }, + }, + .{ + .keysym = "t", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .tile }, + }, + }, + }, + }, + .{ + .keysym = "g", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .grid }, + }, + }, + }, + }, + .{ + .keysym = "d", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .deck }, + }, + }, + }, + }, + .{ + .keysym = "m", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .monocle }, + }, + }, + }, + }, + .{ + .keysym = "s", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .scroller }, + }, + }, + }, + }, + .{ + .keysym = "Tab", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .switch_to_previous_tag, + }, + }, + }, + .{ + .keysym = "apostrophe", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .set_output_tag = .{ .tag = .{ .occupied = .forward } }, + }, + }, + }, + }, + // .{ + // .keysym = "semicolon", + // .modifiers = .{ .mod4 = true }, + // .event = .{ + // .click = .{ + // .pressed = .{ + // .set_output_tag = .{ .tag = .{ .occupied = .reverse } }, + // }, + // }, + // }, + // }, + .{ + .keysym = "apostrophe", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .set_window_tag = .{ .tag = .{ .unoccupied = .forward } }, + }, + }, + }, + }, + // .{ + // .keysym = "semicolon", + // .modifiers = .{ .mod4 = true, .shift = true }, + // .event = .{ + // .click = .{ + // .pressed = .{ + // .set_window_tag = .{ .tag = .{ .unoccupied = .reverse } }, + // }, + // }, + // }, + // }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b1 } } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b10 } } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b100 } } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b1000 } } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b10000 } } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b100000 } } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b1000000 } } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b10000000 } } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b100000000 } } } } } }, + .{ .keysym = "0", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b111111111 } } } } } }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b1 } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b10 } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b100 } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b1000 } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b10000 } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b100000 } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b1000000 } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b10000000 } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b100000000 } } } } }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b1 } } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b10 } } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b100 } } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b1000 } } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b10000 } } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b100000 } } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b1000000 } } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b10000000 } } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b100000000 } } } } } }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b1 } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b10 } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b100 } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b1000 } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b10000 } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b100000 } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b1000000 } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b10000000 } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b100000000 } } } } }, + + .{ + .keysym = "l", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_mfact = .{ .step = 0.01 }, + }, + }, + }, + }, + .{ + .keysym = "h", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_mfact = .{ .step = -0.01 }, + }, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .bottom }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .top }, + }, + }, + }, + }, + .{ + .keysym = "l", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .right }, + }, + }, + }, + }, + .{ + .keysym = "h", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .left }, + }, + }, + }, + }, + .{ + .keysym = "equal", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_nmaster = .{ .change = .increase }, + }, + }, + }, + }, + .{ + .keysym = "minus", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_nmaster = .{ .change = .decrease }, + }, + }, + }, + }, + .{ + .keysym = "equal", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_gap = .{ .step = 1 }, + }, + }, + }, + }, + .{ + .keysym = "minus", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_gap = .{ .step = -1 }, + }, + }, + }, + }, + .{ + .keysym = "a", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .toggle_auto_swallow, + }, + }, + }, + .{ + .keysym = "g", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .toggle_grid_direction, + }, + }, + }, + .{ + .keysym = "BracketRight", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn_shell = .{ .cmd = "librewolf" }, + }, + }, + }, + }, + .{ + .keysym = "semicolon", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn_shell = .{ .cmd = "bemenu-run" }, + }, + }, + }, + }, + .{ + .keysym = "Return", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{"footclient"} }, + }, + }, + }, + }, + }, + + // list of pointer bindings + // full scheme: + // mode: same as key binding + // button: pointer button + // .left + // .right + // .middle + // modifiers: same as key binding + // event: pointer binding trigger event + // .event = .{ + // .pressed = null or action, default is null + // .released = null or action, default is null + // } + // the corrosponding action will only trigger once when pointer button pressed or released + // the pressed action and released action could define at the same time + .pointer = .{ + .{ + .mode = "default", + .button = .left, + .modifiers = .{ .mod4 = true }, + .event = .{ .pressed = .pointer_move }, + }, + .{ + .mode = "default", + .button = .right, + .modifiers = .{ .mod4 = true }, + .event = .{ .pressed = .pointer_resize }, + }, + }, + // other unmentioned actions: + // group: run multiple actions in sequence + // .event = .{ + // .click = .{ + // .pressed = .{ + // .group = .{ + // .actions = .{ + // action1, + // action2, + // ... + // }, + // }, + // }, + // }, + // } + }, + + // rule part + // + // a rule pattern has fields below: + // str: pattern string, required + // regex: bool, if enable regex + // match_null: bool, if match null + // + // only the first rule matched will be applied + + // window rules + // full scheme: + // app_id: rule pattern + // title: rule pattern + // + // tag: window tag + // output: output name pattern, same as rule pattern + // floating: bool, if floating + // dimension: .{ .width = i32, .height = i32 }, initial dimension + // decoration: .csd or .ssd, window decoration + // is_terminal: bool, if set true, means the window could be swallowed + // disable_swallow: bool, if set true, the window could not swallow any other windows + // scroller_mfact: f32, initial mfact of the window for scroller layout + // attach_mode: like `default_attach_mode`, change attach_mode for window matched + .window_rules = .{ + .{ .app_id = .{ .str = "", .match_null = true }, .floating = true }, + .{ .app_id = .{ .str = "zenity" }, .floating = true }, + .{ .app_id = .{ .str = "DesktopEditors" }, .floating = true }, + .{ .app_id = .{ .str = "xdg-desktop-portal-gtk" }, .floating = true }, + .{ .app_id = .{ .str = "chromium" }, .tag = 0b10, .scroller_mfact = 0.9 }, + .{ .app_id = .{ .str = "foot" }, .is_terminal = true, .scroller_mfact = 0.8 }, + }, + + // output rules + // full scheme: + // name: rule pattern + // + // presentation_mode: presentation mode, .vsync or .async + // layout: same as `layout` before but you only need to specify the values you want to change + // default_layout: same as `default_layout` before + .output_rules = .{ + // + }, + + // input device rules + // full scheme: + // name: rule pattern + // + // repeat_info: .{ .rate = i32, .delay = i32 } + // scroll_factor: f64 + .input_device_rules = .{ + .{ .repeat_info = .{ .rate = 50, .delay = 300 } }, + }, + + // libinput device rules + // full scheme: + // name: rule pattern + // + // send_events_modes: + // .enabled + // .disabled + // .disabled_on_external_mouse + // tap: .enabled or .disabled + // drag: .enabled or .disabled + // drag_lock: .enabled or .disabled + // tap_button_map: .lrm or .lmr + // three_finger_drag: + // .disabled + // .enabled_3fg + // .enabled_4fg + // calibration_matrix: [6]f32 + // accel_profile: + // .none + // .flat + // .adaptive + // .custom + // accel_speed: f32 + // natural_scroll: .enabled or .disabled + // left_handed: .enabled or .disabled + // click_method: + // .none + // .button_areas + // .clickfinger + // clickfinger_button_map: .lrm or .lmr + // middle_button_emulation: .enabled or .disabled + // scroll_method: + // .no_scroll + // .two_finger + // .edge + // .on_button_down + // scroll_button: + // .left + // .right + // .middle + // scroll_button_lock: .enabled or .disabled + // disable_while_typing: .enabled or .disabled + // disable_while_trackpointing: .enabled or .disabled + // rotation_angle: u32 + .libinput_device_rules = .{ .{ .name = .{ .str = ".*[tT]ouchpad", .regex = true }, .tap = .enabled, .drag = .enabled, .natural_scroll = .enabled }, .{ .tap = .enabled, .drag = .enabled } }, + + // xkb_keyboard rules + // full scheme: + // name: rule pattern + // + // numlock: .enabled or .disabled + // capslock: .enabled or .disabled + // layout: + // layout index: .{ .index = u32 } + // or + // layout name: .{ .name = "layout name" } + // keymap: + // .{ .file = .{ .path = "keymap file path", .format = .text_v1 or .text_v2 } } + // or + // .{ + // .options = .{ + // .rules = ?[]const u8, + // .model = ?[]const u8, + // .layout = ?[]const u8, + // .variant = ?[]const u8, + // .options = ?[]const u8, + // } + // } + .xkb_keyboard_rules = .{ + .{ + .keymap = .{ + .options = .{ + .layout = "us", + .variant = "colemak_dh", + }, + }, + }, + }, +} diff --git a/kwm/.config/kwm/config.zon.def b/kwm/.config/kwm/config.zon.def new file mode 100644 index 0000000..a050a16 --- /dev/null +++ b/kwm/.config/kwm/config.zon.def @@ -0,0 +1,1112 @@ +.{ + // environment variables + // used by processes spawned by kwm + .env = .{ + // .{ "key", "value" }, + }, + + // working direction of processes spawned by kwm + .working_directory = .home, + + .startup_cmds = .{ + // .{ "swaybg", "-i", "/path/to/wallpaper" }, + }, + + // .none + // or + // .theme = .{ .name = []const u8, .size = u32 } + .xcursor_theme = .none, + + // solid color background + // note: set this to .none if you use other wallpaper program like `swaybg`, orelse it will be covered by this and unable to see + .background = .{ .color = 0x33000000 }, + + .bar = .{ + .show_default = true, + // .top + // .bottom + .position = .top, + .font = "monospace:size=10", + .color = .{ + .normal = .{ + .fg = 0x828bb8ff, + .bg = 0x1b1d2bd0, + }, + .select = .{ + .fg = 0x444a73ff, + .bg = 0xc8d3f5d0, + }, + }, + .status = .{ .text = "^#ff0000ffk^#00ff00ffw^#0000ffffm" }, // .stdin or .{ .fifo = "fifo file path" }, could use ^#RGBA to switch text color, and use ^#! to switch back to default color + // bar clicked callback + // each part supports left/right/middle/side/extra/forward/back/task + // set .none to disable + .click = .{ + .tags = .{ + // could use 0 there because it will be replace with the tag clicked + .left = .{ .action = .{ .set_output_tag = .{ .tag = .{ .tag = 0 } } } }, + .right = .{ .action = .{ .toggle_output_tag = .{ .mask = 0 } } }, + .middle = .{ .action = .{ .toggle_window_tag = .{ .mask = 0 } } }, + }, + .layout = .{ + .left = .{ .action = .switch_to_previous_layout }, + }, + .mode = .{ + .left = .{ .action = .{ .switch_mode = .{ .mode = "default" } } }, + }, + .title = .{ + .left = .{ .action = .{ .zoom = .{ .swap = false } } }, + }, + .status = .{ + .middle = .{ .action = .{ .spawn = .{ .argv = .{ "foot" } } } }, + }, + }, + }, + + .sloppy_focus = false, + + // .none + // .on_focus_changed: warp cursor to the center of window focused + // .on_output_changed: warp cursor to the center of output focused + .cursor_warp = .none, + + // if to remember last floating geometry + .remember_floating_geometry = false, + + .auto_swallow = true, + + // .top: stack top + // .bottom: stack bottom + // .stack_top: for tile and deck layout + // .above_focused + // .below_focused + .default_attach_mode = .{ + .tile = .top, + .grid = .top, + .monocle = .top, + .deck = .stack_top, + .scroller = .below_focused, + .float = .top, + }, + + // .csd + // .ssd + .default_window_decoration = .ssd, + + // window border + .border = .{ + .width = 5, + .color = .{ + .focus = 0xffc777ff, + .unfocus = 0x828bb8ff, + }, + }, + + // tags show on bar + .tags = .{ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, + + // .tile + // .grid + // .monocle + // .deck + // .scroller + // .float + .default_layout = .tile, + .layout = .{ + .tile = .{ + .nmaster = 1, + .mfact = 0.55, + .inner_gap = 12, + .outer_gap = 9, + + // .left + // .right + // .top + // .bottom + .master_location = .left, + }, + .grid = .{ + .outer_gap = 9, + .inner_gap = 12, + + // .horizontal + // .vertical + .direction = .horizontal, + }, + .monocle = .{ + .gap = 9, + }, + .deck = .{ + .inner_gap = 12, + .outer_gap = 9, + + // .left + // .right + // .top + // .bottom + .master_location = .left, + }, + .scroller = .{ + .mfact = 0.5, + .inner_gap = 16, + .outer_gap = 9, + }, + }, + + // layout tags show on bar + .layout_tag = .{ + .tile = .{ + .left = "[]=", + .right = "=[]", + .top = "[^]", + .bottom = "[_]", + }, + .grid = .{ + .horizontal = "|+|", + .vertical = "|||", + }, + .monocle = "[=]", + .deck = .{ + .left = "[D]=", + .right = "=[D]", + .top = "[D^]", + .bottom = "[D_]", + }, + .scroller = "[==]", + .float = "><>", + }, + + // key/pointer bindings + .bindings = .{ + // repeat info for key repeat event, different with the repeat_info of input device + .repeat_info = .{ + .rate = 50, + .delay = 300, + }, + + // mode tags show on bar + // display full mode string by default + .mode_tag = .{ + .{ "default", "" }, // hide mode tag in default mode + .{ "passthrough", "P" }, // only show "P" on bar in passthrough mode + .{ "floating", "F" }, // only show "F" on bar in floating mode + }, + + // list of key bindings + // full scheme: + // mode: string(< 16 bytes) + // "default" and "lock" are defined by default + // "default" is the default mode, if you not set `mode`, the binding will be seemed as "default" mode + // when the session locked, kwm will switch to "lock" mode + // you could define any other mode + // keysym: keysym string + // modifiers: + // a struct with fields: shift, ctrl, mod1, mod3, mod4, mod5, and all of these fields are `false` by default + // set modifiers to .{} means key binding without any modifier + // event: key binding trigger event + // there are two options: + // .event = .{ + // .repeat = action + // } + // after the key pressed, the action will repeatly trigger until key released or any another key pressed + // + // .event = .{ + // .click = .{ + // .pressed = null or action, default is null + // .released = null or action, default is null + // } + // } + // the corrosponding action will only trigger once when key pressed or released + // the pressed action and released action could define at the same time + .key = .{ + .{ + .keysym = "r", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .reload_config, + }, + }, + }, + + // passthrough + .{ + .keysym = "Escape", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_mode = .{ .mode = "passthrough" }, + }, + }, + }, + }, + .{ + .mode = "passthrough", + .keysym = "Escape", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_mode = .{ .mode = "default" }, + }, + }, + }, + }, + + // floating + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_mode = .{ .mode = "floating", .auto_quit = .once_unbound_pressed }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "l", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .horizontal = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "h", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .horizontal = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "j", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .vertical = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "k", + .modifiers = .{ .mod4 = true }, + .event = .{ + .repeat = .{ + .move = .{ .step = .{ .vertical = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "l", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .horizontal = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "h", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .horizontal = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "j", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .vertical = 10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "k", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .repeat = .{ + .resize = .{ .step = .{ .vertical = -10 } }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "l", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .right }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "h", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .left }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "j", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .bottom }, + }, + }, + }, + }, + .{ + .mode = "floating", + .keysym = "k", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .snap = .{ .edge = .top }, + }, + }, + }, + }, + + // default + .{ + .keysym = "q", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .quit = .{ .exit_session = true }, + }, + }, + }, + }, + .{ + .keysym = "c", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .close, + }, + }, + }, + .{ + .keysym = "Return", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .zoom = .{ .swap = true }, + }, + }, + }, + }, + .{ + .keysym = "h", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .focus_master_return, + }, + }, + }, + .{ + .keysym = "l", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .focus_master_return, + }, + }, + }, + .{ + .keysym = "b", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .toggle_bar, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .forward, .skip = .floating }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_iter = .{ .direction = .reverse, .skip = .floating }, + }, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .swap = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .swap = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "period", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_output_iter = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "comma", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .focus_output_iter = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "period", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .send_to_output = .{ .direction = .forward }, + }, + }, + }, + }, + .{ + .keysym = "comma", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .send_to_output = .{ .direction = .reverse }, + }, + }, + }, + }, + .{ + .keysym = "m", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .toggle_fullscreen = .{ .in_window = true }, + }, + }, + }, + }, + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .toggle_fullscreen = .{ .in_window = false }, + }, + }, + }, + }, + .{ + .keysym = "space", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .switch_to_previous_layout, + }, + }, + }, + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .toggle_floating, + }, + }, + }, + .{ + .keysym = "s", + .modifiers = .{ .mod4 = true, .ctrl = true }, + .event = .{ + .click = .{ + .pressed = .toggle_sticky, + }, + }, + }, + .{ + .keysym = "a", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .toggle_swallow, + }, + }, + }, + .{ + .keysym = "f", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .float }, + }, + }, + }, + }, + .{ + .keysym = "t", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .tile }, + }, + }, + }, + }, + .{ + .keysym = "g", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .grid }, + }, + }, + }, + }, + .{ + .keysym = "d", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .deck }, + }, + }, + }, + }, + .{ + .keysym = "m", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .monocle }, + }, + }, + }, + }, + .{ + .keysym = "s", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .switch_layout = .{ .layout = .scroller }, + }, + }, + }, + }, + .{ + .keysym = "Tab", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .switch_to_previous_tag, + }, + }, + }, + .{ + .keysym = "apostrophe", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .set_output_tag = .{ .tag = .{ .occupied = .forward } }, + }, + }, + }, + }, + .{ + .keysym = "semicolon", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .set_output_tag = .{ .tag = .{ .occupied = .reverse } }, + }, + }, + }, + }, + .{ + .keysym = "apostrophe", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .set_window_tag = .{ .tag = .{ .unoccupied = .forward } }, + }, + }, + }, + }, + .{ + .keysym = "semicolon", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .set_window_tag = .{ .tag = .{ .unoccupied = .reverse } }, + }, + }, + }, + }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b1 } } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b10 } } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b100 } } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b1000 } } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b10000 } } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b100000 } } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b1000000 } } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b10000000 } } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b100000000 } } } } } }, + .{ .keysym = "0", .modifiers = .{ .mod4 = true }, .event = .{ .click = .{ .pressed = .{ .set_output_tag = .{ .tag = .{ .tag = 0b111111111 } } } } } }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b1 } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b10 } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b100 } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b1000 } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b10000 } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b100000 } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b1000000 } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b10000000 } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true, .ctrl = true }, .event = .{ .click = .{ .pressed = .{ .toggle_output_tag = .{ .mask = 0b100000000 } } } } }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b1 } } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b10 } } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b100 } } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b1000 } } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b10000 } } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b100000 } } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b1000000 } } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b10000000 } } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .set_window_tag = .{ .tag = .{ .tag = 0b100000000 } } } } } }, + + .{ .keysym = "1", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b1 } } } } }, + .{ .keysym = "2", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b10 } } } } }, + .{ .keysym = "3", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b100 } } } } }, + .{ .keysym = "4", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b1000 } } } } }, + .{ .keysym = "5", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b10000 } } } } }, + .{ .keysym = "6", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b100000 } } } } }, + .{ .keysym = "7", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b1000000 } } } } }, + .{ .keysym = "8", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b10000000 } } } } }, + .{ .keysym = "9", .modifiers = .{ .mod4 = true, .ctrl = true, .shift = true }, .event = .{ .click = .{ .pressed = .{ .toggle_window_tag = .{ .mask = 0b100000000 } } } } }, + + .{ + .keysym = "l", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_mfact = .{ .step = 0.01 }, + }, + }, + }, + }, + .{ + .keysym = "h", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_mfact = .{ .step = -0.01 }, + }, + }, + }, + }, + .{ + .keysym = "j", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .bottom }, + }, + }, + }, + }, + .{ + .keysym = "k", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .top }, + }, + }, + }, + }, + .{ + .keysym = "l", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .right }, + }, + }, + }, + }, + .{ + .keysym = "h", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_master_location = .{ .location = .left }, + }, + }, + }, + }, + .{ + .keysym = "equal", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_nmaster = .{ .change = .increase }, + }, + }, + }, + }, + .{ + .keysym = "minus", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_nmaster = .{ .change = .decrease }, + }, + }, + }, + }, + .{ + .keysym = "equal", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_gap = .{ .step = 1 }, + }, + }, + }, + }, + .{ + .keysym = "minus", + .modifiers = .{ .mod4 = true, .mod1 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .modify_gap = .{ .step = -1 }, + }, + }, + }, + }, + .{ + .keysym = "a", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .toggle_auto_swallow, + }, + }, + }, + .{ + .keysym = "g", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .toggle_grid_direction, + }, + }, + }, + + .{ + .keysym = "p", + .modifiers = .{ .mod4 = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn_shell = .{ .cmd = "wmenu-run" }, + }, + }, + }, + }, + .{ + .keysym = "Return", + .modifiers = .{ .mod4 = true, .shift = true }, + .event = .{ + .click = .{ + .pressed = .{ + .spawn = .{ .argv = .{ "foot" } }, + }, + }, + }, + }, + }, + + // list of pointer bindings + // full scheme: + // mode: same as key binding + // button: pointer button + // .left + // .right + // .middle + // modifiers: same as key binding + // event: pointer binding trigger event + // .event = .{ + // .pressed = null or action, default is null + // .released = null or action, default is null + // } + // the corrosponding action will only trigger once when pointer button pressed or released + // the pressed action and released action could define at the same time + .pointer = .{ + .{ + .mode = "default", + .button = .left, + .modifiers = .{ .mod4 = true }, + .event = .{ .pressed = .pointer_move }, + }, + .{ + .mode = "default", + .button = .right, + .modifiers = .{ .mod4 = true }, + .event = .{ .pressed = .pointer_resize }, + }, + }, + // other unmentioned actions: + // group: run multiple actions in sequence + // .event = .{ + // .click = .{ + // .pressed = .{ + // .group = .{ + // .actions = .{ + // action1, + // action2, + // ... + // }, + // }, + // }, + // }, + // } + }, + + // rule part + // + // a rule pattern has fields below: + // str: pattern string, required + // regex: bool, if enable regex + // match_null: bool, if match null + // + // only the first rule matched will be applied + + // window rules + // full scheme: + // app_id: rule pattern + // title: rule pattern + // + // tag: window tag + // output: output name pattern, same as rule pattern + // floating: bool, if floating + // dimension: .{ .width = i32, .height = i32 }, initial dimension + // decoration: .csd or .ssd, window decoration + // is_terminal: bool, if set true, means the window could be swallowed + // disable_swallow: bool, if set true, the window could not swallow any other windows + // scroller_mfact: f32, initial mfact of the window for scroller layout + // attach_mode: like `default_attach_mode`, change attach_mode for window matched + .window_rules = .{ + .{ .app_id = .{ .str = "", .match_null = true }, .floating = true }, + .{ .app_id = .{ .str = "zenity" }, .floating = true }, + .{ .app_id = .{ .str = "DesktopEditors" }, .floating = true }, + .{ .app_id = .{ .str = "xdg-desktop-portal-gtk" }, .floating = true }, + .{ .app_id = .{ .str = "chromium" }, .tag = 0b10, .scroller_mfact = 0.9 }, + .{ .app_id = .{ .str = "foot" }, .is_terminal = true, .scroller_mfact = 0.8 }, + }, + + // output rules + // full scheme: + // name: rule pattern + // + // presentation_mode: presentation mode, .vsync or .async + // layout: same as `layout` before but you only need to specify the values you want to change + // default_layout: same as `default_layout` before + .output_rules = .{ + // + }, + + // input device rules + // full scheme: + // name: rule pattern + // + // repeat_info: .{ .rate = i32, .delay = i32 } + // scroll_factor: f64 + .input_device_rules = .{ + .{ .repeat_info = .{ .rate = 50, .delay = 300 } }, + }, + + // libinput device rules + // full scheme: + // name: rule pattern + // + // send_events_modes: + // .enabled + // .disabled + // .disabled_on_external_mouse + // tap: .enabled or .disabled + // drag: .enabled or .disabled + // drag_lock: .enabled or .disabled + // tap_button_map: .lrm or .lmr + // three_finger_drag: + // .disabled + // .enabled_3fg + // .enabled_4fg + // calibration_matrix: [6]f32 + // accel_profile: + // .none + // .flat + // .adaptive + // .custom + // accel_speed: f32 + // natural_scroll: .enabled or .disabled + // left_handed: .enabled or .disabled + // click_method: + // .none + // .button_areas + // .clickfinger + // clickfinger_button_map: .lrm or .lmr + // middle_button_emulation: .enabled or .disabled + // scroll_method: + // .no_scroll + // .two_finger + // .edge + // .on_button_down + // scroll_button: + // .left + // .right + // .middle + // scroll_button_lock: .enabled or .disabled + // disable_while_typing: .enabled or .disabled + // disable_while_trackpointing: .enabled or .disabled + // rotation_angle: u32 + .libinput_device_rules = .{ + .{ .name = .{ .str = ".*[tT]ouchpad", .regex = true }, .tap = .enabled, .drag = .enabled, .natural_scroll = .enabled }, + .{ .tap = .enabled, .drag = .enabled } + }, + + // xkb_keyboard rules + // full scheme: + // name: rule pattern + // + // numlock: .enabled or .disabled + // capslock: .enabled or .disabled + // layout: + // layout index: .{ .index = u32 } + // or + // layout name: .{ .name = "layout name" } + // keymap: + // .{ .file = .{ .path = "keymap file path", .format = .text_v1 or .text_v2 } } + // or + // .{ + // .options = .{ + // .rules = ?[]const u8, + // .model = ?[]const u8, + // .layout = ?[]const u8, + // .variant = ?[]const u8, + // .options = ?[]const u8, + // } + // } + .xkb_keyboard_rules = .{ + // + }, +} diff --git a/kwm/.config/kwm/init.sh b/kwm/.config/kwm/init.sh new file mode 100755 index 0000000..d3c85a6 --- /dev/null +++ b/kwm/.config/kwm/init.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +wobd + +pgrep swaybg || swaybg -i ~/.config/kwm/wallpaper.jpg & +pgrep dunst || dunst & + +foot --server & # TODO: figure out systemd service +emacs --daemon & + +# swayidle +pgrep swayidle || swayidle -w \ + timeout 300 '$HOME/.config/river/timeout.sh' \ + before-sleep 'swaylock -f -c 000000' & + +# gnome-keyring (needed for nextcloud to remember login) +dbus-update-activation-environment --all +gnome-keyring-daemon --start --components=secrets + +nextcloud & diff --git a/kwm/.config/kwm/pianobar.sh b/kwm/.config/kwm/pianobar.sh new file mode 100755 index 0000000..b2bb577 --- /dev/null +++ b/kwm/.config/kwm/pianobar.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo "$1" > ~/.config/pianobar/ctl diff --git a/river/.config/river/power_mode.sh b/kwm/.config/kwm/power_mode.sh similarity index 100% rename from river/.config/river/power_mode.sh rename to kwm/.config/kwm/power_mode.sh diff --git a/river/.config/river/screenshot.sh b/kwm/.config/kwm/screenshot.sh similarity index 100% rename from river/.config/river/screenshot.sh rename to kwm/.config/kwm/screenshot.sh diff --git a/river/.config/river/timeout.sh b/kwm/.config/kwm/timeout.sh similarity index 100% rename from river/.config/river/timeout.sh rename to kwm/.config/kwm/timeout.sh diff --git a/river/.config/river/toggle_caffeine.sh b/kwm/.config/kwm/toggle_caffeine.sh similarity index 100% rename from river/.config/river/toggle_caffeine.sh rename to kwm/.config/kwm/toggle_caffeine.sh diff --git a/river/.config/river/wallpaper.jpg b/kwm/.config/kwm/wallpaper.jpg similarity index 100% rename from river/.config/river/wallpaper.jpg rename to kwm/.config/kwm/wallpaper.jpg diff --git a/river-classic/.config/river/init b/river-classic/.config/river/init new file mode 100755 index 0000000..00588b5 --- /dev/null +++ b/river-classic/.config/river/init @@ -0,0 +1,226 @@ +#!/bin/sh + +# Variables +term="foot" +term_client="footclient" +term_float="foot --app-id=float -w 1120x700" +browser="librewolf" +email="thunderbird" +emacs="emacsclient --create-frame --alternate-editor='emacs'" +mod=Super +books="$HOME/.local/bin/books.sh" +papers="$HOME/.local/bin/papers.sh" +config="$HOME/.config/river" + +wobsock=$XDG_RUNTIME_DIR/wob.sock +rm -f $wobsock && mkfifo $wobsock && tail -f $wobsock | wob & + +# Launch things +riverctl map normal $mod Return spawn $term_client +riverctl map normal $mod+Shift Return spawn $term +riverctl map normal $mod R span "bemenu-run -p launch" +riverctl map normal $mod Semicolon spawn "bemenu-run -p launch" +riverctl map normal $mod+Shift P spawn "$config/power_mode.sh" +# riverctl map normal $mod+Shift P spawn "passmenu -p password" +riverctl map normal $mod BracketRight spawn "$browser" +riverctl map normal $mod T spawn "$email" +riverctl map normal $mod Z spawn "$books" +riverctl map normal $mod Y spawn "$papers" +riverctl map normal $mod E spawn "$emacs" +riverctl map normal $mod+Control O spawn "swaylock" +riverctl map normal $mod B spawn "bluetoothctl connect 88:C9:E8:D7:60:85" +riverctl map normal $mod+Shift B spawn "bluetoothctl disconnect 88:C9:E8:D7:60:85" +riverctl map normal $mod+Control S spawn "$config/screenshot.sh clip" +riverctl map normal $mod+Shift E spawn "$config/screenshot.sh menu" + +# Close windows & exit wm +riverctl map normal $mod+Shift C close +riverctl map normal $mod+Shift Q exit + +# view stuff +riverctl map normal $mod J focus-view next +riverctl map normal $mod K focus-view previous +riverctl map normal $mod+Shift J swap next +riverctl map normal $mod+Shift K swap previous + +riverctl map normal $mod+Shift Space zoom + +# monitor stuff +riverctl map normal $mod Period focus-output next +riverctl map normal $mod Comma focus-output previous +riverctl map normal $mod+Shift Period send-to-output next +riverctl map normal $mod+Shift Comma send-to-output previous + +# mess with main +riverctl map normal $mod H send-layout-cmd rivertile "main-ratio -0.05" +riverctl map normal $mod L send-layout-cmd rivertile "main-ratio +0.05" + +riverctl map normal $mod+Shift H send-layout-cmd rivertile "main-count +1" +riverctl map normal $mod+Shift L send-layout-cmd rivertile "main-count -1" + +# manipulate views +riverctl map normal $mod+Alt H move left 100 +riverctl map normal $mod+Alt J move down 100 +riverctl map normal $mod+Alt K move up 100 +riverctl map normal $mod+Alt L move right 100 + +riverctl map normal $mod+Alt+Control H snap left +riverctl map normal $mod+Alt+Control J snap down +riverctl map normal $mod+Alt+Control K snap up +riverctl map normal $mod+Alt+Control L snap right + +riverctl map normal $mod+Alt+Shift H resize horizontal -100 +riverctl map normal $mod+Alt+Shift J resize vertical 100 +riverctl map normal $mod+Alt+Shift K resize vertical -100 +riverctl map normal $mod+Alt+Shift L resize horizontal 100 + +riverctl map-pointer normal $mod BTN_LEFT move-view +riverctl map-pointer normal $mod BTN_RIGHT resize-view +riverctl map-pointer normal $mod BTN_MIDDLE toggle-float + +# tag stuff +for i in $(seq 1 9) +do + tags=$((1 << ($i - 1))) + + riverctl map normal $mod $i set-focused-tags $tags + riverctl map normal $mod+Shift $i set-view-tags $tags + riverctl map normal $mod+Control $i toggle-focused-tags $tags + riverctl map normal $mod+Shift+Control $i toggle-view-tags $tags +done + +all_tags=$(((1 << 32) - 1)) +riverctl map normal $mod 0 set-focused-tags $all_tags +riverctl map normal $mod+Shift 0 set-view-tags $all_tags + +# toggle +riverctl map normal $mod Space toggle-float +riverctl map normal $mod F toggle-fullscreen + +# change layout orientation +riverctl map normal $mod+Control K send-layout-cmd rivertile "main-location top" +riverctl map normal $mod+Control L send-layout-cmd rivertile "main-location right" +riverctl map normal $mod+Control J send-layout-cmd rivertile "main-location bottom" +riverctl map normal $mod+Control H send-layout-cmd rivertile "main-location left" + +# passthrough mode +riverctl declare-mode passthrough +riverctl map normal $mod F11 enter-mode passthrough +riverctl map passthrough $mod F11 enter-mode normal + +# media key bindings +for mode in normal locked +do + riverctl map $mode None XF86Eject spawn 'eject -T' + + riverctl map $mode None XF86AudioRaiseVolume spawn "~/.config/river/volume.sh up 0.02" + riverctl map $mode None XF86AudioLowerVolume spawn "~/.config/river/volume.sh down 0.02" + riverctl map $mode Shift XF86AudioRaiseVolume spawn "~/.config/river/volume.sh up 0.01" + riverctl map $mode Shift XF86AudioLowerVolume spawn "~/.config/river/volume.sh down 0.01" + riverctl map $mode Control XF86AudioRaiseVolume spawn "~/.config/river/volume.sh up 0.10" + riverctl map $mode Control XF86AudioLowerVolume spawn "~/.config/river/volume.sh down 0.10" + riverctl map $mode None XF86AudioMute exec spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + + riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause' + riverctl map $mode None XF86AudioPlay spawn 'playerctl play-pause' + riverctl map $mode None XF86AudioPrev spawn 'playerctl previous' + riverctl map $mode None XF86AudioNext spawn 'playerctl next' + + riverctl map $mode None XF86MonBrightnessUp spawn "brightnessctl set +5% | sed -En 's/.*\(([0-9]+)%\).*/\1/p' > $wobsock" + riverctl map $mode None XF86MonBrightnessDown spawn "brightnessctl set 5%- | sed -En 's/.*\(([0-9]+)%\).*/\1/p' > $wobsock" +done + +# "caffeine" +riverctl map normal $mod+Control C spawn "$HOME/.config/river/toggle_caffeine.sh" + +# colors +riverctl background-color 0x1e1e2e +riverctl border-color-focused 0xf5c2e7 +riverctl border-color-unfocused 0x586e75 +riverctl border-width 2 + +# options +riverctl set-repeat 50 300 +# riverctl keyboard-layout -options "altwin:swap_lalt_lwin" us +# riverctl keyboard-layout -options "altwin:swap_lalt_lwin,grp:alt_space_toggle" -variant colemak_dh, us,us +riverctl keyboard-layout -options "grp:alt_space_toggle" -variant colemak_dh, us,us +# riverctl keyboard-layout -options "altwin:swap_lalt_lwin,grp:alt_space_toggle" -variant ,colemak_dh,dvorak us,us,us +# riverctl keyboard-layout -options "grp:alt_space_toggle" -variant ,dvorak us,us + +riverctl focus-follows-cursor normal +riverctl hide-cursor timeout 10000 +riverctl hide-cursor when-typing enabled +riverctl xcursor-theme Adwaita + +touchpad=$(riverctl list-inputs | grep -i touchpad) +riverctl input $touchpad disable-while-typing enabled +riverctl input $touchpad natural-scroll enabled +riverctl input $touchpad tap enabled + +# Make certain views start floating +riverctl float-filter-add app-id float +riverctl float-filter-add title "popup title with spaces" +riverctl float-filter-add app-id blueman-manager + +# "Scratchpad" +scratch_tag=$((1 << 20)) +riverctl map normal $mod Slash toggle-focused-tags $scratch_tag +riverctl map normal $mod+Shift Slash set-view-tags $scratch_tag +riverctl map normal $mod+Control Slash toggle-view-tags $scratch_tag +riverctl map normal $mod S spawn "$term_float" +riverctl rule-add -app-id float float + +# SSD (so GTK apps show border) +riverctl rule-add -app-id firefox ssd +riverctl rule-add -app-id librewolf ssd +riverctl rule-add -app-id thunderbird ssd +riverctl rule-add -app-id betterbird ssd +riverctl rule-add -app-id emacs ssd +riverctl rule-add -app-id gnucash ssd +riverctl rule-add -app-id pcmanfm ssd +riverctl rule-add -app-id steam ssd +riverctl rule-add -app-id drracket ssd +riverctl rule-add -app-id org.pwmt.zathura ssd +riverctl rule-add -app-id org.gnome.Boxes ssd +riverctl rule-add -app-id com.github.xournalpp.xournalpp ssd + +# spawn stuff +pgrep swaybg || swaybg -i ~/.config/river/wallpaper.jpg & +wlr-randr --output eDP-1 --scale 1.25 & +pgrep waybar || waybar & + +# dunst stuff +pgrep dunst || dunst & +riverctl map normal $mod D spawn 'dunstctl close' +riverctl map normal $mod+Shift D spawn 'dunstctl close-all' + +# bluetooth +blueman-applet & + +# foot server +foot --server & # TODO: figure out systemd service + +# emacs daemon +emacs --daemon & + +# nextcloud client +nextcloud & + +# pianobar +riverctl map normal $mod+Shift S spawn '~/.config/pianobar/change_station.sh' +riverctl map normal $mod P spawn 'echo "p" > ~/.config/pianobar/ctl' +riverctl map normal $mod C spawn '~/.config/pianobar/display_info.sh' +riverctl map normal $mod N spawn 'echo "n" > ~/.config/pianobar/ctl' + +# swayidle +pgrep swayidle || swayidle -w \ + timeout 300 '$HOME/.config/river/timeout.sh' \ + before-sleep 'swaylock -f -c 000000' & + +# gnome-keyring (needed for nextcloud to remember login) +dbus-update-activation-environment --all +gnome-keyring-daemon --start --components=secrets + +# start rivertile +riverctl default-layout rivertile +rivertile -view-padding 6 -outer-padding 6 -main-ratio 0.55 & diff --git a/river-classic/.config/river/power_mode.sh b/river-classic/.config/river/power_mode.sh new file mode 100755 index 0000000..0a10d1f --- /dev/null +++ b/river-classic/.config/river/power_mode.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo -e "performance\nbalanced\npower-saver" | bemenu --center --list 3 -p "Power Mode" --border 2 --bdr "#f6c2e7" -W 0.5 | xargs tlpctl diff --git a/river-classic/.config/river/screenshot.sh b/river-classic/.config/river/screenshot.sh new file mode 100755 index 0000000..71dbad4 --- /dev/null +++ b/river-classic/.config/river/screenshot.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +if [ $1 = "clip" ]; then + if grim -g "$(slurp)" - | wl-copy; then + notify-send "screenshot" "Saved to clipboard" + else + notify-send "screenshot" "Canceled" + fi +else + filename="$HOME/Downloads/$(echo '' | bemenu --ifne -p "Enter filename:")" + filename_ext="${filename%.png}.png" + if grim -g "$(slurp)" "$filename_ext"; then + notify-send "screenshot" "Saved as $filename_ext" + else + notify-send "screenshot" "Canceled" + fi +fi diff --git a/river-classic/.config/river/timeout.sh b/river-classic/.config/river/timeout.sh new file mode 100755 index 0000000..647af41 --- /dev/null +++ b/river-classic/.config/river/timeout.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +caffeine_file=$HOME/.cache/idle + +if [[ ! -f $caffeine_file ]] then + echo 0 > $caffeine_file +fi + +caffeine=$(<$HOME/.cache/idle) + +if [[ $caffeine -eq 0 ]] then + swaylock -f -c 000000 +else + notify-send 'Caffeine' 'Not sleeping' +fi diff --git a/river-classic/.config/river/toggle_caffeine.sh b/river-classic/.config/river/toggle_caffeine.sh new file mode 100755 index 0000000..e7fcb13 --- /dev/null +++ b/river-classic/.config/river/toggle_caffeine.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +caffeine_file=$HOME/.cache/idle + +if [[ ! -f $caffeine_file ]] then + echo 0 > $caffeine_file +fi + +caffeine=$(<$HOME/.cache/idle) + +if [[ $caffeine -eq 0 ]] then + echo 1 > $caffeine_file + notify-send 'Caffeine' 'Caffeine Enabled' +else + echo 0 > $caffeine_file + notify-send 'Caffeine' 'Caffeine Disabled' +fi diff --git a/river/.config/river/volume.sh b/river-classic/.config/river/volume.sh similarity index 100% rename from river/.config/river/volume.sh rename to river-classic/.config/river/volume.sh diff --git a/river-classic/.config/river/wallpaper.jpg b/river-classic/.config/river/wallpaper.jpg new file mode 100644 index 0000000..9ca0c04 Binary files /dev/null and b/river-classic/.config/river/wallpaper.jpg differ diff --git a/river/.config/river/init b/river/.config/river/init index e9ca1bb..80d2901 100755 --- a/river/.config/river/init +++ b/river/.config/river/init @@ -1,222 +1,7 @@ #!/bin/sh -# Variables -term="foot" -term_client="footclient" -term_float="foot --app-id=float -w 1120x700" -browser="librewolf" -email="thunderbird" -emacs="emacsclient --create-frame --alternate-editor='emacs'" -mod=Super -books="$HOME/.local/bin/books.sh" -papers="$HOME/.local/bin/papers.sh" -config="$HOME/.config/river" - -wobsock=$XDG_RUNTIME_DIR/wob.sock -rm -f $wobsock && mkfifo $wobsock && tail -f $wobsock | wob & - -# Launch things -riverctl map normal $mod Return spawn $term_client -riverctl map normal $mod+Shift Return spawn $term -riverctl map normal $mod R span "bemenu-run -p launch" -riverctl map normal $mod Semicolon spawn "bemenu-run -p launch" -riverctl map normal $mod+Shift P spawn "$config/power_mode.sh" -# riverctl map normal $mod+Shift P spawn "passmenu -p password" -riverctl map normal $mod BracketRight spawn "$browser" -riverctl map normal $mod T spawn "$email" -riverctl map normal $mod Z spawn "$books" -riverctl map normal $mod Y spawn "$papers" -riverctl map normal $mod E spawn "$emacs" -riverctl map normal $mod+Control O spawn "swaylock" -riverctl map normal $mod B spawn "bluetoothctl connect 88:C9:E8:D7:60:85" -riverctl map normal $mod+Shift B spawn "bluetoothctl disconnect 88:C9:E8:D7:60:85" -riverctl map normal $mod+Control S spawn "$config/screenshot.sh clip" -riverctl map normal $mod+Shift E spawn "$config/screenshot.sh menu" - -# Close windows & exit wm -riverctl map normal $mod+Shift C close -riverctl map normal $mod+Shift Q exit - -# view stuff -riverctl map normal $mod J focus-view next -riverctl map normal $mod K focus-view previous -riverctl map normal $mod+Shift J swap next -riverctl map normal $mod+Shift K swap previous - -riverctl map normal $mod+Shift Space zoom - -# monitor stuff -riverctl map normal $mod Period focus-output next -riverctl map normal $mod Comma focus-output previous -riverctl map normal $mod+Shift Period send-to-output next -riverctl map normal $mod+Shift Comma send-to-output previous - -# mess with main -riverctl map normal $mod H send-layout-cmd rivertile "main-ratio -0.05" -riverctl map normal $mod L send-layout-cmd rivertile "main-ratio +0.05" - -riverctl map normal $mod+Shift H send-layout-cmd rivertile "main-count +1" -riverctl map normal $mod+Shift L send-layout-cmd rivertile "main-count -1" - -# manipulate views -riverctl map normal $mod+Alt H move left 100 -riverctl map normal $mod+Alt J move down 100 -riverctl map normal $mod+Alt K move up 100 -riverctl map normal $mod+Alt L move right 100 - -riverctl map normal $mod+Alt+Control H snap left -riverctl map normal $mod+Alt+Control J snap down -riverctl map normal $mod+Alt+Control K snap up -riverctl map normal $mod+Alt+Control L snap right - -riverctl map normal $mod+Alt+Shift H resize horizontal -100 -riverctl map normal $mod+Alt+Shift J resize vertical 100 -riverctl map normal $mod+Alt+Shift K resize vertical -100 -riverctl map normal $mod+Alt+Shift L resize horizontal 100 - -riverctl map-pointer normal $mod BTN_LEFT move-view -riverctl map-pointer normal $mod BTN_RIGHT resize-view -riverctl map-pointer normal $mod BTN_MIDDLE toggle-float - -# tag stuff -for i in $(seq 1 9) -do - tags=$((1 << ($i - 1))) - - riverctl map normal $mod $i set-focused-tags $tags - riverctl map normal $mod+Shift $i set-view-tags $tags - riverctl map normal $mod+Control $i toggle-focused-tags $tags - riverctl map normal $mod+Shift+Control $i toggle-view-tags $tags -done - -all_tags=$(((1 << 32) - 1)) -riverctl map normal $mod 0 set-focused-tags $all_tags -riverctl map normal $mod+Shift 0 set-view-tags $all_tags - -# toggle -riverctl map normal $mod Space toggle-float -riverctl map normal $mod F toggle-fullscreen - -# change layout orientation -riverctl map normal $mod+Control K send-layout-cmd rivertile "main-location top" -riverctl map normal $mod+Control L send-layout-cmd rivertile "main-location right" -riverctl map normal $mod+Control J send-layout-cmd rivertile "main-location bottom" -riverctl map normal $mod+Control H send-layout-cmd rivertile "main-location left" - -# passthrough mode -riverctl declare-mode passthrough -riverctl map normal $mod F11 enter-mode passthrough -riverctl map passthrough $mod F11 enter-mode normal - -# media key bindings -for mode in normal locked -do - riverctl map $mode None XF86Eject spawn 'eject -T' - - riverctl map $mode None XF86AudioRaiseVolume spawn "~/.config/river/volume.sh up 0.02" - riverctl map $mode None XF86AudioLowerVolume spawn "~/.config/river/volume.sh down 0.02" - riverctl map $mode Shift XF86AudioRaiseVolume spawn "~/.config/river/volume.sh up 0.01" - riverctl map $mode Shift XF86AudioLowerVolume spawn "~/.config/river/volume.sh down 0.01" - riverctl map $mode Control XF86AudioRaiseVolume spawn "~/.config/river/volume.sh up 0.10" - riverctl map $mode Control XF86AudioLowerVolume spawn "~/.config/river/volume.sh down 0.10" - riverctl map $mode None XF86AudioMute exec spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" - - riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause' - riverctl map $mode None XF86AudioPlay spawn 'playerctl play-pause' - riverctl map $mode None XF86AudioPrev spawn 'playerctl previous' - riverctl map $mode None XF86AudioNext spawn 'playerctl next' - - riverctl map $mode None XF86MonBrightnessUp spawn "brightnessctl set +5% | sed -En 's/.*\(([0-9]+)%\).*/\1/p' > $wobsock" - riverctl map $mode None XF86MonBrightnessDown spawn "brightnessctl set 5%- | sed -En 's/.*\(([0-9]+)%\).*/\1/p' > $wobsock" -done - -# "caffeine" -riverctl map normal $mod+Control C spawn "$HOME/.config/river/toggle_caffeine.sh" - -# colors -riverctl background-color 0x1e1e2e -riverctl border-color-focused 0xf5c2e7 -riverctl border-color-unfocused 0x586e75 -riverctl border-width 2 - -# options -riverctl set-repeat 50 300 -# riverctl keyboard-layout -options "altwin:swap_lalt_lwin" us -# riverctl keyboard-layout -options "altwin:swap_lalt_lwin,grp:alt_space_toggle" -variant colemak_dh, us,us -riverctl keyboard-layout -options "grp:alt_space_toggle" -variant colemak_dh, us,us -# riverctl keyboard-layout -options "altwin:swap_lalt_lwin,grp:alt_space_toggle" -variant ,colemak_dh,dvorak us,us,us -# riverctl keyboard-layout -options "grp:alt_space_toggle" -variant ,dvorak us,us - -riverctl focus-follows-cursor normal -riverctl hide-cursor timeout 10000 -riverctl hide-cursor when-typing enabled -riverctl xcursor-theme Adwaita - -touchpad=$(riverctl list-inputs | grep -i touchpad) -riverctl input $touchpad disable-while-typing enabled -riverctl input $touchpad natural-scroll enabled -riverctl input $touchpad tap enabled - -# Make certain views start floating -riverctl float-filter-add app-id float -riverctl float-filter-add title "popup title with spaces" -riverctl float-filter-add app-id blueman-manager - -# "Scratchpad" -scratch_tag=$((1 << 20)) -riverctl map normal $mod Slash toggle-focused-tags $scratch_tag -riverctl map normal $mod+Shift Slash set-view-tags $scratch_tag -riverctl map normal $mod+Control Slash toggle-view-tags $scratch_tag -riverctl map normal $mod S spawn "$term_float" -riverctl rule-add -app-id float float - -# SSD (so GTK apps show border) -riverctl rule-add -app-id firefox ssd -riverctl rule-add -app-id librewolf ssd -riverctl rule-add -app-id thunderbird ssd -riverctl rule-add -app-id betterbird ssd -riverctl rule-add -app-id emacs ssd -riverctl rule-add -app-id gnucash ssd -riverctl rule-add -app-id pcmanfm ssd -riverctl rule-add -app-id steam ssd -riverctl rule-add -app-id drracket ssd -riverctl rule-add -app-id org.pwmt.zathura ssd -riverctl rule-add -app-id org.gnome.Boxes ssd -riverctl rule-add -app-id com.github.xournalpp.xournalpp ssd - -# spawn stuff -pgrep swaybg || swaybg -i ~/.config/river/wallpaper.jpg & wlr-randr --output eDP-1 --scale 1.25 & -pgrep waybar || waybar & -# dunst stuff -pgrep dunst || dunst & -riverctl map normal $mod D spawn 'dunstctl close' -riverctl map normal $mod+Shift D spawn 'dunstctl close-all' - -# bluetooth -blueman-applet & - -# foot server -foot --server & # TODO: figure out systemd service - -# emacs daemon -emacs --daemon & - -# nextcloud client -nextcloud & - -# pianobar -riverctl map normal $mod+Shift S spawn '~/.config/pianobar/change_station.sh' -riverctl map normal $mod P spawn 'echo "p" > ~/.config/pianobar/ctl' -riverctl map normal $mod C spawn '~/.config/pianobar/display_info.sh' -riverctl map normal $mod N spawn 'echo "n" > ~/.config/pianobar/ctl' - -# swayidle -pgrep swayidle || swayidle -w \ - timeout 300 '$HOME/.config/river/timeout.sh' \ - before-sleep 'swaylock -f -c 000000' & - -# start rivertile -riverctl default-layout rivertile -rivertile -view-padding 6 -outer-padding 6 -main-ratio 0.55 & +$HOME/repos/damblocks/damblocks | kwm & +killall -q mpc +damblocks-mpdd