Something went wrong. Try again.
The cutest scrollable window manager for Windows
windows tiling-manager tiling scrollable-window-manager scrollable cute window scroll window-manager
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576const KeyboardHook = @This();
const Error = error{SetWindowsHookFailed};
hook: win32.ui.windows_and_messaging.HHOOK,
pub fn start() !KeyboardHook { log.debug("setting up keyboard hook", .{}); const hook = win32.ui.windows_and_messaging.SetWindowsHookExW( win32.ui.windows_and_messaging.WH_KEYBOARD_LL, &keyboardProc, null, 0, ) orelse { log.err("couldn't set keyboard hook", .{}); return Error.SetWindowsHookFailed; };
return .{ .hook = hook };}
pub fn stop(kh: *const KeyboardHook) void { log.debug("removing keyboard hook", .{}); _ = win32.ui.windows_and_messaging.UnhookWindowsHookEx(kh.hook);}
fn keyboardProc( code: i32, wparam: win32.foundation.WPARAM, lparam: win32.foundation.LPARAM,) callconv(.winapi) win32.foundation.LRESULT { if (code != 0) { return win32.ui.windows_and_messaging.CallNextHookEx(null, code, wparam, lparam); }
if (wparam != win32.ui.windows_and_messaging.WM_KEYDOWN and wparam != win32.ui.windows_and_messaging.WM_SYSKEYDOWN) { return win32.ui.windows_and_messaging.CallNextHookEx(null, code, wparam, lparam); }
const kb: *const win32.ui.windows_and_messaging.KBDLLHOOKSTRUCT = @ptrFromInt(@as(usize, @bitCast(lparam))); const vk = kb.vkCode; const mods: Configuration.Mods = .{ .alt = kb.flags.ALTDOWN == 1, .ctrl = isKeyDown(.CONTROL), .shift = isKeyDown(.SHIFT), .win = isKeyDown(.LWIN) or isKeyDown(.RWIN), };
for (wm.config.keybinds) |keybind| { if (std.meta.eql(keybind.mods, mods) and @intFromEnum(keybind.key) == vk) { log.debug("keybind matched: {}", .{keybind.key});
switch (keybind.action) { .nothing => {}, }
return 1; } }
return win32.ui.windows_and_messaging.CallNextHookEx(null, code, wparam, lparam);}
fn isKeyDown(vk: win32.ui.input.keyboard_and_mouse.VIRTUAL_KEY) bool { const state = win32.ui.input.keyboard_and_mouse.GetAsyncKeyState(@intFromEnum(vk)); return (@as(u16, @bitCast(state)) & 0x8000) != 0;}
const log = std.log.scoped(.keyboard_hook);
const wm = &@import("main.zig").wm;const Configuration = @import("Configuration.zig");
const win32 = @import("win32");const std = @import("std");