Fix cimpiled ruby library system
This commit is contained in:
+18
-13
@@ -1,17 +1,25 @@
|
|||||||
module WM.Core where
|
module WM.Core where
|
||||||
|
|
||||||
import Control.Concurrent (threadDelay)
|
import Control.Concurrent (threadDelay)
|
||||||
|
import Control.Exception (bracket)
|
||||||
import Foreign (Ptr)
|
import Foreign (Ptr)
|
||||||
import System.Environment (getArgs)
|
import System.Environment (getArgs)
|
||||||
import WM.Mruby
|
import WM.Mruby
|
||||||
import WM.XKutu
|
import WM.XKutu
|
||||||
|
|
||||||
data State = State
|
data State = State
|
||||||
{ mruby_pointer :: Ptr MrbState,
|
{ mruby_pointer :: !(Ptr MrbState),
|
||||||
running :: Bool
|
running :: !Bool
|
||||||
}
|
}
|
||||||
deriving (Show)
|
deriving (Show)
|
||||||
|
|
||||||
|
newState :: Ptr MrbState -> State
|
||||||
|
newState ptr =
|
||||||
|
State
|
||||||
|
{ mruby_pointer = ptr,
|
||||||
|
running = True
|
||||||
|
}
|
||||||
|
|
||||||
run :: IO ()
|
run :: IO ()
|
||||||
run = do
|
run = do
|
||||||
is_started <- deploy
|
is_started <- deploy
|
||||||
@@ -24,11 +32,10 @@ run = do
|
|||||||
print screen_info
|
print screen_info
|
||||||
pointer_info <- get_pointer
|
pointer_info <- get_pointer
|
||||||
print pointer_info
|
print pointer_info
|
||||||
mrb <- mrb_open
|
bracket mrb_open mrb_close $ \mrb -> do
|
||||||
runRuby mrb runtimeRb
|
loadRubyLibs mrb
|
||||||
handle_args mrb
|
handle_args mrb
|
||||||
loop $ State mrb True
|
loop (newState mrb)
|
||||||
mrb_close mrb
|
|
||||||
|
|
||||||
handle_args :: Ptr MrbState -> IO ()
|
handle_args :: Ptr MrbState -> IO ()
|
||||||
handle_args mrb = do
|
handle_args mrb = do
|
||||||
@@ -41,12 +48,10 @@ handle_args mrb = do
|
|||||||
_ -> putStrLn "unknown arguments"
|
_ -> putStrLn "unknown arguments"
|
||||||
|
|
||||||
handle_event :: Maybe Event -> State -> IO State
|
handle_event :: Maybe Event -> State -> IO State
|
||||||
handle_event Nothing state = pure state
|
handle_event Nothing s = pure s
|
||||||
handle_event (Just ev) state
|
handle_event (Just ev) s
|
||||||
| event_btn ev == 24 = pure state {running = False}
|
| event_btn ev == 24 = pure s {running = False}
|
||||||
| otherwise = do
|
| otherwise = print ev >> pure s
|
||||||
print ev
|
|
||||||
pure state
|
|
||||||
|
|
||||||
loop :: State -> IO ()
|
loop :: State -> IO ()
|
||||||
loop state
|
loop state
|
||||||
|
|||||||
+13
-10
@@ -1,20 +1,11 @@
|
|||||||
{-# LANGUAGE CApiFFI #-}
|
{-# LANGUAGE CApiFFI #-}
|
||||||
{-# LANGUAGE ForeignFunctionInterface #-}
|
{-# LANGUAGE ForeignFunctionInterface #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
|
|
||||||
module WM.Mruby where
|
module WM.Mruby where
|
||||||
|
|
||||||
import Data.FileEmbed (embedFile)
|
import Foreign.C (CChar, CInt (CInt), CString, withCString)
|
||||||
import Data.Text qualified as T
|
|
||||||
import Data.Text.Encoding qualified as TE
|
|
||||||
import Data.Text.Encoding.Error qualified as TEE
|
|
||||||
import Foreign.C (CString, withCString)
|
|
||||||
import Foreign.Ptr
|
import Foreign.Ptr
|
||||||
|
|
||||||
runtimeRb :: String
|
|
||||||
runtimeRb =
|
|
||||||
T.unpack (TE.decodeUtf8With TEE.lenientDecode $(embedFile "./app/ruby/lib.rb"))
|
|
||||||
|
|
||||||
data MrbState
|
data MrbState
|
||||||
|
|
||||||
foreign import capi "mruby.h mrb_open"
|
foreign import capi "mruby.h mrb_open"
|
||||||
@@ -30,3 +21,15 @@ runRuby :: Ptr MrbState -> String -> IO ()
|
|||||||
runRuby mrb code =
|
runRuby mrb code =
|
||||||
withCString code $ \cstr ->
|
withCString code $ \cstr ->
|
||||||
c_mrb_load_string mrb cstr
|
c_mrb_load_string mrb cstr
|
||||||
|
|
||||||
|
foreign import capi "ruby_compiled.h value mgems"
|
||||||
|
c_mgems :: Ptr CChar
|
||||||
|
|
||||||
|
foreign import capi "ruby_compiled.h value mgems_len"
|
||||||
|
c_mgems_len :: CInt
|
||||||
|
|
||||||
|
foreign import capi "mruby/irep.h mrb_load_irep_buf"
|
||||||
|
c_mrb_load_irep_buf :: Ptr MrbState -> Ptr CChar -> CInt -> IO ()
|
||||||
|
|
||||||
|
loadRubyLibs :: Ptr MrbState -> IO ()
|
||||||
|
loadRubyLibs mrb = c_mrb_load_irep_buf mrb c_mgems c_mgems_len
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
puts "hello from library"
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
puts "hello from ruby"
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
puts "hello from config"
|
||||||
@@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
gnumake
|
gnumake
|
||||||
ruby
|
ruby
|
||||||
|
xxd
|
||||||
|
|
||||||
haskellPackages.ghc
|
haskellPackages.ghc
|
||||||
haskellPackages.cabal-install
|
haskellPackages.cabal-install
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ executable kutu
|
|||||||
WM.XKutu
|
WM.XKutu
|
||||||
WM.Mruby
|
WM.Mruby
|
||||||
|
|
||||||
build-depends: base, extra, bytestring, file-embed, text
|
build-depends: base, bytestring
|
||||||
|
|
||||||
hs-source-dirs: app
|
hs-source-dirs: app
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ set -e
|
|||||||
|
|
||||||
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
OUTPUT_TMP=$(mktemp)
|
OUTPUT_TMP=$(mktemp)
|
||||||
OUTPUT="$SCRIPT_DIR/../../include/binding/ruby_compiled.h"
|
OUTPUT="$SCRIPT_DIR/../../app/c/ruby_compiled.h"
|
||||||
|
|
||||||
if test "$1" = "clean"; then
|
if test "$1" = "clean"; then
|
||||||
rm -f "$OUTPUT"
|
rm -f "$OUTPUT"
|
||||||
@@ -32,8 +32,8 @@ fi
|
|||||||
echo "#ifndef MGEMS_H"
|
echo "#ifndef MGEMS_H"
|
||||||
echo "#define MGEMS_H"
|
echo "#define MGEMS_H"
|
||||||
xxd -i -n mgems $OUTPUT_TMP \
|
xxd -i -n mgems $OUTPUT_TMP \
|
||||||
| sed -e 's/^unsigned char /constexpr unsigned char /' \
|
| sed -e 's/^unsigned char /unsigned char /' \
|
||||||
-e 's/^unsigned int /constexpr unsigned int /'
|
-e 's/^unsigned int /unsigned int /'
|
||||||
echo "#endif"
|
echo "#endif"
|
||||||
} > "$OUTPUT"
|
} > "$OUTPUT"
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
puts "hello from lib"
|
||||||
Reference in New Issue
Block a user