Merge lp:~3v1n0/unity/quicklist-hide-fix into lp:unity

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Gord Allott
Approved revision: no longer in the source branch.
Merged at revision: 1514
Proposed branch: lp:~3v1n0/unity/quicklist-hide-fix
Merge into: lp:unity
Diff against target: 513 lines (+200/-114)
3 files modified
plugins/unityshell/src/BamfLauncherIcon.cpp (+193/-113)
plugins/unityshell/src/BamfLauncherIcon.h (+4/-1)
plugins/unityshell/src/LauncherIcon.cpp (+3/-0)
To merge this branch: bzr merge lp:~3v1n0/unity/quicklist-hide-fix
Reviewer Review Type Date Requested Status
Gord Allott (community) Approve
Review via email: mp+74371@code.launchpad.net

Description of the change

This branch includes various fixes for the QuickList handling such as:
 - Correct hiding of quicklist items and quicklist roots (including not showing unneeded separators, see more at bug #843425).
 - Support for monitoring .desktop file changes to dynamically update the "static" quicklist generated using the launcher .desktop file
 - Some memory optimizations and fix of memory leaks
 - Fixed a bug causing unity to crash if removing launcher with an open quicklist (bug #801413)

To post a comment you must log in.
Revision history for this message
Gord Allott (gordallott) wrote :

+1 thanks!

Revision history for this message
Gord Allott (gordallott) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'plugins/unityshell/src/BamfLauncherIcon.cpp'
--- plugins/unityshell/src/BamfLauncherIcon.cpp 2011-08-30 16:48:12 +0000
+++ plugins/unityshell/src/BamfLauncherIcon.cpp 2011-09-07 09:42:19 +0000
@@ -144,6 +144,7 @@
144 _dnd_hovered = false;144 _dnd_hovered = false;
145 _launcher = IconManager;145 _launcher = IconManager;
146 _menu_desktop_shortcuts = NULL;146 _menu_desktop_shortcuts = NULL;
147 _on_desktop_file_changed_handler_id = 0;
147 char* icon_name = bamf_view_get_icon(BAMF_VIEW(m_App));148 char* icon_name = bamf_view_get_icon(BAMF_VIEW(m_App));
148149
149 tooltip_text = BamfName();150 tooltip_text = BamfName();
@@ -173,17 +174,7 @@
173 EnsureWindowState();174 EnsureWindowState();
174 UpdateMenus();175 UpdateMenus();
175176
176 // add a file watch to the desktop file so that if/when the app is removed we can remove ourself from the launcher.177 UpdateDesktopFile();
177 GFile* _desktop_file = g_file_new_for_path(DesktopFile());
178 _desktop_file_monitor = g_file_monitor_file(_desktop_file,
179 G_FILE_MONITOR_NONE,
180 NULL,
181 NULL);
182
183 _on_desktop_file_changed_handler_id = g_signal_connect(_desktop_file_monitor,
184 "changed",
185 G_CALLBACK(&BamfLauncherIcon::OnDesktopFileChanged),
186 this);
187178
188 WindowManager::Default()->window_minimized.connect(sigc::mem_fun(this, &BamfLauncherIcon::OnWindowMinimized));179 WindowManager::Default()->window_minimized.connect(sigc::mem_fun(this, &BamfLauncherIcon::OnWindowMinimized));
189 WindowManager::Default()->compiz_screen_viewport_switch_ended.connect(sigc::mem_fun(this, &BamfLauncherIcon::OnViewPortSwitchEnded));180 WindowManager::Default()->compiz_screen_viewport_switch_ended.connect(sigc::mem_fun(this, &BamfLauncherIcon::OnViewPortSwitchEnded));
@@ -192,7 +183,7 @@
192183
193 // hack184 // hack
194 SetProgress(0.0f);185 SetProgress(0.0f);
195 186
196 // Calls when there are no higher priority events pending to the default main loop.187 // Calls when there are no higher priority events pending to the default main loop.
197 _fill_supported_types_id = g_idle_add((GSourceFunc)FillSupportedTypes, this);188 _fill_supported_types_id = g_idle_add((GSourceFunc)FillSupportedTypes, this);
198189
@@ -203,22 +194,40 @@
203 g_object_set_qdata(G_OBJECT(m_App), g_quark_from_static_string("unity-seen"), GINT_TO_POINTER(0));194 g_object_set_qdata(G_OBJECT(m_App), g_quark_from_static_string("unity-seen"), GINT_TO_POINTER(0));
204195
205 // We might not have created the menu items yet196 // We might not have created the menu items yet
197 for (auto it = _menu_clients.begin(); it != _menu_clients.end(); it++)
198 {
199 g_object_unref(G_OBJECT(it->second));
200 }
201
206 if (_menu_items.find("Pin") != _menu_items.end())202 if (_menu_items.find("Pin") != _menu_items.end())
207 {203 {
208 g_signal_handler_disconnect((gpointer) _menu_items["Pin"],204 g_signal_handler_disconnect(G_OBJECT(_menu_items["Pin"]),
209 _menu_callbacks["Pin"]);205 _menu_callbacks["Pin"]);
210 }206 }
211207
212 if (_menu_items.find("Quit") != _menu_items.end())208 if (_menu_items.find("Quit") != _menu_items.end())
213 {209 {
214 g_signal_handler_disconnect((gpointer) _menu_items["Quit"],210 g_signal_handler_disconnect(G_OBJECT(_menu_items["Quit"]),
215 _menu_callbacks["Quit"]);211 _menu_callbacks["Quit"]);
216 }212 }
217213
214 for (auto it = _menu_items.begin(); it != _menu_items.end(); it++)
215 {
216 g_object_unref(G_OBJECT(it->second));
217 }
218
219 for (auto it = _menu_items_extra.begin(); it != _menu_items_extra.end(); it++)
220 {
221 g_object_unref(G_OBJECT(it->second));
222 }
223
224 if (G_IS_OBJECT(_menu_desktop_shortcuts))
225 g_object_unref(G_OBJECT(_menu_desktop_shortcuts));
226
218 if (_on_desktop_file_changed_handler_id != 0)227 if (_on_desktop_file_changed_handler_id != 0)
219 g_signal_handler_disconnect((gpointer) _desktop_file_monitor,228 g_signal_handler_disconnect(G_OBJECT(_desktop_file_monitor),
220 _on_desktop_file_changed_handler_id);229 _on_desktop_file_changed_handler_id);
221 230
222 if (_fill_supported_types_id != 0)231 if (_fill_supported_types_id != 0)
223 g_source_remove(_fill_supported_types_id);232 g_source_remove(_fill_supported_types_id);
224233
@@ -322,19 +331,40 @@
322 return bamf_view_is_sticky(BAMF_VIEW(m_App));331 return bamf_view_is_sticky(BAMF_VIEW(m_App));
323}332}
324333
325const char* BamfLauncherIcon::DesktopFile()334void BamfLauncherIcon::UpdateDesktopFile()
326{335{
327 char* filename = NULL;336 char* filename = NULL;
328 filename = (char*) bamf_application_get_desktop_file(m_App);337 filename = (char*) bamf_application_get_desktop_file(m_App);
329338
330 if (filename != NULL)339 if (filename != NULL && g_strcmp0(_cached_desktop_file, filename) != 0)
331 {340 {
332 if (_cached_desktop_file != NULL)341 if (_cached_desktop_file != NULL)
333 g_free(_cached_desktop_file);342 g_free(_cached_desktop_file);
334343
335 _cached_desktop_file = g_strdup(filename);344 _cached_desktop_file = g_strdup(filename);
345
346 // add a file watch to the desktop file so that if/when the app is removed
347 // we can remove ourself from the launcher and when it's changed
348 // we can update the quicklist.
349
350 if (_on_desktop_file_changed_handler_id != 0)
351 g_signal_handler_disconnect(G_OBJECT(_desktop_file_monitor),
352 _on_desktop_file_changed_handler_id);
353
354 GFile* desktop_file = g_file_new_for_path(DesktopFile());
355 _desktop_file_monitor = g_file_monitor_file(desktop_file, G_FILE_MONITOR_NONE,
356 NULL, NULL);
357 g_file_monitor_set_rate_limit (_desktop_file_monitor, 1000);
358 _on_desktop_file_changed_handler_id = g_signal_connect(_desktop_file_monitor,
359 "changed",
360 G_CALLBACK(&BamfLauncherIcon::OnDesktopFileChanged),
361 this);
336 }362 }
363}
337364
365const char* BamfLauncherIcon::DesktopFile()
366{
367 UpdateDesktopFile();
338 return _cached_desktop_file;368 return _cached_desktop_file;
339}369}
340370
@@ -357,7 +387,7 @@
357{387{
358 LauncherIcon::AddProperties(builder);388 LauncherIcon::AddProperties(builder);
359389
360 g_variant_builder_add(builder, "{sv}", "desktop-file", g_variant_new_string(bamf_application_get_desktop_file(m_App)));390 g_variant_builder_add(builder, "{sv}", "desktop-file", g_variant_new_string(DesktopFile()));
361391
362 GList* children, *l;392 GList* children, *l;
363 BamfView* view;393 BamfView* view;
@@ -414,7 +444,7 @@
414 GDesktopAppInfo* appInfo;444 GDesktopAppInfo* appInfo;
415 GError* error = NULL;445 GError* error = NULL;
416446
417 appInfo = g_desktop_app_info_new_from_filename(bamf_application_get_desktop_file(BAMF_APPLICATION(m_App)));447 appInfo = g_desktop_app_info_new_from_filename(DesktopFile());
418448
419 if (g_app_info_supports_uris(G_APP_INFO(appInfo)))449 if (g_app_info_supports_uris(G_APP_INFO(appInfo)))
420 {450 {
@@ -613,10 +643,83 @@
613 self->EnsureWindowState();643 self->EnsureWindowState();
614}644}
615645
646void BamfLauncherIcon::UpdateDesktopQuickList()
647{
648 IndicatorDesktopShortcuts* desktop_shortcuts;
649 GKeyFile* keyfile;
650 GError* error = NULL;
651 const char *desktop_file;
652
653 desktop_file = DesktopFile();
654
655 if (!desktop_file || g_strcmp0(desktop_file, "") == 0)
656 return;
657
658 // check that we have the X-Ayatana-Desktop-Shortcuts flag
659 // not sure if we should do this or if libindicator should shut up
660 // and not report errors when it can't find the key.
661 // so FIXME when ted is around
662 keyfile = g_key_file_new();
663 g_key_file_load_from_file(keyfile, desktop_file, G_KEY_FILE_NONE, &error);
664
665 if (error != NULL)
666 {
667 g_warning("Could not load desktop file for: %s", desktop_file);
668 g_key_file_free(keyfile);
669 g_error_free(error);
670 return;
671 }
672
673 if (g_key_file_has_key(keyfile, G_KEY_FILE_DESKTOP_GROUP,
674 "X-Ayatana-Desktop-Shortcuts", NULL))
675 {
676 DbusmenuMenuitem* root = dbusmenu_menuitem_new();
677 dbusmenu_menuitem_set_root(root, TRUE);
678 desktop_shortcuts = indicator_desktop_shortcuts_new(desktop_file, "Unity");
679 const gchar** nicks = indicator_desktop_shortcuts_get_nicks(desktop_shortcuts);
680
681 int index = 0;
682 if (nicks)
683 {
684 while (((gpointer*) nicks)[index])
685 {
686 gchar* name;
687 DbusmenuMenuitem* item;
688 name = indicator_desktop_shortcuts_nick_get_name(desktop_shortcuts,
689 nicks[index]);
690 ShortcutData* data = g_slice_new0(ShortcutData);
691 data->self = this;
692 data->shortcuts = INDICATOR_DESKTOP_SHORTCUTS(g_object_ref(desktop_shortcuts));
693 data->nick = g_strdup(nicks[index]);
694
695 item = dbusmenu_menuitem_new();
696 dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, name);
697 dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
698 dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
699 g_signal_connect_data(item, "item-activated",
700 (GCallback) shortcut_activated, (gpointer) data,
701 (GClosureNotify) shortcut_data_destroy, (GConnectFlags)0);
702
703 dbusmenu_menuitem_child_append(root, item);
704
705 index++;
706
707 g_free(name);
708 }
709 }
710
711 if (G_IS_OBJECT(_menu_desktop_shortcuts))
712 g_object_unref(G_OBJECT(_menu_desktop_shortcuts));
713
714 _menu_desktop_shortcuts = root;
715 }
716
717 g_key_file_free(keyfile);
718}
719
616void BamfLauncherIcon::UpdateMenus()720void BamfLauncherIcon::UpdateMenus()
617{721{
618 GList* children, *l;722 GList* children, *l;
619 IndicatorDesktopShortcuts* desktop_shortcuts;
620723
621 children = bamf_view_get_children(BAMF_VIEW(m_App));724 children = bamf_view_get_children(BAMF_VIEW(m_App));
622 for (l = children; l; l = l->next)725 for (l = children; l; l = l->next)
@@ -639,73 +742,15 @@
639742
640 // add dynamic quicklist743 // add dynamic quicklist
641 if (_menuclient_dynamic_quicklist != NULL)744 if (_menuclient_dynamic_quicklist != NULL)
642 _menu_clients["dynamicquicklist"] = _menuclient_dynamic_quicklist;745 {
746 auto menu_client = DBUSMENU_CLIENT(g_object_ref(_menuclient_dynamic_quicklist));
747 _menu_clients["dynamicquicklist"] = menu_client;
748 }
643749
644 // make a client for desktop file actions750 // make a client for desktop file actions
645 if (!DBUSMENU_IS_MENUITEM(_menu_desktop_shortcuts) &&751 if (!DBUSMENU_IS_MENUITEM(_menu_desktop_shortcuts))
646 g_strcmp0(DesktopFile(), """"))
647 {752 {
648 GKeyFile* keyfile;753 UpdateDesktopQuickList();
649 GError* error = NULL;
650
651 // check that we have the X-Ayatana-Desktop-Shortcuts flag
652 // not sure if we should do this or if libindicator should shut up
653 // and not report errors when it can't find the key.
654 // so FIXME when ted is around
655 keyfile = g_key_file_new();
656 g_key_file_load_from_file(keyfile, DesktopFile(), G_KEY_FILE_NONE, &error);
657
658 if (error != NULL)
659 {
660 g_warning("Could not load desktop file for: %s" , DesktopFile());
661 g_error_free(error);
662 return;
663 }
664
665 if (g_key_file_has_key(keyfile, G_KEY_FILE_DESKTOP_GROUP,
666 "X-Ayatana-Desktop-Shortcuts", NULL))
667 {
668 DbusmenuMenuitem* root = dbusmenu_menuitem_new();
669 dbusmenu_menuitem_set_root(root, TRUE);
670 desktop_shortcuts = indicator_desktop_shortcuts_new(bamf_application_get_desktop_file(m_App),
671 "Unity");
672 const gchar** nicks = indicator_desktop_shortcuts_get_nicks(desktop_shortcuts);
673
674 int index = 0;
675 if (nicks)
676 {
677 while (((gpointer*) nicks)[index])
678 {
679 gchar* name;
680 DbusmenuMenuitem* item;
681 name = indicator_desktop_shortcuts_nick_get_name(desktop_shortcuts,
682 nicks[index]);
683 ShortcutData* data = g_slice_new0(ShortcutData);
684 data->self = this;
685 data->shortcuts = INDICATOR_DESKTOP_SHORTCUTS(g_object_ref(desktop_shortcuts));
686 data->nick = g_strdup(nicks[index]);
687
688 item = dbusmenu_menuitem_new();
689 dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, name);
690 dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
691 dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
692 g_signal_connect_data(item, "item-activated",
693 (GCallback) shortcut_activated, (gpointer) data,
694 (GClosureNotify) shortcut_data_destroy, (GConnectFlags)0);
695
696 dbusmenu_menuitem_child_append(root, item);
697
698 index++;
699
700 g_free(name);
701 }
702 }
703
704 // TODO: check unref prior to assign, and add unref to destructor.
705 _menu_desktop_shortcuts = root;
706 g_key_file_free(keyfile);
707
708 }
709 }754 }
710755
711}756}
@@ -738,7 +783,7 @@
738 if (!bamf_view_is_sticky(view))783 if (!bamf_view_is_sticky(view))
739 return;784 return;
740785
741 const gchar* desktop_file = bamf_application_get_desktop_file(this->m_App);786 const gchar* desktop_file = DesktopFile();
742 bamf_view_set_sticky(view, false);787 bamf_view_set_sticky(view, false);
743 if (bamf_view_is_closed(view))788 if (bamf_view_is_closed(view))
744 this->Remove();789 this->Remove();
@@ -751,7 +796,7 @@
751{796{
752 BamfView* view = BAMF_VIEW(self->m_App);797 BamfView* view = BAMF_VIEW(self->m_App);
753 bool sticky = bamf_view_is_sticky(view);798 bool sticky = bamf_view_is_sticky(view);
754 const gchar* desktop_file = bamf_application_get_desktop_file(self->m_App);799 const gchar* desktop_file = self->DesktopFile();
755800
756 if (sticky)801 if (sticky)
757 {802 {
@@ -774,7 +819,6 @@
774 if (_menu_items.find("Pin") == _menu_items.end())819 if (_menu_items.find("Pin") == _menu_items.end())
775 {820 {
776 menu_item = dbusmenu_menuitem_new();821 menu_item = dbusmenu_menuitem_new();
777 g_object_ref(menu_item);
778822
779 dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE, DBUSMENU_MENUITEM_TOGGLE_CHECK);823 dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE, DBUSMENU_MENUITEM_TOGGLE_CHECK);
780 dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Keep in launcher"));824 dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Keep in launcher"));
@@ -797,7 +841,6 @@
797 if (_menu_items.find("Quit") == _menu_items.end())841 if (_menu_items.find("Quit") == _menu_items.end())
798 {842 {
799 menu_item = dbusmenu_menuitem_new();843 menu_item = dbusmenu_menuitem_new();
800 g_object_ref(menu_item);
801844
802 dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Quit"));845 dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Quit"));
803 dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);846 dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
@@ -838,16 +881,22 @@
838 DbusmenuClient* client = (*it).second;881 DbusmenuClient* client = (*it).second;
839 DbusmenuMenuitem* root = dbusmenu_client_get_root(client);882 DbusmenuMenuitem* root = dbusmenu_client_get_root(client);
840883
884 if (!root || !dbusmenu_menuitem_property_get_bool(root, DBUSMENU_MENUITEM_PROP_VISIBLE))
885 continue;
886
841 for (child = dbusmenu_menuitem_get_children(root); child != NULL; child = g_list_next(child))887 for (child = dbusmenu_menuitem_get_children(root); child != NULL; child = g_list_next(child))
842 {888 {
843 DbusmenuMenuitem* item = (DbusmenuMenuitem*) child->data;889 DbusmenuMenuitem* item = (DbusmenuMenuitem*) child->data;
844890
845 if (!item)891 if (!item || !DBUSMENU_IS_MENUITEM(item))
846 continue;892 continue;
847893
848 first_separator_needed = true;894 if (dbusmenu_menuitem_property_get_bool(item, DBUSMENU_MENUITEM_PROP_VISIBLE))
895 {
896 first_separator_needed = true;
849897
850 result.push_back(item);898 result.push_back(item);
899 }
851 }900 }
852 }901 }
853902
@@ -872,31 +921,59 @@
872921
873 if (first_separator_needed)922 if (first_separator_needed)
874 {923 {
924 auto first_sep = _menu_items_extra.find("FirstSeparator");
925 if (first_sep != _menu_items_extra.end())
926 {
927 item = first_sep->second;
928 }
929 else
930 {
931 item = dbusmenu_menuitem_new();
932 dbusmenu_menuitem_property_set(item,
933 DBUSMENU_MENUITEM_PROP_TYPE,
934 DBUSMENU_CLIENT_TYPES_SEPARATOR);
935 _menu_items_extra["FirstSeparator"] = item;
936 }
937 result.push_back(item);
938 }
939
940 auto app_name_item = _menu_items_extra.find("AppName");
941 if (app_name_item != _menu_items_extra.end())
942 {
943 item = app_name_item->second;
944 }
945 else
946 {
947 gchar* app_name;
948 app_name = g_markup_escape_text(BamfName(), -1);
949
950 item = dbusmenu_menuitem_new();
951 dbusmenu_menuitem_property_set(item,
952 DBUSMENU_MENUITEM_PROP_LABEL,
953 app_name);
954 dbusmenu_menuitem_property_set_bool(item,
955 DBUSMENU_MENUITEM_PROP_ENABLED,
956 true);
957 g_signal_connect(item, "item-activated", (GCallback) OnAppLabelActivated, this);
958 g_free(app_name);
959
960 _menu_items_extra["AppName"] = item;
961 }
962 result.push_back(item);
963
964 auto second_sep = _menu_items_extra.find("SecondSeparator");
965 if (second_sep != _menu_items_extra.end())
966 {
967 item = second_sep->second;
968 }
969 else
970 {
875 item = dbusmenu_menuitem_new();971 item = dbusmenu_menuitem_new();
876 dbusmenu_menuitem_property_set(item,972 dbusmenu_menuitem_property_set(item,
877 DBUSMENU_MENUITEM_PROP_TYPE,973 DBUSMENU_MENUITEM_PROP_TYPE,
878 DBUSMENU_CLIENT_TYPES_SEPARATOR);974 DBUSMENU_CLIENT_TYPES_SEPARATOR);
879 result.push_back(item);975 _menu_items_extra["SecondSeparator"] = item;
880 }976 }
881
882 gchar* app_name;
883 app_name = g_markup_escape_text(BamfName(), -1);
884
885 item = dbusmenu_menuitem_new();
886 dbusmenu_menuitem_property_set(item,
887 DBUSMENU_MENUITEM_PROP_LABEL,
888 app_name);
889 dbusmenu_menuitem_property_set_bool(item,
890 DBUSMENU_MENUITEM_PROP_ENABLED,
891 true);
892 g_signal_connect(item, "item-activated", (GCallback) OnAppLabelActivated, this);
893 result.push_back(item);
894 g_free(app_name);
895
896 item = dbusmenu_menuitem_new();
897 dbusmenu_menuitem_property_set(item,
898 DBUSMENU_MENUITEM_PROP_TYPE,
899 DBUSMENU_CLIENT_TYPES_SEPARATOR);
900 result.push_back(item);977 result.push_back(item);
901978
902 EnsureMenuItemsReady();979 EnsureMenuItemsReady();
@@ -978,7 +1055,7 @@
978{1055{
979 if (!_remote_uri)1056 if (!_remote_uri)
980 {1057 {
981 const gchar* desktop_file = bamf_application_get_desktop_file(BAMF_APPLICATION(m_App));1058 const gchar* desktop_file = DesktopFile();
982 gchar* basename = g_path_get_basename(desktop_file);1059 gchar* basename = g_path_get_basename(desktop_file);
9831060
984 _remote_uri = g_strdup_printf("application://%s", basename);1061 _remote_uri = g_strdup_printf("application://%s", basename);
@@ -1053,6 +1130,9 @@
1053 case G_FILE_MONITOR_EVENT_DELETED:1130 case G_FILE_MONITOR_EVENT_DELETED:
1054 self->UnStick();1131 self->UnStick();
1055 break;1132 break;
1133 case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
1134 self->UpdateDesktopQuickList();
1135 break;
1056 default:1136 default:
1057 break;1137 break;
1058 }1138 }
10591139
=== modified file 'plugins/unityshell/src/BamfLauncherIcon.h'
--- plugins/unityshell/src/BamfLauncherIcon.h 2011-08-30 16:48:12 +0000
+++ plugins/unityshell/src/BamfLauncherIcon.h 2011-09-07 09:42:19 +0000
@@ -81,6 +81,7 @@
81 Launcher* _launcher;81 Launcher* _launcher;
82 std::map<std::string, DbusmenuClient*> _menu_clients;82 std::map<std::string, DbusmenuClient*> _menu_clients;
83 std::map<std::string, DbusmenuMenuitem*> _menu_items;83 std::map<std::string, DbusmenuMenuitem*> _menu_items;
84 std::map<std::string, DbusmenuMenuitem*> _menu_items_extra;
84 std::map<std::string, gulong> _menu_callbacks;85 std::map<std::string, gulong> _menu_callbacks;
85 DbusmenuMenuitem* _menu_desktop_shortcuts;86 DbusmenuMenuitem* _menu_desktop_shortcuts;
86 gchar* _remote_uri;87 gchar* _remote_uri;
@@ -92,14 +93,16 @@
9293
93 GFileMonitor* _desktop_file_monitor;94 GFileMonitor* _desktop_file_monitor;
94 gulong _on_desktop_file_changed_handler_id;95 gulong _on_desktop_file_changed_handler_id;
95 96
96 std::set<std::string> _supported_types;97 std::set<std::string> _supported_types;
97 bool _supported_types_filled;98 bool _supported_types_filled;
98 guint _fill_supported_types_id;99 guint _fill_supported_types_id;
99100
100 void EnsureWindowState();101 void EnsureWindowState();
101102
103 void UpdateDesktopFile();
102 void UpdateMenus();104 void UpdateMenus();
105 void UpdateDesktopQuickList();
103106
104 void OpenInstanceWithUris(std::set<std::string> uris);107 void OpenInstanceWithUris(std::set<std::string> uris);
105 void Focus();108 void Focus();
106109
=== modified file 'plugins/unityshell/src/LauncherIcon.cpp'
--- plugins/unityshell/src/LauncherIcon.cpp 2011-09-01 01:55:36 +0000
+++ plugins/unityshell/src/LauncherIcon.cpp 2011-09-07 09:42:19 +0000
@@ -763,6 +763,9 @@
763void763void
764LauncherIcon::Remove()764LauncherIcon::Remove()
765{765{
766 if (_quicklist->IsVisible())
767 _quicklist->Hide();
768
766 SetQuirk(QUIRK_VISIBLE, false);769 SetQuirk(QUIRK_VISIBLE, false);
767 remove.emit(this);770 remove.emit(this);
768}771}