diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 046dae9..04295a2 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -7901,6 +7901,21 @@ gdk_window_set_cursor (GdkWindow *window, } } +static void +gdk_window_set_cursor_hidden (GdkWindow *window, gboolean hidden) +{ + GdkCursor *cursor; + GdkCursorPrivate * private; + + cursor = gdk_window_get_cursor (); + private = (GdkCursorPrivate *) cursor; + + if (!private->hidden) + gdk_cursor_set_hidden (cursor, hidden); + + gdk_cursor_unref (cursor); +} + /** * gdk_window_get_geometry: * @window: a #GdkWindow diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c index 5cfbaa5..22b2f78 100644 --- a/gdk/x11/gdkcursor-x11.c +++ b/gdk/x11/gdkcursor-x11.c @@ -291,6 +291,7 @@ gdk_cursor_new_for_display (GdkDisplay *display, private->xcursor = xcursor; private->name = NULL; private->serial = theme_serial; + private->hidden = FALSE; cursor = (GdkCursor *) private; cursor->type = cursor_type; @@ -400,6 +401,7 @@ gdk_cursor_new_from_pixmap (GdkPixmap *source, private->xcursor = xcursor; private->name = NULL; private->serial = theme_serial; + private->hidden = FALSE; cursor = (GdkCursor *) private; cursor->type = GDK_CURSOR_IS_PIXMAP; @@ -408,6 +410,17 @@ gdk_cursor_new_from_pixmap (GdkPixmap *source, return cursor; } +static void +gdk_cursor_set_hidden (GdkCursor *cursor, gboolean hidden) +{ + GdkCursorPrivate *private; + + g_return_val_if_fail (cursor != NULL); + + private = (GdkCursorPrivate *) cursor; + private->hidden = hidden; +} + void _gdk_cursor_destroy (GdkCursor *cursor) { @@ -798,6 +811,7 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, private->xcursor = xcursor; private->name = NULL; private->serial = theme_serial; + private->hidden = FALSE; cursor = (GdkCursor *) private; cursor->type = GDK_CURSOR_IS_PIXMAP; @@ -855,6 +869,7 @@ gdk_cursor_new_from_name (GdkDisplay *display, private->xcursor = xcursor; private->name = g_strdup (name); private->serial = theme_serial; + private->hidden = FALSE; cursor = (GdkCursor *) private; cursor->type = GDK_CURSOR_IS_PIXMAP; diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 5eaf188..7f83d1c 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -77,6 +77,7 @@ struct _GdkCursorPrivate GdkDisplay *display; gchar *name; guint serial; + gboolean hidden; }; struct _GdkVisualPrivate diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index a18fc0c..e2865ad 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -3183,6 +3183,9 @@ gtk_widget_show (GtkWidget *widget) g_object_ref (widget); if (!gtk_widget_is_toplevel (widget)) gtk_widget_queue_resize (widget); + g_signal_connect ("key-press-event", G_CALLBACK (gtk_widget_on_cursor_hide_event)); + g_signal_connect ("button-press-event", G_CALLBACK (gtk_widget_on_cursor_hide_event)); + g_signal_connect ("motion-notify-event", G_CALLBACK (gtk_widget_on_cursor_hide_event)); g_signal_emit (widget, widget_signals[SHOW], 0); g_object_notify (G_OBJECT (widget), "visible"); g_object_unref (widget); @@ -11252,5 +11255,21 @@ gtk_widget_get_window (GtkWidget *widget) return widget->window; } +static void +gtk_widget_on_cursor_hide_event (GtkWidget *widget, GdkEvent *event) +{ + if (event.type == GDK_KEY_PRESS) + { + gdk_window_set_cursor_hidden (widget->window, TRUE); + } + else if (event.type == GDK_MOTION_NOTIFY || + event.type == GDK_BUTTON_PRESS) + { + gdk_window_set_cursor_hidden (widget->window, FALSE); + } + + return FALSE; +} + #define __GTK_WIDGET_C__ #include "gtkaliasdef.c"