-- Copyright 2006 mutantlemon.com module GuiTest02 where import qualified Control.Exception as C import Maybe(fromJust) import Data.IORef import Data.Word import Data.Array.IArray import Data.Array.MArray import Text.Printf import Graphics.UI.Gtk import Graphics.UI.Gtk.Glade import RomImage import GuiDrawUtil import Machine gladeFile = "guis/test02/test02.glade" test02 :: IO () test02 = do initGUI windowXml <- C.catch ((xmlNew gladeFile) >>= return . fromJust) (\e -> putStrLn ("Error Loading " ++ gladeFile) >> C.throwIO e) let bindWidget x y = xmlGetWidget windowXml x y main_window <- bindWidget castToWindow "main_window" menu_open <- bindWidget castToMenuItem "menu_open" menu_quit <- bindWidget castToMenuItem "menu_quit" menu_about <- bindWidget castToMenuItem "menu_about" display <- bindWidget castToDrawingArea "display" displayPixBuf <- pixbufNew ColorspaceRgb False 8 160 144 pbData <- (pixbufGetPixels displayPixBuf :: IO (PixbufData Int Word8)) row <- pixbufGetRowstride displayPixBuf chan <- pixbufGetNChannels displayPixBuf bits <- pixbufGetBitsPerSample displayPixBuf state <- newIORef Nothing -- for video capture, counts the current frame number --n <- newIORef (0::Int) let ------------------------------------------------------------------------ refreshDisplay d = do -- draw into the Pixbuf doFromTo 0 143 $ \y -> doFromTo 0 159 $ \x -> do let color = d!(y, x) colorByte = (fromIntegral color) * 85 writeArray pbData (x*chan+y*row) colorByte writeArray pbData (1+x*chan+y*row) colorByte writeArray pbData (2+x*chan+y*row) colorByte widgetQueueDraw display ------------------------------------------------------------------------ step = do s <- readIORef state case s of Nothing -> return () Just s' -> do let (d, s'') = updateMachineDisplayFrame s' writeIORef state (Just s'') refreshDisplay d --- for video capture, dump current frame to png file --num <- readIORef n --pixbufSave displayPixBuf ("tmp/f" ++ (printf "%04d" num) ++ ".png") "png" [] --modifyIORef n (+1) --- return True ------------------------------------------------------------------------ ------------------------------------------------------------------------ open = do fileSelect <- fileChooserDialogNew (Just "Open Game Boy ROM") (Just main_window) FileChooserActionOpen [("gtk-open", ResponseOk), ("gtk-cancel", ResponseDeleteEvent)] response <- dialogRun fileSelect case response of ResponseOk -> do romFile <- fileChooserGetFilename fileSelect romImage <- loadRomImage (fromJust romFile) writeIORef state $ Just (initialMachineState romImage) ResponseDeleteEvent -> do return () widgetDestroy fileSelect -- register Idle action ------------------------------------------------------------------------ quit = widgetDestroy main_window >> mainQuit ------------------------------------------------------------------------ menu_quit `onActivateLeaf` quit main_window `onDestroy` quit menu_open `onActivateLeaf` open menu_about `onActivateLeaf` do dia <- aboutDialogNew aboutDialogSetName dia "OmegaGB test01" aboutDialogSetCopyright dia "Copyright 2006 bit@mutantlemon.com" aboutDialogSetComments dia "Game Boy Emulator Development Test" aboutDialogSetWebsite dia "http://www.mutantlemon.com/omegagb" aboutDialogSetAuthors dia [""] dialogRun dia widgetDestroy dia display `onSizeRequest` return (Requisition 160 144) display `onExpose` updateCanvas display displayPixBuf idleAdd step priorityDefaultIdle mainGUI return ()