forked from AuroraMiddleware/gtk
Add vfuncs for a bunch of cursor functionality to GdkDisplay
This commit is contained in:
parent
dfe6ba932c
commit
da216c0665
159
gdk/gdkcursor.c
159
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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user