diff options
author | Matthias Clasen <mclasen@redhat.com> | 2010-12-13 12:36:35 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2010-12-21 12:06:58 -0500 |
commit | da216c0665d3629185739f2699c6bf82fc0c1de9 (patch) | |
tree | dec4a24fc2bf30ade210d735bca44dc478f3998a /gdk | |
parent | dfe6ba932ca798c53121f90b7d696b5d2231a179 (diff) | |
download | gtk+-da216c0665d3629185739f2699c6bf82fc0c1de9.tar.gz |
Add vfuncs for a bunch of cursor functionality to GdkDisplay
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdkcursor.c | 159 | ||||
-rw-r--r-- | gdk/gdkdisplay.c | 86 | ||||
-rw-r--r-- | gdk/gdkdisplayprivate.h | 26 | ||||
-rw-r--r-- | gdk/x11/gdkcursor-x11.c | 406 | ||||
-rw-r--r-- | gdk/x11/gdkdisplay-x11.c | 7 | ||||
-rw-r--r-- | gdk/x11/gdkprivate-x11.h | 17 |
6 files changed, 403 insertions, 298 deletions
diff --git a/gdk/gdkcursor.c b/gdk/gdkcursor.c index 475e96fbff..016723e657 100644 --- a/gdk/gdkcursor.c +++ b/gdk/gdkcursor.c @@ -27,8 +27,7 @@ #include "config.h" #include "gdkcursor.h" - -#include "gdkdisplay.h" +#include "gdkdisplayprivate.h" #include "gdkinternals.h" @@ -61,11 +60,11 @@ G_DEFINE_BOXED_TYPE (GdkCursor, gdk_cursor, /** * gdk_cursor_ref: * @cursor: a #GdkCursor - * + * * Adds a reference to @cursor. - * + * * Return value: Same @cursor that was passed in - **/ + */ GdkCursor* gdk_cursor_ref (GdkCursor *cursor) { @@ -83,8 +82,7 @@ gdk_cursor_ref (GdkCursor *cursor) * * Removes a reference from @cursor, deallocating the cursor * if no references remain. - * - **/ + */ void gdk_cursor_unref (GdkCursor *cursor) { @@ -100,14 +98,14 @@ gdk_cursor_unref (GdkCursor *cursor) /** * gdk_cursor_new: * @cursor_type: cursor to create - * + * * Creates a new cursor from the set of builtin cursors for the default display. * See gdk_cursor_new_for_display(). * * To make the cursor invisible, use %GDK_BLANK_CURSOR. - * + * * Return value: a new #GdkCursor - **/ + */ GdkCursor* gdk_cursor_new (GdkCursorType cursor_type) { @@ -131,3 +129,144 @@ gdk_cursor_get_cursor_type (GdkCursor *cursor) return cursor->type; } + +/** + * gdk_cursor_new_for_display: + * @display: the #GdkDisplay for which the cursor will be created + * @cursor_type: cursor to create + * + * Creates a new cursor from the set of builtin cursors. + * Some useful ones are: + * <itemizedlist> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="right_ptr.png"></inlinegraphic> #GDK_RIGHT_PTR (right-facing arrow) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="crosshair.png"></inlinegraphic> #GDK_CROSSHAIR (crosshair) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="xterm.png"></inlinegraphic> #GDK_XTERM (I-beam) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="watch.png"></inlinegraphic> #GDK_WATCH (busy) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="fleur.png"></inlinegraphic> #GDK_FLEUR (for moving objects) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="hand1.png"></inlinegraphic> #GDK_HAND1 (a right-pointing hand) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="hand2.png"></inlinegraphic> #GDK_HAND2 (a left-pointing hand) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="left_side.png"></inlinegraphic> #GDK_LEFT_SIDE (resize left side) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="right_side.png"></inlinegraphic> #GDK_RIGHT_SIDE (resize right side) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="top_left_corner.png"></inlinegraphic> #GDK_TOP_LEFT_CORNER (resize northwest corner) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="top_right_corner.png"></inlinegraphic> #GDK_TOP_RIGHT_CORNER (resize northeast corner) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="bottom_left_corner.png"></inlinegraphic> #GDK_BOTTOM_LEFT_CORNER (resize southwest corner) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="bottom_right_corner.png"></inlinegraphic> #GDK_BOTTOM_RIGHT_CORNER (resize southeast corner) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="top_side.png"></inlinegraphic> #GDK_TOP_SIDE (resize top side) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="bottom_side.png"></inlinegraphic> #GDK_BOTTOM_SIDE (resize bottom side) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="sb_h_double_arrow.png"></inlinegraphic> #GDK_SB_H_DOUBLE_ARROW (move vertical splitter) + * </para></listitem> + * <listitem><para> + * <inlinegraphic format="PNG" fileref="sb_v_double_arrow.png"></inlinegraphic> #GDK_SB_V_DOUBLE_ARROW (move horizontal splitter) + * </para></listitem> + * <listitem><para> + * #GDK_BLANK_CURSOR (Blank cursor). Since 2.16 + * </para></listitem> + * </itemizedlist> + * + * Return value: a new #GdkCursor + * + * Since: 2.2 + **/ +GdkCursor* +gdk_cursor_new_for_display (GdkDisplay *display, + GdkCursorType cursor_type) +{ + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + + return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_type (display, cursor_type); +} + +/** + * gdk_cursor_new_from_name: + * @display: the #GdkDisplay for which the cursor will be created + * @name: the name of the cursor + * + * Creates a new cursor by looking up @name in the current cursor + * theme. + * + * Returns: a new #GdkCursor, or %NULL if there is no cursor with + * the given name + * + * Since: 2.8 + */ +GdkCursor* +gdk_cursor_new_from_name (GdkDisplay *display, + const gchar *name) +{ + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + + return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_name (display, name); +} + +/** + * gdk_cursor_new_from_pixbuf: + * @display: the #GdkDisplay for which the cursor will be created + * @pixbuf: the #GdkPixbuf containing the cursor image + * @x: the horizontal offset of the 'hotspot' of the cursor. + * @y: the vertical offset of the 'hotspot' of the cursor. + * + * Creates a new cursor from a pixbuf. + * + * Not all GDK backends support RGBA cursors. If they are not + * supported, a monochrome approximation will be displayed. + * The functions gdk_display_supports_cursor_alpha() and + * gdk_display_supports_cursor_color() can be used to determine + * whether RGBA cursors are supported; + * gdk_display_get_default_cursor_size() and + * gdk_display_get_maximal_cursor_size() give information about + * cursor sizes. + * + * If @x or @y are <literal>-1</literal>, the pixbuf must have + * options named "x_hot" and "y_hot", resp., containing + * integer values between %0 and the width resp. height of + * the pixbuf. (Since: 3.0) + * + * On the X backend, support for RGBA cursors requires a + * sufficently new version of the X Render extension. + * + * Returns: a new #GdkCursor. + * + * Since: 2.4 + */ +GdkCursor * +gdk_cursor_new_from_pixbuf (GdkDisplay *display, + GdkPixbuf *pixbuf, + gint x, + gint y) +{ + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); + + return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_pixbuf (display, pixbuf, x, y); +} diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 0bfd150f01..d398dc8c45 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -2297,3 +2297,89 @@ gdk_display_has_pending (GdkDisplay *display) { return GDK_DISPLAY_GET_CLASS (display)->has_pending (display); } + +/** + * gdk_display_supports_cursor_alpha: + * @display: a #GdkDisplay + * + * Returns %TRUE if cursors can use an 8bit alpha channel + * on @display. Otherwise, cursors are restricted to bilevel + * alpha (i.e. a mask). + * + * Returns: whether cursors can have alpha channels. + * + * Since: 2.4 + */ +gboolean +gdk_display_supports_cursor_alpha (GdkDisplay *display) +{ + g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); + + return GDK_DISPLAY_GET_CLASS (display)->supports_cursor_alpha (display); +} + +/** + * gdk_display_supports_cursor_color: + * @display: a #GdkDisplay + * + * Returns %TRUE if multicolored cursors are supported + * on @display. Otherwise, cursors have only a forground + * and a background color. + * + * Returns: whether cursors can have multiple colors. + * + * Since: 2.4 + */ +gboolean +gdk_display_supports_cursor_color (GdkDisplay *display) +{ + g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); + + return GDK_DISPLAY_GET_CLASS (display)->supports_cursor_color (display); +} + +/** + * gdk_display_get_default_cursor_size: + * @display: a #GdkDisplay + * + * Returns the default size to use for cursors on @display. + * + * Returns: the default cursor size. + * + * Since: 2.4 + */ +guint +gdk_display_get_default_cursor_size (GdkDisplay *display) +{ + guint width, height; + + g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); + + GDK_DISPLAY_GET_CLASS (display)->get_default_cursor_size (display, + &width, + &height); + + return MIN (width, height); +} + +/** + * gdk_display_get_maximal_cursor_size: + * @display: a #GdkDisplay + * @width: (out): the return location for the maximal cursor width + * @height: (out): the return location for the maximal cursor height + * + * Gets the maximal size to use for cursors on @display. + * + * Since: 2.4 + */ +void +gdk_display_get_maximal_cursor_size (GdkDisplay *display, + guint *width, + guint *height) +{ + g_return_if_fail (GDK_IS_DISPLAY (display)); + + GDK_DISPLAY_GET_CLASS (display)->get_maximal_cursor_size (display, + width, + height); +} diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h index 96cb9a110d..d47144c74b 100644 --- a/gdk/gdkdisplayprivate.h +++ b/gdk/gdkdisplayprivate.h @@ -21,6 +21,7 @@ #define __GDK_DISPLAY_PRIVATE_H__ #include "gdkdisplay.h" +#include "gdkcursor.h" G_BEGIN_DECLS @@ -127,15 +128,34 @@ struct _GdkDisplayClass gboolean (*supports_selection_notification) (GdkDisplay *display); gboolean (*request_selection_notification) (GdkDisplay *display, GdkAtom selection); + gboolean (*supports_shapes) (GdkDisplay *display); + gboolean (*supports_input_shapes) (GdkDisplay *display); + gboolean (*supports_composite) (GdkDisplay *display); + gboolean (*supports_cursor_alpha) (GdkDisplay *display); + gboolean (*supports_cursor_color) (GdkDisplay *display); + gboolean (*supports_clipboard_persistence) (GdkDisplay *display); void (*store_clipboard) (GdkDisplay *display, GdkWindow *clipboard_window, guint32 time_, const GdkAtom *targets, gint n_targets); - gboolean (*supports_shapes) (GdkDisplay *display); - gboolean (*supports_input_shapes) (GdkDisplay *display); - gboolean (*supports_composite) (GdkDisplay *display); + + void (*get_default_cursor_size) (GdkDisplay *display, + guint *width, + guint *height); + void (*get_maximal_cursor_size) (GdkDisplay *display, + guint *width, + guint *height); + GdkCursor * (*get_cursor_for_type) (GdkDisplay *display, + GdkCursorType type); + GdkCursor * (*get_cursor_for_name) (GdkDisplay *display, + const gchar *name); + GdkCursor * (*get_cursor_for_pixbuf) (GdkDisplay *display, + GdkPixbuf *pixbuf, + gint x, + gint y); + GList * (*list_devices) (GdkDisplay *display); gboolean (*send_client_message) (GdkDisplay *display, GdkEvent *event, diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c index 5cfc445b49..b257b619e9 100644 --- a/gdk/x11/gdkcursor-x11.c +++ b/gdk/x11/gdkcursor-x11.c @@ -139,19 +139,19 @@ _gdk_x11_cursor_display_finalize (GdkDisplay *display) GdkCursorPrivate* cursor = (GdkCursorPrivate*)(item->data); if (cursor->display == display) { - GSList* olditem; + GSList* olditem; gdk_cursor_unref ((GdkCursor*) cursor); - /* Remove this item from the list */ - *(itemp) = item->next; - olditem = item; - item = g_slist_next (item); - g_slist_free_1 (olditem); + /* Remove this item from the list */ + *(itemp) = item->next; + olditem = item; + item = g_slist_next (item); + g_slist_free_1 (olditem); } else { - itemp = &(item->next); - item = g_slist_next (item); - } + itemp = &(item->next); + item = g_slist_next (item); + } } } @@ -189,89 +189,19 @@ get_blank_cursor (GdkDisplay *display) return cursor; } -/** - * gdk_cursor_new_for_display: - * @display: the #GdkDisplay for which the cursor will be created - * @cursor_type: cursor to create - * - * Creates a new cursor from the set of builtin cursors. - * Some useful ones are: - * <itemizedlist> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="right_ptr.png"></inlinegraphic> #GDK_RIGHT_PTR (right-facing arrow) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="crosshair.png"></inlinegraphic> #GDK_CROSSHAIR (crosshair) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="xterm.png"></inlinegraphic> #GDK_XTERM (I-beam) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="watch.png"></inlinegraphic> #GDK_WATCH (busy) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="fleur.png"></inlinegraphic> #GDK_FLEUR (for moving objects) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="hand1.png"></inlinegraphic> #GDK_HAND1 (a right-pointing hand) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="hand2.png"></inlinegraphic> #GDK_HAND2 (a left-pointing hand) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="left_side.png"></inlinegraphic> #GDK_LEFT_SIDE (resize left side) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="right_side.png"></inlinegraphic> #GDK_RIGHT_SIDE (resize right side) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="top_left_corner.png"></inlinegraphic> #GDK_TOP_LEFT_CORNER (resize northwest corner) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="top_right_corner.png"></inlinegraphic> #GDK_TOP_RIGHT_CORNER (resize northeast corner) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="bottom_left_corner.png"></inlinegraphic> #GDK_BOTTOM_LEFT_CORNER (resize southwest corner) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="bottom_right_corner.png"></inlinegraphic> #GDK_BOTTOM_RIGHT_CORNER (resize southeast corner) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="top_side.png"></inlinegraphic> #GDK_TOP_SIDE (resize top side) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="bottom_side.png"></inlinegraphic> #GDK_BOTTOM_SIDE (resize bottom side) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="sb_h_double_arrow.png"></inlinegraphic> #GDK_SB_H_DOUBLE_ARROW (move vertical splitter) - * </para></listitem> - * <listitem><para> - * <inlinegraphic format="PNG" fileref="sb_v_double_arrow.png"></inlinegraphic> #GDK_SB_V_DOUBLE_ARROW (move horizontal splitter) - * </para></listitem> - * <listitem><para> - * #GDK_BLANK_CURSOR (Blank cursor). Since 2.16 - * </para></listitem> - * </itemizedlist> - * - * Return value: a new #GdkCursor - * - * Since: 2.2 - **/ GdkCursor* -gdk_cursor_new_for_display (GdkDisplay *display, - GdkCursorType cursor_type) +_gdk_x11_display_get_cursor_for_type (GdkDisplay *display, + GdkCursorType cursor_type) { GdkCursorPrivate *private; GdkCursor *cursor; Cursor xcursor; - g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); - if (gdk_display_is_closed (display)) { xcursor = None; - } - else + } + else { private = find_in_cache (display, cursor_type, NULL); @@ -279,19 +209,19 @@ gdk_cursor_new_for_display (GdkDisplay *display, { /* Cache had it, add a ref for this user */ gdk_cursor_ref ((GdkCursor*) private); - + return (GdkCursor*) private; - } - else + } + else { - if (cursor_type != GDK_BLANK_CURSOR) + if (cursor_type != GDK_BLANK_CURSOR) xcursor = XCreateFontCursor (GDK_DISPLAY_XDISPLAY (display), cursor_type); - else - xcursor = get_blank_cursor (display); + else + xcursor = get_blank_cursor (display); } } - + private = g_new (GdkCursorPrivate, 1); private->display = display; private->xcursor = xcursor; @@ -416,14 +346,14 @@ gdk_cursor_get_image (GdkCursor *cursor) if (cursor->type == GDK_CURSOR_IS_PIXMAP) { if (private->name) - images = XcursorLibraryLoadImages (private->name, theme, size); + images = XcursorLibraryLoadImages (private->name, theme, size); } - else + else images = XcursorShapeLoadImages (cursor->type, theme, size); if (!images) return NULL; - + image = images->images[0]; data = g_malloc (4 * image->width * image->height); @@ -437,9 +367,9 @@ gdk_cursor_get_image (GdkCursor *cursor) } pixbuf = gdk_pixbuf_new_from_data (data, GDK_COLORSPACE_RGB, TRUE, - 8, image->width, image->height, - 4 * image->width, - (GdkPixbufDestroyNotify)g_free, NULL); + 8, image->width, image->height, + 4 * image->width, + (GdkPixbufDestroyNotify)g_free, NULL); if (private->name) gdk_pixbuf_set_option (pixbuf, "name", private->name); @@ -479,24 +409,24 @@ _gdk_x11_cursor_update_theme (GdkCursor *cursor) return; if (cursor->type == GDK_CURSOR_IS_PIXMAP) - { - if (private->name) - new_cursor = XcursorLibraryLoadCursor (xdisplay, private->name); - } + { + if (private->name) + new_cursor = XcursorLibraryLoadCursor (xdisplay, private->name); + } else - new_cursor = XcursorShapeLoadCursor (xdisplay, cursor->type); + new_cursor = XcursorShapeLoadCursor (xdisplay, cursor->type); if (new_cursor != None) - { - XFixesChangeCursor (xdisplay, new_cursor, private->xcursor); - private->xcursor = new_cursor; - } + { + XFixesChangeCursor (xdisplay, new_cursor, private->xcursor); + private->xcursor = new_cursor; + } } } static void update_cursor (gpointer data, - gpointer user_data) + gpointer user_data) { GdkCursor *cursor; @@ -531,8 +461,8 @@ update_cursor (gpointer data, */ void gdk_x11_display_set_cursor_theme (GdkDisplay *display, - const gchar *theme, - const gint size) + const gchar *theme, + const gint size) { GdkDisplayX11 *display_x11; Display *xdisplay; @@ -573,8 +503,8 @@ gdk_cursor_get_image (GdkCursor *cursor) void gdk_x11_display_set_cursor_theme (GdkDisplay *display, - const gchar *theme, - const gint size) + const gchar *theme, + const gint size) { g_return_if_fail (GDK_IS_DISPLAY (display)); } @@ -591,8 +521,8 @@ _gdk_x11_cursor_update_theme (GdkCursor *cursor) static XcursorImage* create_cursor_image (GdkPixbuf *pixbuf, - gint x, - gint y) + gint x, + gint y) { guint width, height; XcursorImage *xcimage; @@ -624,42 +554,11 @@ create_cursor_image (GdkPixbuf *pixbuf, return xcimage; } - -/** - * gdk_cursor_new_from_pixbuf: - * @display: the #GdkDisplay for which the cursor will be created - * @pixbuf: the #GdkPixbuf containing the cursor image - * @x: the horizontal offset of the 'hotspot' of the cursor. - * @y: the vertical offset of the 'hotspot' of the cursor. - * - * Creates a new cursor from a pixbuf. - * - * Not all GDK backends support RGBA cursors. If they are not - * supported, a monochrome approximation will be displayed. - * The functions gdk_display_supports_cursor_alpha() and - * gdk_display_supports_cursor_color() can be used to determine - * whether RGBA cursors are supported; - * gdk_display_get_default_cursor_size() and - * gdk_display_get_maximal_cursor_size() give information about - * cursor sizes. - * - * If @x or @y are <literal>-1</literal>, the pixbuf must have - * options named "x_hot" and "y_hot", resp., containing - * integer values between %0 and the width resp. height of - * the pixbuf. (Since: 3.0) - * - * On the X backend, support for RGBA cursors requires a - * sufficently new version of the X Render extension. - * - * Returns: a new #GdkCursor. - * - * Since: 2.4 - */ GdkCursor * -gdk_cursor_new_from_pixbuf (GdkDisplay *display, - GdkPixbuf *pixbuf, - gint x, - gint y) +_gdk_x11_display_get_cursor_for_pixbuf (GdkDisplay *display, + GdkPixbuf *pixbuf, + gint x, + gint y) { XcursorImage *xcimage; Cursor xcursor; @@ -669,9 +568,6 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, char *end; gint64 value; - g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); - g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); - if (x == -1 && (option = gdk_pixbuf_get_option (pixbuf, "x_hot"))) { errno = 0; @@ -697,8 +593,10 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, g_return_val_if_fail (0 <= y && y < gdk_pixbuf_get_height (pixbuf), NULL); if (gdk_display_is_closed (display)) - xcursor = None; - else + { + xcursor = None; + } + else { xcimage = create_cursor_image (pixbuf, x, y); xcursor = XcursorImageLoadCursor (GDK_DISPLAY_XDISPLAY (display), xcimage); @@ -714,37 +612,24 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, cursor = (GdkCursor *) private; cursor->type = GDK_CURSOR_IS_PIXMAP; cursor->ref_count = 1; - + return cursor; } -/** - * gdk_cursor_new_from_name: - * @display: the #GdkDisplay for which the cursor will be created - * @name: the name of the cursor - * - * Creates a new cursor by looking up @name in the current cursor - * theme. - * - * Returns: a new #GdkCursor, or %NULL if there is no cursor with - * the given name - * - * Since: 2.8 - */ -GdkCursor* -gdk_cursor_new_from_name (GdkDisplay *display, - const gchar *name) +GdkCursor* +_gdk_x11_display_get_cursor_for_name (GdkDisplay *display, + const gchar *name) { Cursor xcursor; Display *xdisplay; GdkCursorPrivate *private; GdkCursor *cursor; - g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); - if (gdk_display_is_closed (display)) - xcursor = None; - else + { + xcursor = None; + } + else { private = find_in_cache (display, GDK_CURSOR_IS_PIXMAP, name); @@ -759,7 +644,7 @@ gdk_cursor_new_from_name (GdkDisplay *display, xdisplay = GDK_DISPLAY_XDISPLAY (display); xcursor = XcursorLibraryLoadCursor (xdisplay, name); if (xcursor == None) - return NULL; + return NULL; } private = g_new (GdkCursorPrivate, 1); @@ -776,62 +661,24 @@ gdk_cursor_new_from_name (GdkDisplay *display, return cursor; } -/** - * gdk_display_supports_cursor_alpha: - * @display: a #GdkDisplay - * - * Returns %TRUE if cursors can use an 8bit alpha channel - * on @display. Otherwise, cursors are restricted to bilevel - * alpha (i.e. a mask). - * - * Returns: whether cursors can have alpha channels. - * - * Since: 2.4 - */ -gboolean -gdk_display_supports_cursor_alpha (GdkDisplay *display) +gboolean +_gdk_x11_display_supports_cursor_alpha (GdkDisplay *display) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - return XcursorSupportsARGB (GDK_DISPLAY_XDISPLAY (display)); } -/** - * gdk_display_supports_cursor_color: - * @display: a #GdkDisplay - * - * Returns %TRUE if multicolored cursors are supported - * on @display. Otherwise, cursors have only a forground - * and a background color. - * - * Returns: whether cursors can have multiple colors. - * - * Since: 2.4 - */ -gboolean -gdk_display_supports_cursor_color (GdkDisplay *display) +gboolean +_gdk_x11_display_supports_cursor_color (GdkDisplay *display) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - return XcursorSupportsARGB (GDK_DISPLAY_XDISPLAY (display)); } -/** - * gdk_display_get_default_cursor_size: - * @display: a #GdkDisplay - * - * Returns the default size to use for cursors on @display. - * - * Returns: the default cursor size. - * - * Since: 2.4 - */ -guint -gdk_display_get_default_cursor_size (GdkDisplay *display) +void +_gdk_x11_display_get_default_cursor_size (GdkDisplay *display, + guint *width, + guint *height) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - - return XcursorGetDefaultSize (GDK_DISPLAY_XDISPLAY (display)); + *width = *height = XcursorGetDefaultSize (GDK_DISPLAY_XDISPLAY (display)); } #else @@ -839,11 +686,11 @@ gdk_display_get_default_cursor_size (GdkDisplay *display) static GdkCursor* gdk_cursor_new_from_pixmap (GdkDisplay *display, Pixmap source_pixmap, - Pixmap mask_pixmap, - const GdkColor *fg, - const GdkColor *bg, - gint x, - gint y) + Pixmap mask_pixmap, + const GdkColor *fg, + const GdkColor *bg, + gint x, + gint y) { GdkCursorPrivate *private; GdkCursor *cursor; @@ -866,7 +713,7 @@ gdk_cursor_new_from_pixmap (GdkDisplay *display, xcursor = None; else xcursor = XCreatePixmapCursor (GDK_DISPLAY_XDISPLAY (display), - source_pixmap, mask_pixmap, &xfg, &xbg, x, y); + source_pixmap, mask_pixmap, &xfg, &xbg, x, y); private = g_new (GdkCursorPrivate, 1); private->display = display; private->xcursor = xcursor; @@ -876,15 +723,15 @@ gdk_cursor_new_from_pixmap (GdkDisplay *display, cursor = (GdkCursor *) private; cursor->type = GDK_CURSOR_IS_PIXMAP; cursor->ref_count = 1; - + return cursor; } GdkCursor * -gdk_cursor_new_from_pixbuf (GdkDisplay *display, - GdkPixbuf *pixbuf, - gint x, - gint y) +_gdk_x11_display_get_cursor_for_pixbuf (GdkDisplay *display, + GdkPixbuf *pixbuf, + gint x, + gint y) { GdkCursor *cursor; cairo_surface_t *pixmap, *mask; @@ -896,9 +743,6 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, cairo_surface_t *image; cairo_t *cr; - g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); - g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); - width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); @@ -918,28 +762,28 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, guint8 *src = pixels + j * rowstride; guint8 *d = data + data_stride * j; guint8 *md = mask_data + data_stride * j; - + for (i = 0; i < width; i++) - { - if (src[1] < 0x80) - *d |= 1 << (i % 8); - - if (n_channels == 3 || src[3] >= 0x80) - *md |= 1 << (i % 8); - - src += n_channels; - if (i % 8 == 7) - { - d++; - md++; - } - } + { + if (src[1] < 0x80) + *d |= 1 << (i % 8); + + if (n_channels == 3 || src[3] >= 0x80) + *md |= 1 << (i % 8); + + src += n_channels; + if (i % 8 == 7) + { + d++; + md++; + } + } } - + screen = gdk_display_get_default_screen (display); - pixmap = _gdk_x11_window_create_bitmap_surface (gdk_screen_get_root_window (screen), - width, height); + pixmap = _gdk_x11_window_create_bitmap_surface (gdk_screen_get_root_window (screen), + width, height); cr = cairo_create (pixmap); image = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_A1, width, height, data_stride); @@ -948,9 +792,9 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); cairo_destroy (cr); - - mask = _gdk_x11_window_create_bitmap_surface (gdk_screen_get_root_window (screen), - width, height); + + mask = _gdk_x11_window_create_bitmap_surface (gdk_screen_get_root_window (screen), + width, height); cr = cairo_create (mask); image = cairo_image_surface_create_for_data (mask_data, CAIRO_FORMAT_A1, width, height, data_stride); @@ -959,54 +803,46 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); cairo_destroy (cr); - + cursor = gdk_cursor_new_from_pixmap (display, cairo_xlib_surface_get_drawable (pixmap), cairo_xlib_surface_get_drawable (mask), &fg, &bg, x, y); - + cairo_surface_destroy (pixmap); cairo_surface_destroy (mask); g_free (data); g_free (mask_data); - + return cursor; } -GdkCursor* -gdk_cursor_new_from_name (GdkDisplay *display, - const gchar *name) +GdkCursor* +_gdk_x11_display_get_cursor_for_name (GdkDisplay *display, + const gchar *name) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); - return NULL; } -gboolean -gdk_display_supports_cursor_alpha (GdkDisplay *display) +gboolean +_gdk_x11_display_supports_cursor_alpha (GdkDisplay *display) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - return FALSE; } -gboolean -gdk_display_supports_cursor_color (GdkDisplay *display) +gboolean +_gdk_x11_display_supports_cursor_color (GdkDisplay *display) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - return FALSE; } -guint -gdk_display_get_default_cursor_size (GdkDisplay *display) +void +_gdk_x11_display_get_default_cursor_size (GdkDisplay *display) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), 0); - /* no idea, really */ - return 20; + return 20; } #endif @@ -1022,19 +858,19 @@ gdk_display_get_default_cursor_size (GdkDisplay *display) * * Since: 2.4 */ -void -gdk_display_get_maximal_cursor_size (GdkDisplay *display, - guint *width, - guint *height) +void +_gdk_x11_display_get_maximal_cursor_size (GdkDisplay *display, + guint *width, + guint *height) { GdkScreen *screen; GdkWindow *window; g_return_if_fail (GDK_IS_DISPLAY (display)); - + screen = gdk_display_get_default_screen (display); window = gdk_screen_get_root_window (screen); - XQueryBestCursor (GDK_DISPLAY_XDISPLAY (display), - GDK_WINDOW_XID (window), - 128, 128, width, height); + XQueryBestCursor (GDK_DISPLAY_XDISPLAY (display), + GDK_WINDOW_XID (window), + 128, 128, width, height); } diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index a2c49e0e56..dc7909602b 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -2696,5 +2696,12 @@ _gdk_display_x11_class_init (GdkDisplayX11Class * class) display_class->add_client_message_filter = gdk_x11_display_add_client_message_filter; display_class->get_app_launch_context = _gdk_x11_display_get_app_launch_context; display_class->get_drag_protocol = _gdk_x11_display_get_drag_protocol; + display_class->get_cursor_for_type = _gdk_x11_display_get_cursor_for_type; + display_class->get_cursor_for_name = _gdk_x11_display_get_cursor_for_name; + display_class->get_cursor_for_pixbuf = _gdk_x11_display_get_cursor_for_pixbuf; + display_class->get_default_cursor_size = _gdk_x11_display_get_default_cursor_size; + display_class->get_maximal_cursor_size = _gdk_x11_display_get_maximal_cursor_size; + display_class->supports_cursor_alpha = _gdk_x11_display_supports_cursor_alpha; + display_class->supports_cursor_color = _gdk_x11_display_supports_cursor_color; } diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index e76038bd33..0d2a0cc2cc 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -157,6 +157,23 @@ void _gdk_x11_display_manager_add_display (GdkDisplayManager *manager, void _gdk_x11_display_manager_remove_display (GdkDisplayManager *manager, GdkDisplay *display); +GdkCursor *_gdk_x11_display_get_cursor_for_type (GdkDisplay *display, + GdkCursorType type); +GdkCursor *_gdk_x11_display_get_cursor_for_name (GdkDisplay *display, + const gchar *name); +GdkCursor *_gdk_x11_display_get_cursor_for_pixbuf (GdkDisplay *display, + GdkPixbuf *pixbuf, + gint x, + gint y); +gboolean _gdk_x11_display_supports_cursor_alpha (GdkDisplay *display); +gboolean _gdk_x11_display_supports_cursor_color (GdkDisplay *display); +void _gdk_x11_display_get_default_cursor_size (GdkDisplay *display, + guint *width, + guint *height); +void _gdk_x11_display_get_maximal_cursor_size (GdkDisplay *display, + guint *width, + guint *height); + void _gdk_x11_precache_atoms (GdkDisplay *display, const gchar * const *atom_names, gint n_atoms); |