Bug 752543 - Left tooltip from preview panel when mouse leaves it

This commit is contained in:
Milan Crha
2015-11-27 16:12:53 +01:00
parent 2a866a0bdf
commit 6d409e65ec

View File

@ -81,6 +81,8 @@ struct _EWebViewPrivate {
/* To workaround webkit bug:
* https://bugs.webkit.org/show_bug.cgi?id=89553 */
EWebViewZoomHackState zoom_hack_state;
gboolean has_hover_link;
};
struct _AsyncContext {
@ -550,6 +552,8 @@ web_view_hovering_over_link_cb (EWebView *web_view,
{
EWebViewClass *class;
web_view->priv->has_hover_link = uri && *uri;
/* XXX WebKitWebView does not provide a class method for
* this signal, so we do so we can override the default
* behavior from subclasses for special URI types. */
@ -1500,6 +1504,57 @@ web_view_disable_webkit_3rd_party_plugins (gpointer unused)
return NULL;
}
static void
web_view_toplevel_event_after_cb (GtkWidget *widget,
GdkEvent *event,
EWebView *web_view)
{
if (event && event->type == GDK_MOTION_NOTIFY && web_view->priv->has_hover_link) {
GdkEventMotion *motion_event = (GdkEventMotion *) event;
if (gdk_event_get_window (event) != gtk_widget_get_window (GTK_WIDGET (web_view))) {
GdkEventMotion fake_motion_event;
gboolean result = FALSE;
fake_motion_event = *motion_event;
fake_motion_event.x = -1.0;
fake_motion_event.y = -1.0;
fake_motion_event.window = gtk_widget_get_window (GTK_WIDGET (web_view));
/* Use a fake event instead of the call to unset the status message, because
WebKit caches which link it stays on and doesn't emit the signal when still
moving about the same link, thus this will unset the link also for the WebKit. */
g_signal_emit_by_name (web_view, "motion-notify-event", &fake_motion_event, &result);
web_view->priv->has_hover_link = FALSE;
}
}
}
static void
web_view_map (GtkWidget *widget)
{
GtkWidget *toplevel;
toplevel = gtk_widget_get_toplevel (widget);
g_signal_connect (toplevel, "event-after", G_CALLBACK (web_view_toplevel_event_after_cb), widget);
GTK_WIDGET_CLASS (e_web_view_parent_class)->map (widget);
}
static void
web_view_unmap (GtkWidget *widget)
{
GtkWidget *toplevel;
toplevel = gtk_widget_get_toplevel (widget);
g_signal_handlers_disconnect_by_func (toplevel, G_CALLBACK (web_view_toplevel_event_after_cb), widget);
GTK_WIDGET_CLASS (e_web_view_parent_class)->unmap (widget);
}
static void
e_web_view_class_init (EWebViewClass *class)
{
@ -1518,6 +1573,8 @@ e_web_view_class_init (EWebViewClass *class)
widget_class = GTK_WIDGET_CLASS (class);
widget_class->scroll_event = web_view_scroll_event;
widget_class->drag_motion = web_view_drag_motion;
widget_class->map = web_view_map;
widget_class->unmap = web_view_unmap;
class->create_plugin_widget = web_view_create_plugin_widget;
class->hovering_over_link = web_view_hovering_over_link;