diff -u trunk/panel-plugin/datetime.c bug4141/panel-plugin/datetime.c --- trunk/panel-plugin/datetime.c 2008-06-08 19:17:04.000000000 -0700 +++ bug4141/panel-plugin/datetime.c 2008-06-21 12:51:40.000000000 -0700 @@ -186,6 +186,8 @@ gchar *utf8str; gchar *format = NULL; + DBG("enter (%d,%d) (%d)", x, y, keyboard_mode); + switch(datetime->layout) { case LAYOUT_TIME: @@ -205,6 +207,14 @@ current = localtime((time_t *)&timeval.tv_sec); utf8str = datetime_do_utf8strftime(format, current); + DBG("%ld.%06ld (%s)", timeval.tv_sec, timeval.tv_usec, utf8str); + +#if USE_GTK_TOOLTIP_POSITION_WORKAROUND + if (x < 0 || y < 0) { + return FALSE; + } +#endif + gtk_tooltip_set_text(tooltip, utf8str); g_free(utf8str); @@ -219,9 +229,89 @@ (GSourceFunc) datetime_tooltip_timer, datetime); } + return TRUE; } -#endif + +#if USE_GTK_TOOLTIP_POSITION_WORKAROUND +static inline void datetime_set_gtk_tooltip_timeouts(t_datetime *datetime, + glong bmt, glong bt, glong t) +{ + GtkSettings *sp = datetime->gtk_settings; + if (sp == NULL) return; /* per documentation */ + gtk_settings_set_long_property(sp, "gtk-tooltip-browse-mode-timeout", bmt, "datetime"); + gtk_settings_set_long_property(sp, "gtk-tooltip-browse-timeout", bt, "datetime"); + gtk_settings_set_long_property(sp, "gtk-tooltip-timeout", t, "datetime"); +} + +static inline void datetime_set_gtk_tooltip_timeouts_to_zero(t_datetime *datetime) +{ + datetime_set_gtk_tooltip_timeouts(datetime, 0, 0, 0); +} + +/* + * Default timeouts are from the documentation. + * http://library.gnome.org/devel/gtk/stable/GtkSettings.html + */ +static inline void datetime_set_gtk_tooltip_timeouts_to_defaults(t_datetime *datetime) +{ + datetime_set_gtk_tooltip_timeouts(datetime, 500, 60, 500); +} + +/* + * Event handler for: + * "enter-notify-event" + * "leave-notify-event" + * The tooltip timeouts are global to the panel process, + * so they are set to zero when the cursor enters the button widget's rectangle + * and restored to defaults when the cursor leaves. + */ +static gboolean datetime_enter_leave(GtkWidget *widget, + GdkEventCrossing *event, + t_datetime *datetime) +{ + switch(event->type) + { + case GDK_ENTER_NOTIFY: + DBG("GDK_ENTER_NOTIFY"); + datetime_set_gtk_tooltip_timeouts_to_zero(datetime); + break; + case GDK_LEAVE_NOTIFY: + DBG("GDK_LEAVE_NOTIFY"); + datetime_set_gtk_tooltip_timeouts_to_defaults(datetime); + break; + default: + DBG("unexpected event type"); + break; + } + return FALSE; +} + +static void datetime_connect_tooltip_timeout_settings_handlers(t_datetime *datetime) +{ + if (datetime->gtk_settings == NULL) /* init on first call */ + datetime->gtk_settings = gtk_settings_get_default(); + if (datetime->enter_notify_handler_id == 0) + datetime->enter_notify_handler_id = g_signal_connect(datetime->button, "enter-notify-event", + G_CALLBACK(datetime_enter_leave), datetime); + if (datetime->leave_notify_handler_id == 0) + datetime->leave_notify_handler_id = g_signal_connect(datetime->button, "leave-notify-event", + G_CALLBACK(datetime_enter_leave), datetime); +} + +static void datetime_disconnect_tooltip_timeout_settings_handlers(t_datetime *datetime) +{ + if (datetime->enter_notify_handler_id != 0) { + g_signal_handler_disconnect(datetime->button, datetime->enter_notify_handler_id); + datetime->enter_notify_handler_id = 0; + } + if (datetime->leave_notify_handler_id != 0) { + g_signal_handler_disconnect(datetime->button, datetime->leave_notify_handler_id); + datetime->leave_notify_handler_id = 0; + } +} +#endif /* USE_GTK_TOOLTIP_POSITION_WORKAROUND */ +#endif /* USE_GTK_TOOLTIP_API */ static void on_calendar_realized(GtkWidget *widget, gpointer data) { @@ -467,10 +557,16 @@ datetime->tooltip_handler_id = g_signal_connect(datetime->button, "query-tooltip", G_CALLBACK(datetime_query_tooltip), datetime); +#if USE_GTK_TOOLTIP_POSITION_WORKAROUND + datetime_connect_tooltip_timeout_settings_handlers(datetime); +#endif break; default: gtk_widget_set_has_tooltip(GTK_WIDGET(datetime->button), FALSE); +#if USE_GTK_TOOLTIP_POSITION_WORKAROUND + datetime_disconnect_tooltip_timeout_settings_handlers(datetime); +#endif } #endif diff -u trunk/panel-plugin/datetime.h bug4141/panel-plugin/datetime.h --- trunk/panel-plugin/datetime.h 2008-06-21 08:10:18.000000000 -0700 +++ bug4141/panel-plugin/datetime.h 2008-06-21 11:44:20.000000000 -0700 @@ -24,6 +24,15 @@ #define USE_GTK_TOOLTIP_API GTK_CHECK_VERSION(2,12,0) +#if USE_GTK_TOOLTIP_API +/* + * Workaround for bug 4141, which reports + * that the tooltip sometimes appears in the upper left corner of the display + * instead of over the datetime button widget. + */ +#define USE_GTK_TOOLTIP_POSITION_WORKAROUND 1 +#endif + /* enums */ enum { DATE = 0, @@ -51,6 +60,11 @@ #if USE_GTK_TOOLTIP_API guint tooltip_timeout_id; gulong tooltip_handler_id; +#if USE_GTK_TOOLTIP_POSITION_WORKAROUND + GtkSettings *gtk_settings; + gulong enter_notify_handler_id; + gulong leave_notify_handler_id; +#endif #endif /* settings */