{-# LANGUAGE ForeignFunctionInterface, CPP #-} {-# INCLUDE /usr/include/gtk-2.0/gtk/gtk.h #-} {-# INCLUDE /usr/include/gtk-2.0/gdk/gdk.h #-} -- NOTE: START GHCI AS FOLLOWS: -- ghci -lgtk-x11-2.0 -lgdk-x11-2.0 -- ================================ -- File: GtkForeign.hs -- Foreign functions from Gtk -- CURSOR SHAPES -- Original source: https://sourceforge.net/mailarchive/forum.php?thread_name=87ps50ie9o.fsf%40loki.cmears.id.au&forum_name=gtk2hs-users -- Copyright status ?????? {- Re: [Gtk2hs-users] Changing the mouse cursor shape From: Chris Mears - 2007-05-22 07:48 Hi Axel, Axel Simon writes: > We haven't done that yet. > The functions required are a few in Gdk for creating cursors and looking > up stock cursors. Also, in Gdk.DrawWindow the function > gdk_window_set_cursor would need to be bound. If changing cursors would > be useful for your application, then I can add these functions into the > next minor release which Duncan wants to do soon. Thanks for the information. With your pointers, I was able to hack up the following code to suit my needs: data Cursor = Cursor type CursorPtr = Ptr Cursor foreign import ccall "gdk_window_set_cursor" gdkWindowSetCursor :: Ptr DrawWindow -> CursorPtr -> IO () foreign import ccall "gdk_cursor_new" gdkCursorNew :: Int -> IO CursorPtr setCursor :: Window -> IO () setCursor window = do c <- gdkCursorNew 34 -- the 'crosshair' cursor d <- widgetGetDrawWindow window withForeignPtr (unDrawWindow d) $ \ptr -> gdkWindowSetCursor ptr c I tried briefly to add some of the bindings to the library, but I don't understand the build system or the library design well enough to do it properly. I can confirm that adding the cursor bindings is not very hard. If you could add them, that would be great, but you needn't do it solely on my account. Chris -} -- Gtk2hs has added a definition of CursorType in version 0.10.1, -- but in version 0.10.0 and lower, we have to do it ourselves. -- Ah, but it's not really in 0.10.1 released May 10, 2009; -- it's in darcs since Sept. 27, 2009. #if MIN_VERSION_gtk(0,10,2) #define GTK_HAS_CURSOR_TYPE 1 #else #define GTK_HAS_CURSOR_TYPE 0 #endif module GtkForeign ( #if GTK_HAS_CURSOR_TYPE Graphics.UI.Gtk.CursorType(..) #else CursorType(..) #endif , setCursor) where import System.Glib import System.Glib.FFI import Foreign.ForeignPtr (castForeignPtr) #if GTK_HAS_CURSOR_TYPE import Graphics.UI.Gtk #else import Graphics.UI.Gtk (Cursor, widgetGetDrawWindow, DrawWindow, Window) #endif -- type CursorPtr = Ptr Cursor foreign import ccall "gdk_window_set_cursor" gdkWindowSetCursor :: Ptr DrawWindow -> Ptr Cursor -> IO () foreign import ccall "gdk_cursor_new" gdkCursorNew :: Int -> IO (Ptr Cursor) -- | Set the X Window cursor for a window to a specified type setCursor :: Window -> CursorType -> IO () setCursor window cursorType = do c <- gdkCursorNew (cursorTypeNumber cursorType) d <- widgetGetDrawWindow window let GObject fp = toGObject d withForeignPtr (castForeignPtr fp) $ \ptr -> gdkWindowSetCursor ptr c #if ! GTK_HAS_CURSOR_TYPE -- Cursor types are added to gtk2hs in v. 0.10.1, but we need this for -- earlier versions including 0.10.0. -- For illustrations, see -- http://www.pygtk.org/docs/pygtk/class-gdkcursor.html data CursorType = XCursor | Arrow | BasedArrowDown | BasedArrowUp | Boat | Bogosity | BottomLeftCorner | BottomRightCorner | BottomSide | BottomTee | BoxSpiral | CenterPtr | Circle | Clock | CoffeeMug | Cross | CrossReverse | Crosshair | DiamondCross | Dot | Dotbox | DoubleArrow | DraftLarge | DraftSmall | DrapedBox | Exchange | Fleur | Gobbler | Gumby | Hand1 | Hand2 | Heart | Icon | IronCross | LeftPtr | LeftSide | LeftTee | Leftbutton | LlAngle | LrAngle | Man | Middlebutton | Mouse | Pencil | Pirate | Plus | QuestionArrow | RightPtr | RightSide | RightTee | Rightbutton | RtlLogo | Sailboat | SbDownArrow | SbHDoubleArrow | SbLeftArrow | SbRightArrow | SbUpArrow | SbVDoubleArrow | Shuttle | Sizing | Spider | Spraycan | Star | Target | Tcross | TopLeftArrow | TopLeftCorner | TopRightCorner | TopSide | TopTee | Trek | UlAngle | Umbrella | UrAngle | Watch | Xterm | LastCursor | CursorIsPixmap deriving (Eq, Read, Show) #endif cursorTypeNumber :: CursorType -> Int cursorTypeNumber cursorType = case cursorType of XCursor -> 0 Arrow -> 2 BasedArrowDown -> 4 BasedArrowUp -> 6 Boat -> 8 Bogosity -> 10 BottomLeftCorner -> 12 BottomRightCorner -> 14 BottomSide -> 16 BottomTee -> 18 BoxSpiral -> 20 CenterPtr -> 22 Circle -> 24 Clock -> 26 CoffeeMug -> 28 Cross -> 30 CrossReverse -> 32 Crosshair -> 34 DiamondCross -> 36 Dot -> 38 Dotbox -> 40 DoubleArrow -> 42 DraftLarge -> 44 DraftSmall -> 46 DrapedBox -> 48 Exchange -> 50 Fleur -> 52 Gobbler -> 54 Gumby -> 56 Hand1 -> 58 Hand2 -> 60 Heart -> 62 Icon -> 64 IronCross -> 66 LeftPtr -> 68 LeftSide -> 70 LeftTee -> 72 Leftbutton -> 74 LlAngle -> 76 LrAngle -> 78 Man -> 80 Middlebutton -> 82 Mouse -> 84 Pencil -> 86 Pirate -> 88 Plus -> 90 QuestionArrow -> 92 RightPtr -> 94 RightSide -> 96 RightTee -> 98 Rightbutton -> 100 RtlLogo -> 102 Sailboat -> 104 SbDownArrow -> 106 SbHDoubleArrow -> 108 SbLeftArrow -> 110 SbRightArrow -> 112 SbUpArrow -> 114 SbVDoubleArrow -> 116 Shuttle -> 118 Sizing -> 120 Spider -> 122 Spraycan -> 124 Star -> 126 Target -> 128 Tcross -> 130 TopLeftArrow -> 132 TopLeftCorner -> 134 TopRightCorner -> 136 TopSide -> 138 TopTee -> 140 Trek -> 142 UlAngle -> 144 Umbrella -> 146 UrAngle -> 148 Watch -> 150 Xterm -> 152 LastCursor -> (-1) CursorIsPixmap -> (-1)