diff --git a/config.mk b/config.mk index 589ab78..75e9375 100644 --- a/config.mk +++ b/config.mk @@ -7,7 +7,7 @@ PREFIX = /usr/local # Uncomment to build XWayland support CFLAGS += -DXWAYLAND -JL_BIN = ./julia/julia +JL_BIN = julia-latest #~/Documents/Julia/julia/julia #./julia/julia JL_SHARE = $(shell $(JL_BIN) -e 'print(joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia"))') CFLAGS += $(shell $(JL_BIN) $(JL_SHARE)/julia-config.jl --cflags) CXXFLAGS += $(shell $(JL_BIN) $(JL_SHARE)/julia-config.jl --cflags) diff --git a/dwl.jl b/dwl.jl index 2e909f1..5428a3f 100644 --- a/dwl.jl +++ b/dwl.jl @@ -1,14 +1,10 @@ module DWL +Base.Experimental.@compiler_options compile=min optimize=0 infer=false 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 @@ -27,49 +23,106 @@ 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) +macro dwl_function(jl_name, c_name, argtype) + return esc(quote + struct $jl_name + x::Ref{$argtype} + $jl_name(x) = new(Ref{$argtype}(x)) + end + (f::$jl_name)() = @ccall $c_name(f.x::Ref{$argtype})::Cvoid + end) +end +macro dwl_function(name) + return esc(quote + $name() = @ccall $name(C_NULL::Ptr{Cvoid})::Cvoid + end) +end + +macro MOD(key) + return :(MODKEY, $(keysym(key))) +end +macro MOD_SHIFT(key) + return :(MODKEY | WLR_MODIFIER_SHIFT, $(keysym(key))) +end +macro MOD_CTRL(key) + return :(MODKEY | WLR_MODIFIER_CTRL, $(keysym(key))) +end +macro MOD_CTRL_SHIFT(key) + return :(MODKEY | WLR_MODIFIER_CTRL | WLR_MODIFIER_SHIFT, $(keysym(key))) +end +macro TAG_KEYS(key, skey, tag) + return esc(:(( + @MOD($key) => View(1 << $tag), + @MOD_CTRL($key) => ToggleView(1 << $tag), + @MOD_SHIFT($skey) => Tag(1 << $tag), + @MOD_CTRL_SHIFT($skey) => ToggleTag(1 << $tag), + )...)) +end + const MODKEY = WLR_MODIFIER_ALT -#const keys = @show unsafe_wrap(Array, cglobal(:keys, Key), unsafe_load(cglobal(:KEYS_LEN, Cint))) +struct Spawn + cmd::Vector{String} + ptrs::Vector{Ptr{UInt8}} -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 + function Spawn(cmd::Cmd) + cmd = Base.cconvert.(Cstring, cmd.exec) + ptrs = push!(pointer.(cmd), C_NULL) + return new(cmd, ptrs) + end 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 +function (s::Spawn)() + @ccall spawn(s.ptrs::Vector{Ptr{UInt8}})::Cvoid + GC.@preserve s +end + +@dwl_function FocusStack focusstack Cint +@dwl_function IncNMaster incnmaster Cint +@dwl_function SetMFact setmfac Cfloat +@dwl_function View view Cuint +@dwl_function ToggleView toggleview Cuint +@dwl_function Tag tag Cuint +@dwl_function ToggleTag toggletag Cuint +@dwl_function zoom +@dwl_function killclient +@dwl_function togglefloating +@dwl_function togglefullscreen +@dwl_function quit 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, + @MOD(p) => Spawn(`dmenu_run`), + @MOD_SHIFT(Return) => Spawn(`alacritty`), + @MOD(j) => FocusStack(+1), + @MOD(k) => FocusStack(-1), + @MOD(i) => IncNMaster(+1), + @MOD(d) => IncNMaster(-1), + @MOD(h) => SetMFact(+0.05), + @MOD(l) => SetMFact(-0.05), + @MOD(Return) => zoom, + @MOD(Tab) => View(0), + @MOD_SHIFT(C) => killclient, + @MOD_SHIFT(space) => togglefloating, + @MOD(e) => togglefullscreen, + @MOD_SHIFT(Q) => quit, + + @TAG_KEYS(1, exclam, 0), + @TAG_KEYS(2, at, 1), + @TAG_KEYS(3, numbersign, 2), + @TAG_KEYS(4, dollar, 3), + @TAG_KEYS(5, percent, 4), + @TAG_KEYS(6, caret, 5), + @TAG_KEYS(7, ampersand, 6), + @TAG_KEYS(8, asterisk, 7), + @TAG_KEYS(9, parenleft, 8), ) -#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