[SF#823] Fix crash on action on task which was deleted while task menu is opened.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Sun, 23 Oct 2016 17:42:50 +0000 (20:42 +0300)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Sun, 23 Oct 2016 17:42:50 +0000 (20:42 +0300)
This does not happen if task button has only task - it will be deleted and
menu attached to task button destroyed. Although if task button has few tasks
then while task is already deleted from task button, list of tasks still have
it so menu actions can be requested (for not existing now window), so crash.
Remove menu item from list should solve the issue.

ChangeLog
TODO
plugins/task-button.c

index af12b37..852804a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -49,6 +49,8 @@
 * Added a configuration dialog to the 'volume' plugin with all the new
     settings available to choose and set, including preset of discovered
     mixers, with ability to type own command as well.
+* Fixed crash on action on task window which was deleted while task menu
+    is still opened.
 
 0.8.2
 -------------------------------------------------------------------------
diff --git a/TODO b/TODO
index d05df9a..4c0985f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,6 @@
 * "Move" option in plugin context menu
 * LXPanelPluginInit::activatable flag to allow activation with hotkey
 * accessibility (keys-only; single-button-mouse; special devices)
-* 'volumealsa' improvements
 * compose new custom launcher in launchbar config dialog
 * special launchers support ()
 * launchbar template with LockScreen and Shutdown
index d0a260d..fcb026e 100644 (file)
@@ -1820,6 +1820,9 @@ gboolean task_button_drop_window(TaskButton *button, Window win, gboolean leave_
         task_redraw_label(button);
         // FIXME: test if need to update menu
     }
+    /* bug SF#823: menu may be still opened for this window */
+    if (button->menu_list && details->menu_item)
+        gtk_widget_destroy(details->menu_item);
     free_task_details(details);
     return TRUE;
 }
@@ -1897,5 +1900,11 @@ gboolean task_button_merge(TaskButton *button, TaskButton *sibling)
 /* single-instance-menu management, should be called on button parent widget */
 void task_button_reset_menu(GtkWidget *parent)
 {
-    g_object_set_data(G_OBJECT(parent), "task-button-menu", NULL);
+    GtkWidget *menu = g_object_get_data(G_OBJECT(parent), "task-button-menu");
+
+    if (menu)
+    {
+        gtk_menu_detach(GTK_MENU(menu));
+        g_object_set_data(G_OBJECT(parent), "task-button-menu", NULL);
+    }
 }