File compiz-gwd-fix-tooltips.patch of Package compiz
--- a/gtk/window-decorator/gtk-window-decorator.h
+++ b/gtk/window-decorator/gtk-window-decorator.h
@@ -284,7 +284,6 @@ extern gint double_click_timeout;
/* tooltip */
extern GtkWidget *tip_window;
extern GtkWidget *tip_label;
-extern GTimeVal tooltip_last_popdown;
extern gint tooltip_timer_tag;
extern GSList *draw_list;
--- a/gtk/window-decorator/tooltip.c
+++ b/gtk/window-decorator/tooltip.c
@@ -23,31 +23,23 @@
/* stolen from gtktooltip.c */
-#define DEFAULT_DELAY 500 /* Default delay in ms */
-#define STICKY_DELAY 0 /* Delay before popping up next tip
- * if we're sticky
- */
-#define STICKY_REVERT_DELAY 1000 /* Delay before sticky tooltips revert
- * to normal
- */
+#define DEFAULT_DELAY 400 /* Default delay in ms */
static void
show_tooltip (const char *text)
{
GdkDeviceManager *device_manager;
GdkDevice *pointer;
- GtkRequisition requisition;
gint x, y, w, h;
GdkScreen *screen;
gint monitor_num;
GdkRectangle monitor;
- gtk_label_set_text (GTK_LABEL (tip_label), text);
+ screen = gdk_screen_get_default ();
- gtk_widget_get_preferred_size (tip_window, &requisition, NULL);
+ gtk_label_set_markup (GTK_LABEL (tip_label), text);
- w = requisition.width;
- h = requisition.height;
+ gtk_window_get_size (GTK_WINDOW (tip_window), &w, &h);
device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
pointer = gdk_device_manager_get_client_pointer (device_manager);
@@ -76,9 +68,6 @@ show_tooltip (const char *text)
static void
hide_tooltip (void)
{
- if (gtk_widget_get_visible (tip_window))
- g_get_current_time (&tooltip_last_popdown);
-
gtk_widget_hide (tip_window);
if (tooltip_timer_tag)
@@ -88,23 +77,6 @@ hide_tooltip (void)
}
}
-static gboolean
-tooltip_recently_shown (void)
-{
- GTimeVal now;
- glong msec;
-
- g_get_current_time (&now);
-
- msec = now.tv_sec - tooltip_last_popdown.tv_sec;
- if (msec > STICKY_REVERT_DELAY / 1000)
- return FALSE;
-
- msec = msec * 1000 + (now.tv_usec - tooltip_last_popdown.tv_usec) / 1000;
-
- return (msec < STICKY_REVERT_DELAY);
-}
-
static gint
tooltip_timeout (gpointer data)
{
@@ -118,15 +90,10 @@ tooltip_timeout (gpointer data)
static void
tooltip_start_delay (const char *text)
{
- guint delay = DEFAULT_DELAY;
-
if (tooltip_timer_tag)
return;
- if (tooltip_recently_shown ())
- delay = STICKY_DELAY;
-
- tooltip_timer_tag = g_timeout_add (delay,
+ tooltip_timer_tag = g_timeout_add (DEFAULT_DELAY,
tooltip_timeout,
(gpointer) text);
}
@@ -137,9 +104,16 @@ tooltip_paint_window (GtkWidget *tooltip
{
GtkRequisition req;
- gtk_widget_get_preferred_size (tip_window, &req, NULL);
- gtk_render_background (gtk_widget_get_style_context (tip_window),
+ if (!tooltip)
+ return FALSE;
+
+ req.width = gtk_widget_get_allocated_width (tooltip);
+ req.height = gtk_widget_get_allocated_height (tooltip);
+
+ gtk_render_background (gtk_widget_get_style_context (tooltip),
cr, 0, 0, req.width, req.height);
+ gtk_render_frame (gtk_widget_get_style_context (tooltip),
+ cr, 0, 0, req.width, req.height);
return FALSE;
}
@@ -147,24 +121,37 @@ tooltip_paint_window (GtkWidget *tooltip
gboolean
create_tooltip_window (void)
{
+ GdkScreen *screen;
+ GdkVisual *visual;
+
+ screen = gdk_screen_get_default ();
+
tip_window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_widget_set_app_paintable (tip_window, TRUE);
gtk_window_set_resizable (GTK_WINDOW (tip_window), FALSE);
- gtk_widget_set_name (tip_window, "gtk-tooltips");
+ gtk_style_context_add_class (gtk_widget_get_style_context (tip_window),
+ GTK_STYLE_CLASS_TOOLTIP);
gtk_container_set_border_width (GTK_CONTAINER (tip_window), 4);
gtk_window_set_type_hint (GTK_WINDOW (tip_window),
GDK_WINDOW_TYPE_HINT_TOOLTIP);
- g_signal_connect_swapped (tip_window,
- "draw",
- G_CALLBACK (tooltip_paint_window),
- 0);
+ gtk_window_set_screen (GTK_WINDOW (tip_window), screen);
+
+ visual = gdk_screen_get_rgba_visual (screen);
+ if (visual)
+ gtk_widget_set_visual (tip_window, visual);
+
+ g_signal_connect (G_OBJECT (tip_window),
+ "draw",
+ G_CALLBACK (tooltip_paint_window),
+ NULL);
tip_label = gtk_label_new (NULL);
gtk_label_set_line_wrap (GTK_LABEL (tip_label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (tip_label), 0.5, 0.5);
+ gtk_widget_set_halign (tip_label, GTK_ALIGN_CENTER);
+ gtk_widget_set_valign (tip_label, GTK_ALIGN_CENTER);
gtk_widget_show (tip_label);
gtk_container_add (GTK_CONTAINER (tip_window), tip_label);