clutterhs-0.1: Graphics/UI/Clutter/General.chs
-- -*-haskell-*-
-- Clutter General
--
-- Author : Matthew Arsenault
--
-- Created: 11 Sep 2009
--
-- Copyright (C) 2009 Matthew Arsenault
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public
-- License as published by the Free Software Foundation; either
-- version 3 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Lesser General Public License for more details.
--
{-# LANGUAGE ForeignFunctionInterface #-}
#include <clutter/clutter.h>
#include <pango/pango.h>
{# context lib="clutter" prefix="clutter" #}
module Graphics.UI.Clutter.General (
-- * Types
InitError(..),
FontFlags(..),
-- * General functions
clutterInit,
clutterMain,
mainQuit,
mainLevel,
getDebugEnabled,
getShowFps,
getTimestamp,
getActorByGid,
setDefaultFrameRate,
getDefaultFrameRate,
setMotionEventsEnabled,
getMotionEventsEnabled,
clearGlyphCache,
setFontFlags,
getFontFlags,
getFontMap,
getKeyboardGrab,
getPointerGrab,
grabKeyboard,
grabPointer,
ungrabKeyboard,
ungrabPointer,
grabPointerForDevice,
ungrabPointerForDevice,
--doEvent
) where
{# import Graphics.UI.Clutter.Types #}
{# import Graphics.UI.Clutter.Utility #}
import C2HS
import System.Glib.GObject
import Graphics.UI.Gtk.Pango.Types
import Graphics.UI.Gtk.Types (FontMap, mkFontMap)
import System.Glib.UTFString
import System.Environment (getProgName, getArgs)
import Control.Monad (liftM, when)
-- | Starts the Clutter mainloop.
{# fun main as clutterMain { } -> `()' #}
-- | Terminates the Clutter mainloop.
{# fun main_quit as ^ { } -> `()' #}
-- | Retrieves the depth of the Clutter mainloop.
--
-- [@Returns@] The level of the mainloop.
--
{# fun main_level as ^ { } -> `Int' #}
--just make it go for now. I think some issues with it
--out args? do they matter? also how to use out marshallers correctly
clutterInit :: IO InitError
clutterInit = do
prog <- getProgName
args <- getArgs
let allArgs = (prog:args)
withMany withUTFString allArgs $ \addrs ->
withArrayLen addrs $ \argc argv ->
with argv $ \argvp ->
with argc $ \argcp -> do
res <- liftM cToEnum $ {# call unsafe init #} (castPtr argcp) (castPtr argvp)
when (res /= InitSuccess) $ error ("Cannot initialize Clutter." ++ show res)
return res
-- | Check if clutter has debugging turned on.
--
-- [@Returns@] @True@ if debugging is turned on, @False@ otherwise.
--
{# fun unsafe get_debug_enabled as ^ { } -> `Bool' #}
-- | Returns whether Clutter should print out the frames per second on
-- the console. You can enable this setting either using the
-- CLUTTER_SHOW_FPS environment variable or passing the
-- --clutter-show-fps command line argument. *
--
-- [@Returns@] @True@ if Clutter should show the FPS.
--
-- * Since 0.4
--
{# fun unsafe get_show_fps as ^ { } -> `Bool' #}
-- | Returns the approximate number of microseconds passed since
-- clutter was intialised.
--
-- [@Returns@] Number of microseconds since 'clutterInit' was called.
--
{# fun unsafe get_timestamp as ^ { } -> `Timestamp' cIntConv #}
-- | Retrieves the ClutterActor with id.
--
-- [@id@] a ClutterActor ID.
--
-- [@Returns@] @Just@ an Actor or @Nothing@
--
-- * Since 0.6
--
{# fun unsafe get_actor_by_gid as ^ { cIntConv `GID' } -> `Maybe Actor' maybeNewActor* #}
-- | Sets the default frame rate. This frame rate will be used to
-- limit the number of frames drawn if Clutter is not able to
-- synchronize with the vertical refresh rate of the display. When
-- synchronization is possible, this value is ignored.
--
-- [@frames_per_sec@] the new default frame rate
--
-- * Since 0.6
--
{# fun unsafe set_default_frame_rate as ^ { cIntConv `Word' } -> `()' #}
-- | Retrieves the default frame rate. See 'setDefaultFrameRate'.
--
-- [@Returns@] the default frame rate
--
-- * Since 0.6
--
{# fun unsafe get_default_frame_rate as ^ { } -> `Word' cIntConv #}
-- | Sets whether per-actor motion events should be enabled or not
-- (the default is to enable them).
--
-- If enable is @False@ the following events will not work:
--
-- 'Actor'::'motionEvent', unless on the 'Stage'
--
-- 'Actor'::'enterEvent'
--
-- 'Actor'::'leaveEvent'
--
-- [@enable@] @True@ to enable per-actor motion events
--
-- * Since 0.6
--
{# fun unsafe set_motion_events_enabled as ^ { `Bool' } -> `()' #}
-- | Gets whether the per-actor motion events are enabled.
--
-- [@Returns@] @True@ if the motion events are enabled
--
-- * Since 0.6
--
{# fun unsafe get_motion_events_enabled as ^ { } -> `Bool' #}
-- | Clears the internal cache of glyphs used by the Pango
-- renderer. This will free up some memory and GL texture
-- resources. The cache will be automatically refilled as more text
-- is drawn.
--
-- * Since 0.8
--
{# fun unsafe clear_glyph_cache as ^ { } -> `()' #}
-- | Sets the font quality options for subsequent text rendering
-- operations.
--
-- Using mipmapped textures will improve the quality for scaled down
-- text but will use more texture memory.
--
-- Enabling hinting improves text quality for static text but may
-- introduce some artifacts if the text is animated.
--
-- [@flags@] The new flags
--
-- * Since 1.0
--
{# fun unsafe set_font_flags as ^ { cFromFlags `[FontFlags]' } -> `()' #}
-- | Gets the current font flags for rendering text. See 'setFontFlags'.
--
-- [@Returns@] The font flags
--
-- * Since 1.0
--
{# fun unsafe get_font_flags as ^ { } -> `[FontFlags]' cToFlags #}
{# pointer *PangoFontMap as FontMapPtr foreign -> FontMap nocode #}
-- | Retrieves the PangoFontMap instance used by Clutter. You can use
-- the global font map object with the COGL Pango API.
--
-- * Since 1.0
--
getFontMap :: IO FontMap
getFontMap = makeNewGObject mkFontMap $ {# call unsafe get_font_map #}
--TODO: What about threads and timeouts etc.
-- | Queries the current keyboard grab of clutter.
--
-- [@Returns@] @Just@ the actor currently holding the keyboard grab,
-- or @Nothing@ if there is no grab.. transfer none.
--
-- * Since 0.6
--
{# fun unsafe get_keyboard_grab as ^ { } -> `Maybe Actor' maybeNewActor* #}
-- | Queries the current pointer grab of clutter.
--
-- [@Returns@] @Just@ the actor currently holding the pointer grab, or
-- @Nothing@ if there is no grab.
--
-- * Since 0.6
--
{# fun unsafe get_pointer_grab as ^ { } -> `Maybe Actor' maybeNewActor* #}
-- | Grabs keyboard events, after the grab is done keyboard events
-- ('keyPressEvent' and 'keyReleaseEvent') are delivered to this
-- actor directly. The source set in the event will be the actor
-- that would have received the event if the keyboard grab was not
-- in effect.
--
-- Like pointer grabs, keyboard grabs should only be used as a last
-- resource.
--
-- See also 'stageSetKeyFocus' and 'actorGrabKeyFocus' to perform a
-- \"soft\" key grab and assign key focus to a specific actor.
--
-- [@actor@] an Actor
--
-- * Since 0.6
--
{# fun unsafe grab_keyboard as ^ { withActor* `Actor' } -> `()' #}
-- | Grabs pointer events, after the grab is done all pointer related
-- events (press, motion, release, enter, leave and scroll) are
-- delivered to this actor directly without passing through both
-- capture and bubble phases of the event delivery chain. The source
-- set in the event will be the actor that would have received the
-- event if the pointer grab was not in effect.
--
-- * Note
--
-- Grabs completely override the entire event delivery chain done by
-- Clutter. Pointer grabs should only be used as a last resource;
-- using the 'capturedEvent' signal should always be the preferred way
-- to intercept event delivery to reactive actors.
--
-- If you wish to grab all the pointer events for a specific input
-- device, you should use 'grabPointerForDevice'.
--
-- [@actor@] an Actor
--
-- * Since 0.6
--
{# fun unsafe grab_pointer as ^ { withActor* `Actor' } -> `()' #}
-- | Removes an existing grab of the keyboard.
--
-- * Since 0.6
--
{# fun unsafe ungrab_keyboard as ^ { } -> `()' #}
-- | Removes an existing grab of the pointer.
--
-- * Since 0.6
--
{# fun unsafe ungrab_pointer as ^ { } -> `()' #}
-- | Grabs all the pointer events coming from the device id for actor.
--
-- If id is -1 then this function is equivalent to 'grabPointer'.
--
-- [@actor@] an Actor
--
-- [@id@] a device id, or -1
--
-- * Since 0.8
--
{# fun unsafe grab_pointer_for_device as ^ { withActor* `Actor', `Int' } -> `()' #}
-- | Removes an existing grab of the pointer events for device id.
--
-- [@id@] a device id
--
-- * Since 0.8
--
{# fun unsafe ungrab_pointer_for_device as ^ { `Int' } -> `()' #}
--{# fun unsafe clutter_do_event { withEvent* `Event' } -> `()' #}