From: Axel S. <A....@ke...> - 2007-11-19 19:46:17
|
Sun Nov 18 04:34:25 PST 2007 Bit Connor <bi...@mu...> * Add to General Gdk: screen size querying, pointer grabbing, keyboard grabbing hunk ./gtk/Graphics/UI/Gtk/Gdk/Enums.chs 46 - Gravity(..) + Gravity(..), + GrabStatus(..), hunk ./gtk/Graphics/UI/Gtk/Gdk/Enums.chs 167 - [_$_] + +-- | Returned by 'pointerGrab' and 'keyboardGrab' to indicate success or the +-- reason for the failure of the grab attempt. +-- +-- [@GrabSuccess@] the resource was successfully grabbed. +-- +-- [@GrabAlreadyGrabbed@] the resource is actively grabbed by another client. +-- +-- [@GrabInvalidTime@] the resource was grabbed more recently than the +-- specified time. +-- +-- [@GrabNotViewable@] the grab window or the confine_to window are not +-- viewable. +-- +-- [@GrabFrozen@] the resource is frozen by an active grab of another client. +-- +{#enum GrabStatus {underscoreToCase} #} + hunk ./gtk/Graphics/UI/Gtk/Gdk/Gdk.chs 28 - beep, hunk ./gtk/Graphics/UI/Gtk/Gdk/Gdk.chs 29 + screenWidth, + screenHeight, + screenWidthMM, + screenHeightMM, + GrabStatus(..), + pointerGrab, + pointerUngrab, + pointerIsGrabbed, + keyboardGrab, + keyboardUngrab, + beep hunk ./gtk/Graphics/UI/Gtk/Gdk/Gdk.chs 42 +import Control.Monad (liftM) + +import System.Glib.Flags (fromFlags) +import System.Glib.FFI +{#import Graphics.UI.Gtk.Types#} +{#import Graphics.UI.Gtk.Gdk.Cursor#} (Cursor(..)) +import Graphics.UI.Gtk.Gdk.Events +import Graphics.UI.Gtk.Gdk.Enums (EventMask, GrabStatus(..)) + hunk ./gtk/Graphics/UI/Gtk/Gdk/Gdk.chs 64 +-- | Returns the width of the default screen in pixels. +-- +screenWidth :: IO Int +screenWidth = liftM fromIntegral $ {#call screen_width#} + +-- | Returns the height of the default screen in pixels. +-- +screenHeight :: IO Int +screenHeight = liftM fromIntegral $ {#call screen_height#} + +-- | Returns the width of the default screen in millimeters. Note that on many +-- X servers this value will not be correct. +-- +screenWidthMM :: IO Int +screenWidthMM = liftM fromIntegral $ {#call screen_width_mm#} + +-- | Returns the height of the default screen in millimeters. Note that on many +-- X servers this value will not be correct. +-- +screenHeightMM :: IO Int +screenHeightMM = liftM fromIntegral $ {#call screen_height_mm#} + +-- | Grabs the pointer (usually a mouse) so that all events are passed to this +-- application until the pointer is ungrabbed with 'pointerUngrab', or the grab +-- window becomes unviewable. This overrides any previous pointer grab by this +-- client. +-- +-- Pointer grabs are used for operations which need complete control over mouse +-- events, even if the mouse leaves the application. For example in GTK+ it is +-- used for Drag and Drop, for dragging the handle in the GtkHPaned and +-- GtkVPaned widgets, and for resizing columns in GtkCList widgets. +-- +-- Note that if the event mask of an X window has selected both button press +-- and button release events, then a button press event will cause an automatic +-- pointer grab until the button is released. X does this automatically since +-- most applications expect to receive button press and release events in +-- pairs. It is equivalent to a pointer grab on the window with @owner_events@ +-- set to @True@. +-- +-- If you set up anything at the time you take the grab that needs to be +-- cleaned up when the grab ends, you should handle the GdkEventGrabBroken +-- events that are emitted when the grab ends unvoluntarily. +-- +pointerGrab :: (DrawWindowClass window, DrawWindowClass confine_to) => + window -- ^ @window@ - the 'DrawWindow' which will own the grab (the grab + -- window). + -> Bool -- ^ @owner_events@ - if @False@ then all pointer events are + -- reported with respect to @window@ and are only reported if + -- selected by @event_mask@. If @True@ then pointer events for this + -- application are reported as normal, but pointer events outside + -- this application are reported with respect to @window@ and only + -- if selected by @event_mask@. In either mode, unreported events + -- are discarded. + -> [EventMask] -- ^ @event_mask@ - specifies the event mask, which is used in + -- accordance with @owner_events@. Note that only pointer + -- events (i.e. button and motion events) may be selected. + -> Maybe confine_to -- ^ @confine_to@ If supplied, the pointer will be + -- confined to this window during the grab. If the + -- pointer is outside @confine_to@, it will automatically + -- be moved to the closest edge of @confine_to@ and enter + -- and leave events will be generated as necessary. + -> Maybe Cursor -- ^ @cursor@ - the cursor to display while the grab is + -- active. If this is @Nothing@ then the normal cursors are + -- used for @window@ and its descendants, and the cursor for + -- @window@ is used for all other windows. + -> TimeStamp -- ^ @time@ - the timestamp of the event which led to this + -- pointer grab. This usually comes from an 'Event', though + -- 'currentTime' can be used if the time isn't known. + -> IO GrabStatus -- ^ @Returns@ - 'GrabSuccess' if the grab was successful. +pointerGrab window owner_events event_mask mbConfine_to mbCursor time = + liftM (toEnum . fromIntegral) $ + {#call pointer_grab#} + (toDrawWindow window) + (fromBool owner_events) + (fromIntegral $ fromFlags event_mask) + (maybe (mkDrawWindow nullForeignPtr) toDrawWindow mbConfine_to) + (maybe (Cursor nullForeignPtr) id mbCursor) + (fromIntegral time) + +-- | Ungrabs the pointer on the default display, if it is grabbed by this +-- application. +-- +pointerUngrab :: + TimeStamp -- ^ @time@ - a timestamp from an 'Event', or 'currentTime' if no + -- timestamp is available. + -> IO () +pointerUngrab time = {#call pointer_ungrab#} (fromIntegral time) + +-- | Returns @True@ if the pointer on the default display is currently grabbed +-- by this application. +-- +-- Note that this does not take the inmplicit pointer grab on button presses +-- into account. +-- +pointerIsGrabbed :: IO Bool +pointerIsGrabbed = liftM toBool $ {#call pointer_is_grabbed#} + +-- | Grabs the keyboard so that all events are passed to this application until +-- the keyboard is ungrabbed with 'keyboardUngrab'. This overrides any previous +-- keyboard grab by this client. +-- +-- If you set up anything at the time you take the grab that needs to be +-- cleaned up when the grab ends, you should handle the GdkEventGrabBroken +-- events that are emitted when the grab ends unvoluntarily. +keyboardGrab :: (DrawWindowClass window) => + window -- ^ @window@ - the 'DrawWindow' which will own the grab (the grab + -- window). + -> Bool -- ^ @owner_events@ - if @False@ then all keyboard events are + -- reported with respect to @window@. If @True@ then keyboard events + -- for this application are reported as normal, but keyboard events + -- outside this application are reported with respect to @window@. + -- Both key press and key release events are always reported, + -- independant of the event mask set by the application. + -> TimeStamp -- ^ @time@ - a timestamp from an 'Event', or 'currentTime' if + -- no timestamp is available. + -> IO GrabStatus -- ^ @Returns@ - 'GrabSuccess' if the grab was successful. +keyboardGrab window owner_events time = + liftM (toEnum . fromIntegral) $ + {#call keyboard_grab#} + (toDrawWindow window) + (fromBool owner_events) + (fromIntegral time) + +-- | Ungrabs the keyboard on the default display, if it is grabbed by this +-- application. +keyboardUngrab :: + TimeStamp -- ^ @time@ - a timestamp from an 'Event', or 'currentTime' if no + -- timestamp is available. + -> IO () +keyboardUngrab time = {#call keyboard_ungrab#} (fromIntegral time) + + |