gtk-0.12.0: Graphics/UI/Gtk/General/IconTheme.chs
{-# LANGUAGE CPP #-}
-- -*-haskell-*-
-- GIMP Toolkit (GTK) Widget IconTheme
--
-- Author : Andy Stewart
--
-- Created: 28 Mar 2010
--
-- Copyright (C) 2010 Andy Stewart
--
-- 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 2.1 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.
--
-- |
-- Maintainer : gtk2hs-users@lists.sourceforge.net
-- Stability : provisional
-- Portability : portable (depends on GHC)
--
-- Looking up icons by name
--
-- * Module available since Gtk+ version 2.4
--
module Graphics.UI.Gtk.General.IconTheme (
-- * Detail
--
-- | 'IconTheme' provides a facility for looking up icons by name and size. The main reason for using a
-- name rather than simply providing a filename is to allow different icons to be used depending on
-- what icon theme is selecetd by the user. The operation of icon themes on Linux and Unix follows the
-- Icon Theme Specification. There is a default icon theme, named hicolor where applications should
-- install their icons, but more additional application themes can be installed as operating system
-- vendors and users choose.
--
-- Named icons are similar to the Themeable Stock Images facility, and the distinction between the
-- two may be a bit confusing. A few things to keep in mind:
--
-- * Stock images usually are used in conjunction with Stock Items, such as ''StockOk'' or
-- ''StockOpen''. Named icons are easier to set up and therefore are more useful for new icons
-- that an application wants to add, such as application icons or window icons.
--
-- * Stock images can only be loaded at the symbolic sizes defined by the 'IconSize' enumeration, or
-- by custom sizes defined by 'iconSizeRegister', while named icons are more flexible and any
-- pixel size can be specified.
--
-- * Because stock images are closely tied to stock items, and thus to actions in the user interface,
-- stock images may come in multiple variants for different widget states or writing directions.
--
-- A good rule of thumb is that if there is a stock image for what you want to use, use it, otherwise
-- use a named icon. It turns out that internally stock images are generally defined in terms of one or
-- more named icons. (An example of the more than one case is icons that depend on writing direction;
-- ''StockGoForward'' uses the two themed icons 'gtkStockGoForwardLtr' and
-- 'gtkStockGoForwardRtl'.)
--
-- In many cases, named themes are used indirectly, via 'Image' or stock items, rather than directly,
-- but looking up icons directly is also simple. The 'IconTheme' object acts as a database of all the
-- icons in the current theme. You can create new 'IconTheme' objects, but its much more efficient to
-- use the standard icon theme for the 'Screen' so that the icon information is shared with other
-- people looking up icons. In the case where the default screen is being used, looking up an icon can
-- be as simple as:
-- * Class Hierarchy
-- |
-- @
-- | 'GObject'
-- | +----IconTheme
-- @
#if GTK_CHECK_VERSION(2,4,0)
-- * Types
IconTheme,
IconThemeClass,
castToIconTheme,
toIconTheme,
IconInfo,
-- * Enums
IconLookupFlags(..),
IconThemeError(..),
-- * Constructors
iconThemeNew,
#if GTK_CHECK_VERSION(2,14,0)
iconInfoNewForPixbuf,
#endif
-- * Methods
iconThemeGetDefault,
iconThemeGetForScreen,
iconThemeSetScreen,
iconThemeSetSearchPath,
iconThemeGetSearchPath,
iconThemeAppendSearchPath,
iconThemePrependSearchPath,
iconThemeSetCustomTheme,
iconThemeHasIcon,
iconThemeLookupIcon,
#if GTK_CHECK_VERSION(2,12,0)
iconThemeChooseIcon,
#ifdef HAVE_GIO
#if GTK_CHECK_VERSION(2,14,0)
iconThemeLookupByGIcon,
#endif
#endif
#endif
iconThemeLoadIcon,
#if GTK_CHECK_VERSION(2,12,0)
iconThemeListContexts,
#endif
iconThemeListIcons,
#if GTK_CHECK_VERSION(2,6,0)
iconThemeGetIconSizes,
#endif
iconThemeGetExampleIconName,
iconThemeRescanIfNeeded,
iconThemeAddBuiltinIcon,
iconThemeErrorQuark,
iconInfoCopy,
iconInfoGetAttachPoints,
iconInfoGetBaseSize,
iconInfoGetBuiltinPixbuf,
iconInfoGetDisplayName,
iconInfoGetEmbeddedRect,
iconInfoGetFilename,
iconInfoLoadIcon,
iconInfoSetRawCoordinates,
-- * Signals
iconThemeChanged,
#endif
) where
import Control.Monad (liftM)
import System.Glib.FFI
import System.Glib.Attributes
import System.Glib.Properties
import System.Glib.UTFString
import System.Glib.GList
import System.Glib.Flags
import System.Glib.GObject (wrapNewGObject, makeNewGObject, Quark)
import System.Glib.GError (GErrorDomain, GErrorClass(..), propagateGError)
import Graphics.UI.Gtk.General.Structs (Rectangle, Point)
{#import Graphics.UI.Gtk.Types#}
{#import Graphics.UI.Gtk.Signals#}
#ifdef HAVE_GIO
{#import System.GIO.Types#}
#endif
{# context lib="gtk" prefix="gtk" #}
#if GTK_CHECK_VERSION(2,4,0)
--------------------
-- Enums
{#enum IconLookupFlags {underscoreToCase} deriving (Bounded,Eq,Show)#}
{#enum IconThemeError {underscoreToCase} deriving (Bounded,Eq,Show)#}
--------------------
-- Constructors
-- | Creates a new icon theme object. Icon theme objects are used to lookup up
-- an icon by name in a particular icon theme. Usually, you'll want to use
-- 'iconThemeGetDefault' or 'iconThemeGetForScreen' rather than creating a new
-- icon theme object for scratch.
--
iconThemeNew :: IO IconTheme
iconThemeNew =
wrapNewGObject mkIconTheme $
{# call gtk_icon_theme_new #}
--------------------
-- Methods
-- | Gets the icon theme for the default screen. See 'iconThemeGetForScreen'.
--
iconThemeGetDefault ::
IO IconTheme -- ^ returns A unique 'IconTheme' associated with the default
-- screen. This icon theme is associated with the screen and
-- can be used as long as the screen is open.
iconThemeGetDefault =
makeNewGObject mkIconTheme $
{# call gtk_icon_theme_get_default #}
-- | Gets the icon theme object associated with @screen@; if this function has
-- not previously been called for the given screen, a new icon theme object
-- will be created and associated with the screen. Icon theme objects are
-- fairly expensive to create, so using this function is usually a better
-- choice than calling than 'iconThemeNew' and setting the screen yourself; by
-- using this function a single icon theme object will be shared between users.
--
iconThemeGetForScreen ::
Screen -- ^ @screen@ - a 'Screen'
-> IO IconTheme -- ^ returns A unique 'IconTheme' associated with the given
-- screen.
iconThemeGetForScreen screen =
makeNewGObject mkIconTheme $
{# call gtk_icon_theme_get_for_screen #}
screen
-- | Sets the screen for an icon theme; the screen is used to track the user's
-- currently configured icon theme, which might be different for different
-- screens.
--
iconThemeSetScreen :: IconThemeClass self => self
-> Screen -- ^ @screen@ - a 'Screen'
-> IO ()
iconThemeSetScreen self screen =
{# call gtk_icon_theme_set_screen #}
(toIconTheme self)
screen
-- | Sets the search path for the icon theme object. When looking for an icon
-- theme, Gtk+ will search for a subdirectory of one or more of the directories
-- in @path@ with the same name as the icon theme. (Themes from multiple of the
-- path elements are combined to allow themes to be extended by adding icons in
-- the user's home directory.)
--
-- In addition if an icon found isn't found either in the current icon theme
-- or the default icon theme, and an image file with the right name is found
-- directly in one of the elements of @path@, then that image will be used for
-- the icon name. (This is legacy feature, and new icons should be put into the
-- default icon theme, which is called DEFAULT_THEME_NAME, rather than directly
-- on the icon path.)
--
iconThemeSetSearchPath :: IconThemeClass self => self
-> [FilePath] -- ^ @path@ - list of directories that are searched for icon
-- themes
-> Int -- ^ @nElements@ - number of elements in @path@.
-> IO ()
iconThemeSetSearchPath self path nElements =
withUTFStringArray path $ \pathPtr ->
{# call gtk_icon_theme_set_search_path #}
(toIconTheme self)
pathPtr
(fromIntegral nElements)
-- | Gets the current search path. See 'iconThemeSetSearchPath'.
--
iconThemeGetSearchPath :: IconThemeClass self => self
-> IO ([FilePath], Int) -- ^ @(path, nElements)@
-- @path@ - location to store a list of icon theme path
-- directories.
iconThemeGetSearchPath self =
alloca $ \nElementsPtr ->
allocaArray 0 $ \pathPtr -> do
{# call gtk_icon_theme_get_search_path #}
(toIconTheme self)
(castPtr pathPtr)
nElementsPtr
pathStr <- readUTFStringArray0 pathPtr
nElements <- peek nElementsPtr
return (pathStr, fromIntegral nElements)
-- | Appends a directory to the search path. See 'iconThemeSetSearchPath'.
--
iconThemeAppendSearchPath :: IconThemeClass self => self
-> FilePath -- ^ @path@ - directory name to append to the icon path
-> IO ()
iconThemeAppendSearchPath self path =
withUTFString path $ \pathPtr ->
{# call gtk_icon_theme_append_search_path #}
(toIconTheme self)
pathPtr
-- | Prepends a directory to the search path. See 'iconThemeSetSearchPath'.
--
iconThemePrependSearchPath :: IconThemeClass self => self
-> FilePath -- ^ @path@ - directory name to prepend to the icon path
-> IO ()
iconThemePrependSearchPath self path =
withUTFString path $ \pathPtr ->
{# call gtk_icon_theme_prepend_search_path #}
(toIconTheme self)
pathPtr
-- | Sets the name of the icon theme that the 'IconTheme' object uses
-- overriding system configuration. This function cannot be called on the icon
-- theme objects returned from 'iconThemeGetDefault' and
-- 'iconThemeGetForScreen'.
--
iconThemeSetCustomTheme :: IconThemeClass self => self
-> (Maybe String) -- ^ @themeName@ name of icon theme to use instead of configured theme, or 'Nothing' to unset a previously set custom theme
-> IO ()
iconThemeSetCustomTheme self themeName =
maybeWith withUTFString themeName $ \themeNamePtr ->
{# call gtk_icon_theme_set_custom_theme #}
(toIconTheme self)
themeNamePtr
-- | Checks whether an icon theme includes an icon for a particular name.
--
iconThemeHasIcon :: IconThemeClass self => self
-> String -- ^ @iconName@ - the name of an icon
-> IO Bool -- ^ returns @True@ if @iconTheme@ includes an icon for
-- @iconName@.
iconThemeHasIcon self iconName =
liftM toBool $
withUTFString iconName $ \iconNamePtr ->
{# call gtk_icon_theme_has_icon #}
(toIconTheme self)
iconNamePtr
-- | Looks up a named icon and returns a structure containing information such
-- as the filename of the icon. The icon can then be rendered into a pixbuf
-- using 'iconInfoLoadIcon'. ('iconThemeLoadIcon' combines these two steps if
-- all you need is the pixbuf.)
--
iconThemeLookupIcon :: IconThemeClass self => self
-> String -- ^ @iconName@ - the name of the icon to lookup
-> Int -- ^ @size@ - desired icon size
-> IconLookupFlags -- ^ @flags@ - flags modifying the behavior of the
-- icon lookup
-> IO (Maybe IconInfo) -- ^ returns a 'IconInfo'
-- structure containing information about the icon, or
-- 'Nothing' if the icon wasn't found.
iconThemeLookupIcon self iconName size flags =
withUTFString iconName $ \iconNamePtr -> do
iiPtr <- {# call gtk_icon_theme_lookup_icon #}
(toIconTheme self)
iconNamePtr
(fromIntegral size)
((fromIntegral . fromEnum) flags)
if iiPtr == nullPtr
then return Nothing
else liftM Just (mkIconInfo (castPtr iiPtr))
#if GTK_CHECK_VERSION(2,12,0)
-- | Looks up a named icon and returns a structure containing information such
-- as the filename of the icon. The icon can then be rendered into a pixbuf
-- using 'iconInfoLoadIcon'. ('iconThemeLoadIcon' combines these two steps if
-- all you need is the pixbuf.)
--
-- If @iconNames@ contains more than one name, this function tries them all
-- in the given order before falling back to inherited icon themes.
--
-- * Available since Gtk+ version 2.12
--
iconThemeChooseIcon :: IconThemeClass self => self
-> [String] -- ^ @iconNames@ terminated list of icon names to lookup
-> Int -- ^ @size@ - desired icon size
-> IconLookupFlags -- ^ @flags@ - flags modifying the behavior of the
-- icon lookup
-> IO (Maybe IconInfo) -- ^ returns a 'IconInfo'
-- structure containing information about the icon, or
-- 'Nothing' if the icon wasn't found.
iconThemeChooseIcon self iconNames size flags =
withUTFStringArray0 iconNames $ \iconNamesPtr -> do
iiPtr <- {# call gtk_icon_theme_choose_icon #}
(toIconTheme self)
iconNamesPtr
(fromIntegral size)
((fromIntegral . fromEnum) flags)
if iiPtr == nullPtr
then return Nothing
else liftM Just (mkIconInfo (castPtr iiPtr))
#ifdef HAVE_GIO
#if GTK_CHECK_VERSION(2,14,0)
-- | Looks up an icon and returns a structure containing information such as
-- the filename of the icon. The icon can then be rendered into a pixbuf using
-- 'iconInfoLoadIcon'.
--
-- * Available since Gtk+ version 2.14
--
iconThemeLookupByGIcon :: (IconThemeClass self, IconClass icon) => self
-> icon -- ^ @icon@ - the 'Icon' to look up
-> Int -- ^ @size@ - desired icon size
-> IconLookupFlags -- ^ @flags@ - flags modifying the behavior of the
-- icon lookup
-> IO (Maybe IconInfo) -- ^ returns a 'IconInfo'
-- structure containing information about the icon, or
-- 'Nothing' if the icon wasn't found.
iconThemeLookupByGIcon self icon size flags = do
iiPtr <- {# call gtk_icon_theme_lookup_by_gicon #}
(toIconTheme self)
(toIcon icon)
(fromIntegral size)
((fromIntegral . fromEnum) flags)
if iiPtr == nullPtr
then return Nothing
else liftM Just (mkIconInfo (castPtr iiPtr))
#endif
#endif
#endif
-- | Looks up an icon in an icon theme, scales it to the given size and
-- renders it into a pixbuf. This is a convenience function; if more details
-- about the icon are needed, use 'iconThemeLookupIcon' followed by
-- 'iconInfoLoadIcon'.
--
-- Note that you probably want to listen for icon theme changes and update
-- the icon. This is usually done by connecting to the 'Widget'::style-set
-- signal. If for some reason you do not want to update the icon when the icon
-- theme changes, you should consider using 'pixbufCopy' to make a private copy
-- of the pixbuf returned by this function. Otherwise Gtk+ may need to keep the
-- old icon theme loaded, which would be a waste of memory.
--
iconThemeLoadIcon :: IconThemeClass self => self
-> String -- ^ @iconName@ - the name of the icon to lookup
-> Int -- ^ @size@ - the desired icon size. The resulting icon
-- may not be exactly this size; see 'iconInfoLoadIcon'.
-> IconLookupFlags -- ^ @flags@ - flags modifying the behavior of the icon
-- lookup
-> IO (Maybe Pixbuf) -- ^ returns the rendered icon; this may be a newly
-- created icon or a new reference to an internal icon,
-- so you must not modify the icon.
-- `Nothing` if the icon isn't found.
iconThemeLoadIcon self iconName size flags =
maybeNull (wrapNewGObject mkPixbuf) $
propagateGError $ \errorPtr ->
withUTFString iconName $ \iconNamePtr ->
{# call gtk_icon_theme_load_icon #}
(toIconTheme self)
iconNamePtr
(fromIntegral size)
((fromIntegral . fromEnum) flags)
errorPtr
#if GTK_CHECK_VERSION(2,12,0)
-- | Gets the list of contexts available within the current hierarchy of icon
-- themes
--
-- * Available since Gtk+ version 2.12
--
iconThemeListContexts :: IconThemeClass self => self
-> IO [String] -- ^ returns a String list
-- holding the names of all the contexts in the
-- theme.
iconThemeListContexts self = do
glistPtr <- {# call gtk_icon_theme_list_contexts #} (toIconTheme self)
list <- fromGList glistPtr
result <- mapM readUTFString list
{#call unsafe g_list_free #} (castPtr glistPtr)
return result
#endif
-- | Lists the icons in the current icon theme. Only a subset of the icons can
-- be listed by providing a context string. The set of values for the context
-- string is system dependent, but will typically include such values as
-- \"Applications\" and \"MimeTypes\".
--
iconThemeListIcons :: IconThemeClass self => self
-> (Maybe String) -- ^ @context@ a string identifying a particular type of icon, or 'Nothing' to list all icons.
-> IO [String] -- ^ returns a String list
-- holding the names of all the icons in the theme.
iconThemeListIcons self context =
maybeWith withUTFString context $ \contextPtr -> do
glistPtr <- {# call gtk_icon_theme_list_icons #}
(toIconTheme self)
contextPtr
list <- fromGList glistPtr
result <- mapM readUTFString list
{#call unsafe g_list_free#} (castPtr glistPtr)
return result
#if GTK_CHECK_VERSION(2,6,0)
-- | Returns an list of integers describing the sizes at which the icon is
-- available without scaling. A size of -1 means that the icon is available in
-- a scalable format. The list is zero-terminated.
--
-- * Available since Gtk+ version 2.6
--
iconThemeGetIconSizes :: IconThemeClass self => self
-> String -- ^ @iconName@ - the name of an icon
-> IO [Int] -- ^ returns An newly allocated list describing the sizes at
-- which the icon is available.
iconThemeGetIconSizes self iconName =
withUTFString iconName $ \iconNamePtr -> do
listPtr <- {# call gtk_icon_theme_get_icon_sizes #}
(toIconTheme self)
iconNamePtr
list <- peekArray 0 listPtr
{#call unsafe g_free #} (castPtr listPtr)
return (map fromIntegral list)
#endif
-- | Gets the name of an icon that is representative of the current theme (for
-- instance, to use when presenting a list of themes to the user.)
--
iconThemeGetExampleIconName :: IconThemeClass self => self
-> IO (Maybe String) -- ^ returns the name of an example icon or `Nothing'
iconThemeGetExampleIconName self = do
namePtr <- {# call gtk_icon_theme_get_example_icon_name #} (toIconTheme self)
if namePtr == nullPtr
then return Nothing
else liftM Just $ readUTFString namePtr
-- | Checks to see if the icon theme has changed; if it has, any currently
-- cached information is discarded and will be reloaded next time @iconTheme@
-- is accessed.
--
iconThemeRescanIfNeeded :: IconThemeClass self => self
-> IO Bool -- ^ returns @True@ if the icon theme has changed and needed to be
-- reloaded.
iconThemeRescanIfNeeded self =
liftM toBool $
{# call gtk_icon_theme_rescan_if_needed #}
(toIconTheme self)
-- | Registers a built-in icon for icon theme lookups. The idea of built-in
-- icons is to allow an application or library that uses themed icons to
-- function requiring files to be present in the file system. For instance, the
-- default images for all of Gtk+'s stock icons are registered as built-icons.
--
-- In general, if you use 'iconThemeAddBuiltinIcon' you should also install
-- the icon in the icon theme, so that the icon is generally available.
--
-- This function will generally be used with pixbufs loaded via
-- 'pixbufNewFromInline'.
--
iconThemeAddBuiltinIcon ::
String -- ^ @iconName@ - the name of the icon to register
-> Int -- ^ @size@ - the size at which to register the icon (different
-- images can be registered for the same icon name at different
-- sizes.)
-> Pixbuf -- ^ @pixbuf@ - 'Pixbuf' that contains the image to use for
-- @iconName@.
-> IO ()
iconThemeAddBuiltinIcon iconName size pixbuf =
withUTFString iconName $ \iconNamePtr ->
{# call gtk_icon_theme_add_builtin_icon #}
iconNamePtr
(fromIntegral size)
pixbuf
-- |
--
iconThemeErrorQuark :: IO Quark
iconThemeErrorQuark =
{# call gtk_icon_theme_error_quark #}
--------------------
-- Types
{#pointer *IconInfo foreign newtype#}
foreign import ccall unsafe ">k_icon_info_free"
icon_info_free :: FinalizerPtr IconInfo
-- | Helper function for build 'IconInfo'
mkIconInfo :: Ptr IconInfo -> IO IconInfo
mkIconInfo infoPtr =
liftM IconInfo $ newForeignPtr infoPtr icon_info_free
--------------------
-- Constructors
#if GTK_CHECK_VERSION(2,14,0)
-- |
--
iconInfoNewForPixbuf :: IconThemeClass iconTheme => iconTheme -> Pixbuf -> IO IconInfo
iconInfoNewForPixbuf iconTheme pixbuf =
{# call gtk_icon_info_new_for_pixbuf #}
(toIconTheme iconTheme)
pixbuf
>>= mkIconInfo
#endif
--------------------
-- Methods
-- |
--
iconInfoCopy :: IconInfo -> IO IconInfo
iconInfoCopy self =
{# call gtk_icon_info_copy #} self
>>= mkIconInfo
-- | Fetches the set of attach points for an icon. An attach point is a location in the icon that can be
-- used as anchor points for attaching emblems or overlays to the icon.
iconInfoGetAttachPoints :: IconInfo -> IO (Maybe [Point])
iconInfoGetAttachPoints self =
alloca $ \arrPtrPtr ->
alloca $ \nPointsPtr -> do
success <- liftM toBool $
{# call gtk_icon_info_get_attach_points #}
self
(castPtr arrPtrPtr)
nPointsPtr
if success
then do
arrPtr <- peek arrPtrPtr
nPoints <- peek nPointsPtr
pointList <- peekArray (fromIntegral nPoints) arrPtr
{#call unsafe g_free#} (castPtr arrPtr)
return $ Just pointList
else return Nothing
-- | Gets the base size for the icon. The base size is a size for the icon that was specified by the icon
-- theme creator. This may be different than the actual size of image; an example of this is small
-- emblem icons that can be attached to a larger icon. These icons will be given the same base size as
-- the larger icons to which they are attached.
--
iconInfoGetBaseSize :: IconInfo -> IO Int
iconInfoGetBaseSize self =
liftM fromIntegral $
{# call gtk_icon_info_get_base_size #} self
-- | Gets the built-in image for this icon, if any. To allow GTK+ to use built in icon images, you must
-- pass the ''IconLookupUseBuiltin'' to 'iconThemeLookupIcon'.
iconInfoGetBuiltinPixbuf :: IconInfo
-> IO (Maybe Pixbuf) -- ^ returns the built-in image pixbuf, or 'Nothing'.
iconInfoGetBuiltinPixbuf self = do
pixbufPtr <- {# call gtk_icon_info_get_builtin_pixbuf #} self
if pixbufPtr == nullPtr
then return Nothing
else liftM Just $ makeNewGObject mkPixbuf (return pixbufPtr)
-- | Gets the display name for an icon. A display name is a string to be used in place of the icon name
-- in a user visible context like a list of icons.
iconInfoGetDisplayName :: IconInfo
-> IO (Maybe String) -- ^ returns the display name for the icon or 'Nothing', if the icon doesn't have a specified display name.
iconInfoGetDisplayName self = do
strPtr <- {# call gtk_icon_info_get_display_name #} self
if strPtr == nullPtr
then return Nothing
else liftM Just $ peekUTFString strPtr
-- | Gets the coordinates of a rectangle within the icon that can be used for display of information such
-- as a preview of the contents of a text file. See 'iconInfoSetRawCoordinates' for further
-- information about the coordinate system.
iconInfoGetEmbeddedRect :: IconInfo
-> IO (Maybe Rectangle) -- ^ @rectangle@ 'Rectangle' in which to store embedded
-- rectangle coordinates.
iconInfoGetEmbeddedRect self =
alloca $ \rectPtr -> do
success <- liftM toBool $
{# call gtk_icon_info_get_embedded_rect #}
self
(castPtr rectPtr)
if success
then liftM Just $ peek rectPtr
else return Nothing
-- | Gets the filename for the icon. If the ''IconLookupUseBuiltin'' flag was passed to
-- 'iconThemeLookupIcon', there may be no filename if a builtin icon is returned; in this case,
-- you should use 'iconInfoGetBuiltinPixbuf'.
iconInfoGetFilename :: IconInfo
-> IO (Maybe String) -- ^ returns the filename for the icon,
-- or 'Nothing' if 'iconInfoGetBuiltinPixbuf' should be used instead.
iconInfoGetFilename self = do
namePtr <- {# call gtk_icon_info_get_filename #} self
if namePtr == nullPtr
then return Nothing
else liftM Just $ peekUTFString namePtr
-- | Looks up an icon in an icon theme, scales it to the given size and renders it into a pixbuf. This is
-- a convenience function; if more details about the icon are needed, use 'iconThemeLookupIcon'
-- followed by 'iconInfoLoadIcon'.
--
-- Note that you probably want to listen for icon theme changes and update the icon. This is usually
-- done by connecting to the 'styleSet' signal. If for some reason you do not want to update
-- the icon when the icon theme changes, you should consider using 'pixbufCopy' to make a private
-- copy of the pixbuf returned by this function. Otherwise GTK+ may need to keep the old icon theme
-- loaded, which would be a waste of memory.
iconInfoLoadIcon :: IconInfo -> IO Pixbuf
iconInfoLoadIcon self =
wrapNewGObject mkPixbuf $
propagateGError $ \errorPtr ->
{# call gtk_icon_info_load_icon #}
self
errorPtr
-- | Sets whether the coordinates returned by 'iconInfoGetEmbeddedRect' and
-- 'iconInfoGetAttachPoints' should be returned in their original form as specified in the icon
-- theme, instead of scaled appropriately for the pixbuf returned by 'iconInfoLoadIcon'.
--
-- Raw coordinates are somewhat strange; they are specified to be with respect to the unscaled pixmap
-- for PNG and XPM icons, but for SVG icons, they are in a 1000x1000 coordinate space that is scaled to
-- the final size of the icon. You can determine if the icon is an SVG icon by using
-- 'iconInfoGetFilename', and seeing if it is non-'Nothing' and ends in '.svg'.
--
-- This function is provided primarily to allow compatibility wrappers for older API's, and is not
-- expected to be useful for applications.
iconInfoSetRawCoordinates :: IconInfo
-> Bool -- ^ @rawCoordinates@ whether the coordinates of
-- embedded rectangles and attached points should be returned in their original
-> IO ()
iconInfoSetRawCoordinates self rawCoordinates =
{# call gtk_icon_info_set_raw_coordinates #}
self
(fromBool rawCoordinates)
--------------------
-- Signals
-- | Emitted when the current icon theme is switched or Gtk+ detects that a
-- change has occurred in the contents of the current icon theme.
--
iconThemeChanged :: IconThemeClass self => Signal self (IO ())
iconThemeChanged = Signal (connect_NONE__NONE "changed")
#endif