From aea554edaab8d133f2dccb7df0b4d4923257525e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Mon, 3 May 2021 17:04:39 +0300 Subject: tasklist: do not queue_resize from size_allocate From GTK documentation: https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-queue-resize Note that you cannot call gtk_widget_queue_resize() on a widget from inside its implementation of the GtkWidgetClass::size_allocate virtual method. Calls to gtk_widget_queue_resize() from inside GtkWidgetClass::size_allocate will be silently ignored. https://bugzilla.gnome.org/show_bug.cgi?id=658106 --- libwnck/tasklist.c | 60 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/libwnck/tasklist.c b/libwnck/tasklist.c index 955af01..5f880fa 100644 --- a/libwnck/tasklist.c +++ b/libwnck/tasklist.c @@ -159,8 +159,11 @@ struct _WnckTask gint row; gint col; - - guint resize_idle_id; + + gboolean show_image; + gboolean show_label; + + guint update_idle_id; }; struct _WnckTaskClass @@ -367,7 +370,7 @@ static void wnck_task_init (WnckTask *task) { task->type = WNCK_TASK_WINDOW; - task->resize_idle_id = 0; + task->update_idle_id = 0; } static void @@ -564,10 +567,10 @@ wnck_task_finalize (GObject *object) wnck_task_stop_glow (task); - if (task->resize_idle_id > 0) + if (task->update_idle_id != 0) { - g_source_remove (task->resize_idle_id); - task->resize_idle_id = 0; + g_source_remove (task->update_idle_id); + task->update_idle_id = 0; } G_OBJECT_CLASS (wnck_task_parent_class)->finalize (object); @@ -1485,12 +1488,16 @@ wnck_tasklist_get_size_hint_list (WnckTasklist *tasklist, } static gboolean -task_button_queue_resize (gpointer user_data) +wnck_task_update_idle_cb (gpointer user_data) { - WnckTask *task = WNCK_TASK (user_data); + WnckTask *task; + + task = user_data; + + gtk_widget_set_visible (task->image, task->show_image); + gtk_widget_set_visible (task->label, task->show_label); - gtk_widget_queue_resize (task->button); - task->resize_idle_id = 0; + task->update_idle_id = 0; return G_SOURCE_REMOVE; } @@ -1505,8 +1512,6 @@ wnck_task_size_allocated (GtkWidget *widget, GtkStateFlags state; GtkBorder padding; int min_image_width; - gboolean old_image_visible; - gboolean old_label_visible; context = gtk_widget_get_style_context (widget); state = gtk_style_context_get_state (context); @@ -1515,26 +1520,33 @@ wnck_task_size_allocated (GtkWidget *widget, min_image_width = MINI_ICON_SIZE + padding.left + padding.right + 2 * TASKLIST_BUTTON_PADDING; - old_image_visible = gtk_widget_get_visible (task->image); - old_label_visible = gtk_widget_get_visible (task->label); if ((allocation->width < min_image_width + 2 * TASKLIST_BUTTON_PADDING) && (allocation->width >= min_image_width)) { - gtk_widget_show (task->image); - gtk_widget_hide (task->label); + task->show_image = TRUE; + task->show_label = FALSE; } else if (allocation->width < min_image_width) { - gtk_widget_hide (task->image); - gtk_widget_show (task->label); + task->show_image = FALSE; + task->show_label = TRUE; } else { - gtk_widget_show (task->image); - gtk_widget_show (task->label); + task->show_image = TRUE; + task->show_label = TRUE; } - if (old_image_visible != gtk_widget_get_visible (task->image) || - old_label_visible != gtk_widget_get_visible (task->label)) + if (task->show_image != gtk_widget_get_visible (task->image) || + task->show_label != gtk_widget_get_visible (task->label)) + { + if (task->update_idle_id == 0) + { + task->update_idle_id = g_idle_add (wnck_task_update_idle_cb, task); + g_source_set_name_by_id (task->update_idle_id, + "[libwnck] wnck_task_update_idle_cb"); + } + } + else if (task->update_idle_id != 0) { - if (task->resize_idle_id == 0) - task->resize_idle_id = g_idle_add (task_button_queue_resize, task); + g_source_remove (task->update_idle_id); + task->update_idle_id = 0; } } -- cgit v1.2.1