gtk-0.12.0: Graphics/UI/Gtk/Gdk/Screen.chs
{-# LANGUAGE CPP #-}
-- -*-haskell-*-
-- GIMP Toolkit (GTK) Widget Screen
--
-- Author : Duncan Coutts
--
-- Created: 29 October 2007
--
-- Copyright (C) 2007 Duncan Coutts
--
-- 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)
--
-- Object representing a physical screen
--
-- * Module available since Gdk version 2.2
--
module Graphics.UI.Gtk.Gdk.Screen (
-- * Detail
--
-- | 'Screen' objects are the GDK representation of a physical screen. It is
-- used throughout GDK and Gtk+ to specify which screen the top level windows
-- are to be displayed on. It is also used to query the screen specification
-- and default settings such as the default colormap
-- ('screenGetDefaultColormap'), the screen width ('screenGetWidth'), etc.
--
-- Note that a screen may consist of multiple monitors which are merged to
-- form a large screen area.
-- * Class Hierarchy
--
-- |
-- @
-- | 'GObject'
-- | +----Screen
-- @
#if GTK_CHECK_VERSION(2,2,0)
-- * Types
Screen,
ScreenClass,
castToScreen, gTypeScreen,
toScreen,
-- * Methods
screenGetDefault,
screenGetSystemColormap,
#if GTK_CHECK_VERSION(2,8,0)
screenGetRGBAColormap,
#endif
#ifndef DISABLE_DEPRECATED
screenGetDefaultColormap,
screenSetDefaultColormap,
#endif
-- screenGetSystemVisual,
#if GTK_CHECK_VERSION(2,10,0)
screenIsComposited,
#endif
screenGetRootWindow,
screenGetDisplay,
screenGetNumber,
screenGetWidth,
screenGetHeight,
screenGetWidthMm,
screenGetHeightMm,
screenGetWidthMM,
screenGetHeightMM,
screenListVisuals,
screenGetToplevelWindows,
screenMakeDisplayName,
screenGetNMonitors,
screenGetMonitorGeometry,
screenGetMonitorAtPoint,
screenGetMonitorAtWindow,
#if GTK_CHECK_VERSION(2,14,0)
screenGetMonitorHeightMm,
screenGetMonitorWidthMm,
screenGetMonitorPlugName,
#endif
-- screenGetSetting,
#if GTK_CHECK_VERSION(2,10,0)
screenGetActiveWindow,
screenGetWindowStack,
#endif
-- * Attributes
screenFontOptions,
screenResolution,
screenDefaultColormap,
-- * Signals
screenSizeChanged,
#if GTK_CHECK_VERSION(2,10,0)
screenCompositedChanged,
#if GTK_CHECK_VERSION(2,14,0)
screenMonitorsChanged,
#endif
#endif
#endif
) where
import Control.Monad (liftM)
import System.Glib.FFI
import System.Glib.UTFString
import System.Glib.Signals
import System.Glib.Attributes
import System.Glib.Properties
import System.Glib.GList
{#import Graphics.UI.Gtk.Types#}
import Graphics.UI.Gtk.Signals
import Graphics.Rendering.Cairo.Types ( FontOptions(..), mkFontOptions,
withFontOptions)
import Graphics.UI.Gtk.General.Structs ( Rectangle(..) )
{# context lib="gdk" prefix="gdk" #}
#if GTK_CHECK_VERSION(2,2,0)
--------------------
-- Methods
-- | Gets the default screen for the default display. (See
-- 'displayGetDefault').
--
screenGetDefault ::
IO (Maybe Screen) -- ^ returns a 'Screen', or @Nothing@ if there is no
-- default display.
screenGetDefault =
maybeNull (makeNewGObject mkScreen) $
{# call gdk_screen_get_default #}
screenGetDefaultColormap :: Screen
-> IO Colormap -- ^ returns the default 'Colormap'.
screenGetDefaultColormap self =
makeNewGObject mkColormap $
{# call gdk_screen_get_default_colormap #}
self
{-# DEPRECATED screenGetDefaultColormap "instead of 'screenGetDefaultColormap obj' use 'get obj screenDefaultColormap'" #-}
screenSetDefaultColormap :: Screen
-> Colormap -- ^ @colormap@ - a 'Colormap'
-> IO ()
screenSetDefaultColormap self colormap =
{# call gdk_screen_set_default_colormap #}
self
colormap
{-# DEPRECATED screenSetDefaultColormap "instead of 'screenSetDefaultColormap obj value' use 'set obj [ screenDefaultColormap := value ]'" #-}
-- | Gets the system default colormap for @screen@
--
screenGetSystemColormap :: Screen
-> IO Colormap -- ^ returns the default colormap for @screen@.
screenGetSystemColormap self =
makeNewGObject mkColormap $
{# call gdk_screen_get_system_colormap #}
self
#if GTK_CHECK_VERSION(2,8,0)
-- | Gets a colormap to use for creating windows or pixmaps with an alpha
-- channel. The windowing system on which Gtk+ is running may not support this
-- capability, in which case @Nothing@ will be returned. Even if a
-- non-@Nothing@ value is returned, its possible that the window's alpha
-- channel won't be honored when displaying the window on the screen: in
-- particular, for X an appropriate windowing manager and compositing manager
-- must be running to provide appropriate display.
--
-- * Available since Gdk version 2.8
--
screenGetRGBAColormap :: Screen
-> IO (Maybe Colormap) -- ^ returns a colormap to use for windows with an
-- alpha channel or @Nothing@ if the capability is not
-- available.
screenGetRGBAColormap self =
maybeNull (makeNewGObject mkColormap) $
{# call gdk_screen_get_rgba_colormap #}
self
#endif
-- | Get the system's default visual for @screen@. This is the visual for the
-- root window of the display.
--
screenGetSystemVisual :: Screen
-> IO Visual -- ^ returns the system visual
screenGetSystemVisual self =
makeNewGObject mkVisual $
{# call gdk_screen_get_system_visual #}
self
#if GTK_CHECK_VERSION(2,10,0)
-- | Returns whether windows with an RGBA visual can reasonably be expected to
-- have their alpha channel drawn correctly on the screen.
--
-- On X11 this function returns whether a compositing manager is compositing
-- @screen@.
--
-- * Available since Gdk version 2.10
--
screenIsComposited :: Screen
-> IO Bool -- ^ returns Whether windows with RGBA visuals can reasonably be
-- expected to have their alpha channels drawn correctly on the
-- screen.
screenIsComposited self =
liftM toBool $
{# call gdk_screen_is_composited #}
self
#endif
-- | Gets the root window of @screen@.
--
screenGetRootWindow :: Screen
-> IO DrawWindow -- ^ returns the root window
screenGetRootWindow self =
makeNewGObject mkDrawWindow $
{# call gdk_screen_get_root_window #}
self
-- | Gets the display to which the @screen@ belongs.
--
screenGetDisplay :: Screen
-> IO Display -- ^ returns the display to which @screen@ belongs
screenGetDisplay self =
makeNewGObject mkDisplay $
{# call gdk_screen_get_display #}
self
-- | Gets the index of @screen@ among the screens in the display to which it
-- belongs. (See 'screenGetDisplay')
--
screenGetNumber :: Screen
-> IO Int -- ^ returns the index
screenGetNumber self =
liftM fromIntegral $
{# call gdk_screen_get_number #}
self
-- | Gets the width of @screen@ in pixels
--
screenGetWidth :: Screen
-> IO Int -- ^ returns the width of @screen@ in pixels.
screenGetWidth self =
liftM fromIntegral $
{# call gdk_screen_get_width #}
self
-- | Gets the height of @screen@ in pixels
--
screenGetHeight :: Screen
-> IO Int -- ^ returns the height of @screen@ in pixels.
screenGetHeight self =
liftM fromIntegral $
{# call gdk_screen_get_height #}
self
-- | Gets the width of @screen@ in millimeters. Note that on some X servers
-- this value will not be correct.
--
screenGetWidthMM :: Screen
-> IO Int -- ^ returns the width of @screen@ in millimeters.
screenGetWidthMM self =
liftM fromIntegral $
{# call gdk_screen_get_width_mm #}
self
screenGetWidthMm = screenGetWidthMM
-- | Returns the height of @screen@ in millimeters. Note that on some X
-- servers this value will not be correct.
--
screenGetHeightMM :: Screen
-> IO Int -- ^ returns the heigth of @screen@ in millimeters.
screenGetHeightMM self =
liftM fromIntegral $
{# call gdk_screen_get_height_mm #}
self
screenGetHeightMm = screenGetHeightMM
-- | Lists the available visuals for the specified @screen@. A visual
-- describes a hardware image data format. For example, a visual might support
-- 24-bit color, or 8-bit color, and might expect pixels to be in a certain
-- format.
--
screenListVisuals :: Screen
-> IO [Visual] -- ^ returns a list of visuals
screenListVisuals self =
{# call gdk_screen_list_visuals #}
self
>>= fromGList
>>= mapM (makeNewGObject mkVisual . return)
-- | Obtains a list of all toplevel windows known to GDK on the screen
-- @screen@. A toplevel window is a child of the root window (see
-- 'getDefaultRootWindow').
--
screenGetToplevelWindows :: Screen
-> IO [DrawWindow] -- ^ returns list of toplevel windows
screenGetToplevelWindows self =
{# call gdk_screen_get_toplevel_windows #}
self
>>= fromGList
>>= mapM (makeNewGObject mkDrawWindow . return)
-- | Determines the name to pass to 'displayOpen' to get a 'Display' with this
-- screen as the default screen.
--
screenMakeDisplayName :: Screen
-> IO String -- ^ returns a newly allocated string
screenMakeDisplayName self =
{# call gdk_screen_make_display_name #}
self
>>= readUTFString
-- | Returns the number of monitors which @screen@ consists of.
--
screenGetNMonitors :: Screen
-> IO Int -- ^ returns number of monitors which @screen@ consists of.
screenGetNMonitors self =
liftM fromIntegral $
{# call gdk_screen_get_n_monitors #}
self
-- | Retrieves the 'Rectangle' representing the size and
-- position of the individual monitor within the entire screen area.
--
-- Note that the size of the entire screen area can be retrieved via
-- 'screenGetWidth' and 'screenGetHeight'.
--
screenGetMonitorGeometry :: Screen
-> Int -- ^ @monitorNum@ - the monitor number.
-> IO Rectangle
screenGetMonitorGeometry self monitorNum =
alloca $ \rPtr -> do
{# call gdk_screen_get_monitor_geometry #}
self
(fromIntegral monitorNum)
(castPtr rPtr)
peek rPtr
-- | Returns the monitor number in which the point (@x@,@y@) is located.
--
screenGetMonitorAtPoint :: Screen
-> Int -- ^ @x@ - the x coordinate in the virtual screen.
-> Int -- ^ @y@ - the y coordinate in the virtual screen.
-> IO Int -- ^ returns the monitor number in which the point (@x@,@y@) lies,
-- or a monitor close to (@x@,@y@) if the point is not in any
-- monitor.
screenGetMonitorAtPoint self x y =
liftM fromIntegral $
{# call gdk_screen_get_monitor_at_point #}
self
(fromIntegral x)
(fromIntegral y)
-- | Returns the number of the monitor in which the largest area of the
-- bounding rectangle of @window@ resides.
--
screenGetMonitorAtWindow :: Screen
-> DrawWindow -- ^ @window@ - a 'DrawWindow'
-> IO Int -- ^ returns the monitor number in which most of @window@ is
-- located, or if @window@ does not intersect any monitors, a
-- monitor, close to @window@.
screenGetMonitorAtWindow self window =
liftM fromIntegral $
{# call gdk_screen_get_monitor_at_window #}
self
window
#if GTK_CHECK_VERSION(2,14,0)
-- | Gets the height in millimeters of the specified monitor.
--
-- * Available since Gdk version 2.14
--
screenGetMonitorHeightMm :: Screen
-> Int -- ^ @monitorNum@ - number of the monitor
-> IO Int -- ^ returns the height of the monitor, or -1 if not available
screenGetMonitorHeightMm self monitorNum =
liftM fromIntegral $
{# call gdk_screen_get_monitor_height_mm #}
self
(fromIntegral monitorNum)
-- | Gets the width in millimeters of the specified monitor, if available.
--
-- * Available since Gdk version 2.14
--
screenGetMonitorWidthMm :: Screen
-> Int -- ^ @monitorNum@ - number of the monitor
-> IO Int -- ^ returns the width of the monitor, or -1 if not available
screenGetMonitorWidthMm self monitorNum =
liftM fromIntegral $
{# call gdk_screen_get_monitor_width_mm #}
self
(fromIntegral monitorNum)
-- | Returns the output name of the specified monitor. Usually something like
-- VGA, DVI, or TV, not the actual product name of the display device.
--
-- * Available since Gdk version 2.14
--
screenGetMonitorPlugName :: Screen
-> Int -- ^ @monitorNum@ - number of the monitor
-> IO (Maybe String) -- ^ returns a newly-allocated string containing the name of the
-- monitor, or @Nothing@ if the name cannot be determined
screenGetMonitorPlugName self monitorNum = do
sPtr <-
{# call gdk_screen_get_monitor_plug_name #}
self
(fromIntegral monitorNum)
if sPtr==nullPtr then return Nothing else liftM Just $ readUTFString sPtr
#endif
{-
-- | Retrieves a desktop-wide setting such as double-click time for the
-- 'Screen'@screen@.
--
-- FIXME needs a list of valid settings here, or a link to more information.
--
screenGetSetting :: Screen
-> String -- ^ @name@ - the name of the setting
-> {-GValue*-} -- ^ @value@ - location to store the value of the setting
-> IO Bool -- ^ returns @True@ if the setting existed and a value was
-- stored in @value@, @False@ otherwise.
screenGetSetting self name value =
liftM toBool $
withUTFString name $ \namePtr ->
{# call gdk_screen_get_setting #}
self
namePtr
{-value-}
-}
-- these are only used for the attributes
screenGetFontOptions :: Screen
-> IO (Maybe FontOptions)
screenGetFontOptions self = do
fPtr <- {# call gdk_screen_get_font_options #} self
if fPtr==nullPtr then return Nothing else liftM Just $ mkFontOptions (castPtr fPtr)
screenSetFontOptions :: Screen
-> Maybe FontOptions
-> IO ()
screenSetFontOptions self Nothing =
{# call gdk_screen_set_font_options #} self nullPtr
screenSetFontOptions self (Just options) =
withFontOptions options $ \fPtr ->
{# call gdk_screen_set_font_options #} self (castPtr fPtr)
#if GTK_CHECK_VERSION(2,10,0)
-- | Returns the currently active window of this screen.
--
-- On X11, this is done by inspecting the _NET_ACTIVE_WINDOW property on the
-- root window, as described in the Extended Window Manager Hints. If there is
-- no currently currently active window, or the window manager does not support
-- the _NET_ACTIVE_WINDOW hint, this function returns @Nothing@.
--
-- On other platforms, this function may return @Nothing@, depending on whether
-- it is implementable on that platform.
--
-- * Available since Gdk version 2.10
--
screenGetActiveWindow :: Screen
-> IO (Maybe DrawWindow) -- ^ returns the currently active window, or
-- @Nothing@.
screenGetActiveWindow self =
maybeNull (wrapNewGObject mkDrawWindow) $
{# call gdk_screen_get_active_window #}
self
#endif
-- | Returns a list of 'DrawWindow's representing the
-- current window stack.
--
-- On X11, this is done by inspecting the _NET_CLIENT_LIST_STACKING property
-- on the root window, as described in the Extended Window Manager Hints. If
-- the window manager does not support the _NET_CLIENT_LIST_STACKING hint, this
-- function returns @Nothing@.
--
-- On other platforms, this function may return @Nothing@, depending on whether it is
-- implementable on that platform.
--
-- * Available since Gdk version 2.10
--
screenGetWindowStack :: Screen
-> IO (Maybe [DrawWindow]) -- ^ returns a list of 'DrawWindow's for the
-- current window stack, or @Nothing@.
screenGetWindowStack self = do
lPtr <- {# call gdk_screen_get_window_stack #} self
if lPtr==nullPtr then return Nothing else liftM Just $ do
fromGList lPtr >>= mapM (wrapNewGObject mkDrawWindow . return)
#endif
--------------------
-- Attributes
-- | The default font options for the screen.
--
screenFontOptions :: Attr Screen (Maybe FontOptions)
screenFontOptions = newAttr
screenGetFontOptions
screenSetFontOptions
-- | The resolution for fonts on the screen.
--
-- Default value: -1
--
screenResolution :: Attr Screen Double
screenResolution = newAttrFromDoubleProperty "resolution"
-- | Sets the default @colormap@ for @screen@.
--
-- Gets the default colormap for @screen@.
--
screenDefaultColormap :: Attr Screen Colormap
screenDefaultColormap = newAttr
screenGetDefaultColormap
screenSetDefaultColormap
--------------------
-- Signals
-- | The ::size_changed signal is emitted when the pixel width or height of a
-- screen changes.
--
screenSizeChanged :: ScreenClass self => Signal self (IO ())
screenSizeChanged = Signal (connect_NONE__NONE "size-changed")
#if GTK_CHECK_VERSION(2,10,0)
-- | The 'screenCompositedChanged' signal is emitted when the composited status of
-- the screen changes
--
-- * Available since Gdk version 2.10
--
screenCompositedChanged :: ScreenClass self => Signal self (IO ())
screenCompositedChanged = Signal (connect_NONE__NONE "composited-changed")
#if GTK_CHECK_VERSION(2,14,0)
-- | The 'screenMonitorsChanged' signal is emitted when the number, size or
-- position of the monitors attached to the screen change.
--
-- Only for X for now. Future implementations for Win32 and OS X may be a
-- possibility.
--
-- * Available since Gdk version 2.14
--
screenMonitorsChanged :: ScreenClass self => Signal self (IO ())
screenMonitorsChanged = Signal (connect_NONE__NONE "monitors-changed")
#endif
#endif