mirror of
https://codeberg.org/dwl/dwl.git
synced 2025-10-27 10:14:14 +00:00
76 lines
2.4 KiB
Julia
76 lines
2.4 KiB
Julia
module DWL
|
|
|
|
const xkb_keysym_t = UInt32
|
|
#struct xkb_keysym_t
|
|
# x::UInt32
|
|
#end
|
|
|
|
struct Arg
|
|
x::UInt
|
|
end
|
|
|
|
struct Key
|
|
mod::UInt32
|
|
keysym::xkb_keysym_t
|
|
func::Ptr{Cvoid}
|
|
arg::Arg
|
|
end
|
|
|
|
keysym(x) = ccall((:XStringToKeysym, "libxkbfile"), xkb_keysym_t, (Cstring,), string(x))
|
|
# from wlr_keyboard.h
|
|
const WLR_MODIFIER_SHIFT = xkb_keysym_t(1 << 0)
|
|
const WLR_MODIFIER_CAPS = xkb_keysym_t(1 << 1)
|
|
const WLR_MODIFIER_CTRL = xkb_keysym_t(1 << 2)
|
|
const WLR_MODIFIER_ALT = xkb_keysym_t(1 << 3)
|
|
const WLR_MODIFIER_MOD2 = xkb_keysym_t(1 << 4)
|
|
const WLR_MODIFIER_MOD3 = xkb_keysym_t(1 << 5)
|
|
const WLR_MODIFIER_LOGO = xkb_keysym_t(1 << 6)
|
|
const WLR_MODIFIER_MOD5 = xkb_keysym_t(1 << 7)
|
|
|
|
const MODKEY = WLR_MODIFIER_ALT
|
|
|
|
#const keys = @show unsafe_wrap(Array, cglobal(:keys, Key), unsafe_load(cglobal(:KEYS_LEN, Cint)))
|
|
|
|
function spawn(cmd::Vector{String})
|
|
cmd = Base.cconvert.(Cstring, cmd)
|
|
ptrs = push!(pointer.(cmd), C_NULL)
|
|
@ccall spawn(pointer(ptrs)::Ref{Ptr{Cstring}})::Cvoid
|
|
GC.@preserve cmd ptrs
|
|
end
|
|
focusstack(x::Int) = @ccall focusstack(x::Ref{Cint})::Cvoid
|
|
killclient() = @ccall killclient(C_NULL::Ptr{Cvoid})::Cvoid
|
|
quit() = @ccall quit(C_NULL::Ptr{Cvoid})::Cvoid
|
|
|
|
const keys = Dict{Tuple{UInt32, xkb_keysym_t}, Any}(
|
|
(MODKEY, keysym(:p)) => () -> spawn(["dmenu_run"]),
|
|
(MODKEY | WLR_MODIFIER_SHIFT, keysym(:Return)) => () -> spawn(["alacritty"]),
|
|
(MODKEY, keysym(:j)) => () -> focusstack(+1),
|
|
(MODKEY, keysym(:k)) => () -> focusstack(-1),
|
|
(MODKEY | WLR_MODIFIER_SHIFT, keysym(:C)) => killclient,
|
|
(MODKEY | WLR_MODIFIER_SHIFT, keysym(:Q)) => quit,
|
|
)
|
|
|
|
#const WLR_MODIFIER_CAPS = @show unsafe_load(cglobal(:_WLR_MODIFIER_CAPS, UInt32))
|
|
cleanmask(x) = x & ~WLR_MODIFIER_CAPS
|
|
|
|
function keybinding(mods::UInt32, sym::xkb_keysym_t)::Cint
|
|
#function keybinding(ptr::Ptr{Cvoid})::Cint
|
|
# mods = unsafe_load(unsafe_load(Ptr{Ptr{UInt32}}(ptr)), 1)
|
|
# sym = unsafe_load(unsafe_load(Ptr{Ptr{xkb_keysym_t}}(ptr)), 2)
|
|
#@show mods sym
|
|
f = get(keys, (cleanmask(mods), sym), nothing)
|
|
f === nothing && return false
|
|
try Base.invokelatest(f) catch e; @show e end
|
|
return true
|
|
# handled = false
|
|
# for k in keys
|
|
# if cleanmask(mods) == cleanmask(k.mod) && sym == k.keysym && k.func != C_NULL
|
|
# ccall(k.func, Cvoid, (Ptr{Arg},), Ref(k.arg))
|
|
# handled = true
|
|
# end
|
|
# end
|
|
# return @show handled
|
|
end
|
|
|
|
end
|