-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathhow-do-i-run-my-own-function-in-the-window-loop.hs
63 lines (60 loc) · 2.11 KB
/
how-do-i-run-my-own-function-in-the-window-loop.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{-
webviewhs
(C) 2018 David Lettier
lettier.com
-}
{-# LANGUAGE
OverloadedStrings
, QuasiQuotes
#-}
import System.Random
import Data.Text
import Control.Concurrent.MVar
import Language.Javascript.JMacro
import qualified Graphics.UI.Webviewhs as WHS
main :: IO ()
main = do
counter <- newMVar (0 :: Int)
WHS.withWindowLoop
WHS.WindowParams
{ WHS.windowParamsTitle = "webviewhs - How do I run my own function in the window loop?"
-- This could be a localhost URL to your single-page application (SPA).
, WHS.windowParamsUri = "https://lettier.github.com"
, WHS.windowParamsWidth = 800
, WHS.windowParamsHeight = 600
, WHS.windowParamsResizable = True
, WHS.windowParamsDebuggable = True
}
-- This is the callback JavaScript can execute.
(\ _window text -> print text)
-- This function runs before the loop.
(WHS.WithWindowLoopSetUp (\ _window -> print ("Setting up." :: Data.Text.Text)))
-- This function runs after the loop.
(WHS.WithWindowLoopTearDown (\ _window -> print ("Tearing down." :: Data.Text.Text)))
-- This function runs every window loop.
-- Return True to continue the loop or False to exit the loop.
$ \ window -> do
counter' <- takeMVar counter
-- Every so often, change the web page background color to a random color.
if counter' >= 100000
then do
putMVar counter 0
red <- randomRIO (0 :: Int, 255)
green <- randomRIO (0 :: Int, 255)
blue <- randomRIO (0 :: Int, 255)
WHS.runJavaScript
window
[jmacro|
fun setBackgroundColor r g b {
var color = "rgba(" + r + ", " + g + ", " + b + ", 1)";
window.external.invoke("Changing the background color to " + color);
document.body.style.backgroundColor = color;
};
setTimeout(
\ -> setBackgroundColor `(red)` `(green)` `(blue)`,
1000
);
|]
else do
putMVar counter $ counter' + 1
return True