я запускаю форму на Gtk и окошко на GLUT в разных потоках, но они отказываются параллельно работать(окно глута отрисовывается 1 раз и зависает, пока не закрою гтк). Есть ли способ нормального взаимодействия Gtk и openGL в хаскеле? Вот как я пробовал если что:
import Graphics.UI.GLUT as GLUT
import Graphics.UI.Gtk as Gtk
import Control.Concurrent
gtkForm v = do
initGUI
win <- windowNew
btn <- buttonNew
ent <- entryNew
box <- vBoxNew False 10
Gtk.set win [Gtk.windowTitle := "hello world",
containerBorderWidth := 10,
containerChild := box]
Gtk.set btn [buttonLabel := "press"]
boxPackStart box btn PackGrow 0
boxPackStart box ent PackGrow 0
onClicked btn (do
t1 <- entryGetText ent
buttonGetLabel btn >>= entrySetText ent
buttonSetLabel btn t1)
windowSetDefaultSize win 200 100
windowSetPosition win WinPosCenter
onDestroy win (modifyMVar v (\a -> return (a-1,())) >> mainQuit)
widgetShowAll win
mainGUI
glutForm v = do
getArgsAndInitialize
createWindow "win"
ang <- newMVar 0
displayCallback $= onDraw ang
keyboardMouseCallback $= (Just$ inc ang)
mainLoop
modifyMVar v (\a -> return (a-1,()))
inc v _ _ _ _ = modifyMVar v (\a -> return(a+1,())) >> postRedisplay Nothing
onDraw :: MVar GLfloat -> IO()
onDraw v = do
clear [ColorBuffer]
loadIdentity
readMVar v >>= flip rotate (Vector3 0 0 1)
renderPrimitive Polygon$ mapM_ (vertex.(uncurry Vertex2)) [(0.5,0.5),(-0.5,0.5),(-0.5,-0.5),(0.5 :: GLfloat,-0.5)]
GLUT.flush
main = do
vSig <- newMVar 2
forkIO (glutForm vSig)
forkIO (gtkForm vSig)
let loop = do
q <- readMVar vSig
if q == 0
then return()
else threadDelay 10000 >> loop in
loop