You can change the cursor shape at any time; cursor
shapes are set on a window-by-window basis with gdk_window_set_cursor() (Figure 9). By default,
windows use their parent's cursor; you can restore the
default cursor by setting a window's cursor to NULL.
Two ways are provided to create a cursor. The simplest
way is to choose a cursor from the cursor font that comes
with X. The cursor font contains cursors instead of
characters; you can view it with the command xfd -fn cursor. You can also browse
the available cursors using the
testgtk program that comes with GTK+. Each cursor
shape has a constant defined in
gdk/gdkcursors.h.
gdk_cursor_new() accepts one of these constants as
its only argument:
GdkCursor* cursor;
cursor = gdk_cursor_new(GDK_CLOCK);
gdk_window_set_cursor(window, cursor);
gdk_cursor_destroy(cursor);
|
Notice that you can destroy the cursor as soon as you
attach it to a window;
GdkCursor is a client-side handle for a
server-side resource, and X will keep the server-side
resource around as long as it's in use.
If none of the cursors in the cursor font are
appropriate, you can create a custom cursor from a
bitmap. Two bitmaps, actually: the source pixmap, and the mask. Since these are bitmaps, every
pixel is either on or off (0 or 1). If a pixel is 0 in
the mask, that pixel will be transparent. If a pixel is 1
in both pixmaps, it will be displayed in the fg (foreground) color passed to gdk_cursor_new_from_pixmap(). If a
pixel is 1 in the mask but 0 in the source pixmap, it will be displayed
in the bg (background)
color. The source and
mask pixmaps must be the
same size, and they must have a depth of one.
The foreground and background colors should be
contrasting, so the cursor will be visible against any
background. Most cursors are drawn in the foreground
color and outlined in the background color. (To see this,
move an X cursor over a dark background; you will notice
a white outline around its edges.) To achieve this, mask should be slightly larger
than source, but the same
shape.
The final two arguments to
gdk_cursor_new_from_pixmap() are the coordinates of
the cursor's hot spot. This is
the point drawn at the mouse pointer's location---the tip
of an arrow cursor, or the center of a crosshair cursor.
gdk_cursor_new_from_pixmap()
will fail if the hot spot is not within the bitmap.