Merge lp:~3v1n0/unity/quicklist-hide-fix into lp:unity
- quicklist-hide-fix
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Gord Allott (community) | Approve | ||
Review via email: mp+74371@code.launchpad.net |
Commit message
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 : | # |
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
1 | === modified file 'plugins/unityshell/src/BamfLauncherIcon.cpp' | |||
2 | --- plugins/unityshell/src/BamfLauncherIcon.cpp 2011-08-30 16:48:12 +0000 | |||
3 | +++ plugins/unityshell/src/BamfLauncherIcon.cpp 2011-09-07 09:42:19 +0000 | |||
4 | @@ -144,6 +144,7 @@ | |||
5 | 144 | _dnd_hovered = false; | 144 | _dnd_hovered = false; |
6 | 145 | _launcher = IconManager; | 145 | _launcher = IconManager; |
7 | 146 | _menu_desktop_shortcuts = NULL; | 146 | _menu_desktop_shortcuts = NULL; |
8 | 147 | _on_desktop_file_changed_handler_id = 0; | ||
9 | 147 | char* icon_name = bamf_view_get_icon(BAMF_VIEW(m_App)); | 148 | char* icon_name = bamf_view_get_icon(BAMF_VIEW(m_App)); |
10 | 148 | 149 | ||
11 | 149 | tooltip_text = BamfName(); | 150 | tooltip_text = BamfName(); |
12 | @@ -173,17 +174,7 @@ | |||
13 | 173 | EnsureWindowState(); | 174 | EnsureWindowState(); |
14 | 174 | UpdateMenus(); | 175 | UpdateMenus(); |
15 | 175 | 176 | ||
27 | 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(); |
17 | 177 | GFile* _desktop_file = g_file_new_for_path(DesktopFile()); | ||
18 | 178 | _desktop_file_monitor = g_file_monitor_file(_desktop_file, | ||
19 | 179 | G_FILE_MONITOR_NONE, | ||
20 | 180 | NULL, | ||
21 | 181 | NULL); | ||
22 | 182 | |||
23 | 183 | _on_desktop_file_changed_handler_id = g_signal_connect(_desktop_file_monitor, | ||
24 | 184 | "changed", | ||
25 | 185 | G_CALLBACK(&BamfLauncherIcon::OnDesktopFileChanged), | ||
26 | 186 | this); | ||
28 | 187 | 178 | ||
29 | 188 | WindowManager::Default()->window_minimized.connect(sigc::mem_fun(this, &BamfLauncherIcon::OnWindowMinimized)); | 179 | WindowManager::Default()->window_minimized.connect(sigc::mem_fun(this, &BamfLauncherIcon::OnWindowMinimized)); |
30 | 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)); |
31 | @@ -192,7 +183,7 @@ | |||
32 | 192 | 183 | ||
33 | 193 | // hack | 184 | // hack |
34 | 194 | SetProgress(0.0f); | 185 | SetProgress(0.0f); |
36 | 195 | 186 | ||
37 | 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. |
38 | 197 | _fill_supported_types_id = g_idle_add((GSourceFunc)FillSupportedTypes, this); | 188 | _fill_supported_types_id = g_idle_add((GSourceFunc)FillSupportedTypes, this); |
39 | 198 | 189 | ||
40 | @@ -203,22 +194,40 @@ | |||
41 | 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)); |
42 | 204 | 195 | ||
43 | 205 | // We might not have created the menu items yet | 196 | // We might not have created the menu items yet |
44 | 197 | for (auto it = _menu_clients.begin(); it != _menu_clients.end(); it++) | ||
45 | 198 | { | ||
46 | 199 | g_object_unref(G_OBJECT(it->second)); | ||
47 | 200 | } | ||
48 | 201 | |||
49 | 206 | if (_menu_items.find("Pin") != _menu_items.end()) | 202 | if (_menu_items.find("Pin") != _menu_items.end()) |
50 | 207 | { | 203 | { |
52 | 208 | g_signal_handler_disconnect((gpointer) _menu_items["Pin"], | 204 | g_signal_handler_disconnect(G_OBJECT(_menu_items["Pin"]), |
53 | 209 | _menu_callbacks["Pin"]); | 205 | _menu_callbacks["Pin"]); |
54 | 210 | } | 206 | } |
55 | 211 | 207 | ||
56 | 212 | if (_menu_items.find("Quit") != _menu_items.end()) | 208 | if (_menu_items.find("Quit") != _menu_items.end()) |
57 | 213 | { | 209 | { |
59 | 214 | g_signal_handler_disconnect((gpointer) _menu_items["Quit"], | 210 | g_signal_handler_disconnect(G_OBJECT(_menu_items["Quit"]), |
60 | 215 | _menu_callbacks["Quit"]); | 211 | _menu_callbacks["Quit"]); |
61 | 216 | } | 212 | } |
62 | 217 | 213 | ||
63 | 214 | for (auto it = _menu_items.begin(); it != _menu_items.end(); it++) | ||
64 | 215 | { | ||
65 | 216 | g_object_unref(G_OBJECT(it->second)); | ||
66 | 217 | } | ||
67 | 218 | |||
68 | 219 | for (auto it = _menu_items_extra.begin(); it != _menu_items_extra.end(); it++) | ||
69 | 220 | { | ||
70 | 221 | g_object_unref(G_OBJECT(it->second)); | ||
71 | 222 | } | ||
72 | 223 | |||
73 | 224 | if (G_IS_OBJECT(_menu_desktop_shortcuts)) | ||
74 | 225 | g_object_unref(G_OBJECT(_menu_desktop_shortcuts)); | ||
75 | 226 | |||
76 | 218 | if (_on_desktop_file_changed_handler_id != 0) | 227 | if (_on_desktop_file_changed_handler_id != 0) |
78 | 219 | g_signal_handler_disconnect((gpointer) _desktop_file_monitor, | 228 | g_signal_handler_disconnect(G_OBJECT(_desktop_file_monitor), |
79 | 220 | _on_desktop_file_changed_handler_id); | 229 | _on_desktop_file_changed_handler_id); |
81 | 221 | 230 | ||
82 | 222 | if (_fill_supported_types_id != 0) | 231 | if (_fill_supported_types_id != 0) |
83 | 223 | g_source_remove(_fill_supported_types_id); | 232 | g_source_remove(_fill_supported_types_id); |
84 | 224 | 233 | ||
85 | @@ -322,19 +331,40 @@ | |||
86 | 322 | return bamf_view_is_sticky(BAMF_VIEW(m_App)); | 331 | return bamf_view_is_sticky(BAMF_VIEW(m_App)); |
87 | 323 | } | 332 | } |
88 | 324 | 333 | ||
90 | 325 | const char* BamfLauncherIcon::DesktopFile() | 334 | void BamfLauncherIcon::UpdateDesktopFile() |
91 | 326 | { | 335 | { |
92 | 327 | char* filename = NULL; | 336 | char* filename = NULL; |
93 | 328 | filename = (char*) bamf_application_get_desktop_file(m_App); | 337 | filename = (char*) bamf_application_get_desktop_file(m_App); |
94 | 329 | 338 | ||
96 | 330 | if (filename != NULL) | 339 | if (filename != NULL && g_strcmp0(_cached_desktop_file, filename) != 0) |
97 | 331 | { | 340 | { |
98 | 332 | if (_cached_desktop_file != NULL) | 341 | if (_cached_desktop_file != NULL) |
99 | 333 | g_free(_cached_desktop_file); | 342 | g_free(_cached_desktop_file); |
100 | 334 | 343 | ||
101 | 335 | _cached_desktop_file = g_strdup(filename); | 344 | _cached_desktop_file = g_strdup(filename); |
102 | 345 | |||
103 | 346 | // add a file watch to the desktop file so that if/when the app is removed | ||
104 | 347 | // we can remove ourself from the launcher and when it's changed | ||
105 | 348 | // we can update the quicklist. | ||
106 | 349 | |||
107 | 350 | if (_on_desktop_file_changed_handler_id != 0) | ||
108 | 351 | g_signal_handler_disconnect(G_OBJECT(_desktop_file_monitor), | ||
109 | 352 | _on_desktop_file_changed_handler_id); | ||
110 | 353 | |||
111 | 354 | GFile* desktop_file = g_file_new_for_path(DesktopFile()); | ||
112 | 355 | _desktop_file_monitor = g_file_monitor_file(desktop_file, G_FILE_MONITOR_NONE, | ||
113 | 356 | NULL, NULL); | ||
114 | 357 | g_file_monitor_set_rate_limit (_desktop_file_monitor, 1000); | ||
115 | 358 | _on_desktop_file_changed_handler_id = g_signal_connect(_desktop_file_monitor, | ||
116 | 359 | "changed", | ||
117 | 360 | G_CALLBACK(&BamfLauncherIcon::OnDesktopFileChanged), | ||
118 | 361 | this); | ||
119 | 336 | } | 362 | } |
120 | 363 | } | ||
121 | 337 | 364 | ||
122 | 365 | const char* BamfLauncherIcon::DesktopFile() | ||
123 | 366 | { | ||
124 | 367 | UpdateDesktopFile(); | ||
125 | 338 | return _cached_desktop_file; | 368 | return _cached_desktop_file; |
126 | 339 | } | 369 | } |
127 | 340 | 370 | ||
128 | @@ -357,7 +387,7 @@ | |||
129 | 357 | { | 387 | { |
130 | 358 | LauncherIcon::AddProperties(builder); | 388 | LauncherIcon::AddProperties(builder); |
131 | 359 | 389 | ||
133 | 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())); |
134 | 361 | 391 | ||
135 | 362 | GList* children, *l; | 392 | GList* children, *l; |
136 | 363 | BamfView* view; | 393 | BamfView* view; |
137 | @@ -414,7 +444,7 @@ | |||
138 | 414 | GDesktopAppInfo* appInfo; | 444 | GDesktopAppInfo* appInfo; |
139 | 415 | GError* error = NULL; | 445 | GError* error = NULL; |
140 | 416 | 446 | ||
142 | 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()); |
143 | 418 | 448 | ||
144 | 419 | if (g_app_info_supports_uris(G_APP_INFO(appInfo))) | 449 | if (g_app_info_supports_uris(G_APP_INFO(appInfo))) |
145 | 420 | { | 450 | { |
146 | @@ -613,10 +643,83 @@ | |||
147 | 613 | self->EnsureWindowState(); | 643 | self->EnsureWindowState(); |
148 | 614 | } | 644 | } |
149 | 615 | 645 | ||
150 | 646 | void BamfLauncherIcon::UpdateDesktopQuickList() | ||
151 | 647 | { | ||
152 | 648 | IndicatorDesktopShortcuts* desktop_shortcuts; | ||
153 | 649 | GKeyFile* keyfile; | ||
154 | 650 | GError* error = NULL; | ||
155 | 651 | const char *desktop_file; | ||
156 | 652 | |||
157 | 653 | desktop_file = DesktopFile(); | ||
158 | 654 | |||
159 | 655 | if (!desktop_file || g_strcmp0(desktop_file, "") == 0) | ||
160 | 656 | return; | ||
161 | 657 | |||
162 | 658 | // check that we have the X-Ayatana-Desktop-Shortcuts flag | ||
163 | 659 | // not sure if we should do this or if libindicator should shut up | ||
164 | 660 | // and not report errors when it can't find the key. | ||
165 | 661 | // so FIXME when ted is around | ||
166 | 662 | keyfile = g_key_file_new(); | ||
167 | 663 | g_key_file_load_from_file(keyfile, desktop_file, G_KEY_FILE_NONE, &error); | ||
168 | 664 | |||
169 | 665 | if (error != NULL) | ||
170 | 666 | { | ||
171 | 667 | g_warning("Could not load desktop file for: %s", desktop_file); | ||
172 | 668 | g_key_file_free(keyfile); | ||
173 | 669 | g_error_free(error); | ||
174 | 670 | return; | ||
175 | 671 | } | ||
176 | 672 | |||
177 | 673 | if (g_key_file_has_key(keyfile, G_KEY_FILE_DESKTOP_GROUP, | ||
178 | 674 | "X-Ayatana-Desktop-Shortcuts", NULL)) | ||
179 | 675 | { | ||
180 | 676 | DbusmenuMenuitem* root = dbusmenu_menuitem_new(); | ||
181 | 677 | dbusmenu_menuitem_set_root(root, TRUE); | ||
182 | 678 | desktop_shortcuts = indicator_desktop_shortcuts_new(desktop_file, "Unity"); | ||
183 | 679 | const gchar** nicks = indicator_desktop_shortcuts_get_nicks(desktop_shortcuts); | ||
184 | 680 | |||
185 | 681 | int index = 0; | ||
186 | 682 | if (nicks) | ||
187 | 683 | { | ||
188 | 684 | while (((gpointer*) nicks)[index]) | ||
189 | 685 | { | ||
190 | 686 | gchar* name; | ||
191 | 687 | DbusmenuMenuitem* item; | ||
192 | 688 | name = indicator_desktop_shortcuts_nick_get_name(desktop_shortcuts, | ||
193 | 689 | nicks[index]); | ||
194 | 690 | ShortcutData* data = g_slice_new0(ShortcutData); | ||
195 | 691 | data->self = this; | ||
196 | 692 | data->shortcuts = INDICATOR_DESKTOP_SHORTCUTS(g_object_ref(desktop_shortcuts)); | ||
197 | 693 | data->nick = g_strdup(nicks[index]); | ||
198 | 694 | |||
199 | 695 | item = dbusmenu_menuitem_new(); | ||
200 | 696 | dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, name); | ||
201 | 697 | dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); | ||
202 | 698 | dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); | ||
203 | 699 | g_signal_connect_data(item, "item-activated", | ||
204 | 700 | (GCallback) shortcut_activated, (gpointer) data, | ||
205 | 701 | (GClosureNotify) shortcut_data_destroy, (GConnectFlags)0); | ||
206 | 702 | |||
207 | 703 | dbusmenu_menuitem_child_append(root, item); | ||
208 | 704 | |||
209 | 705 | index++; | ||
210 | 706 | |||
211 | 707 | g_free(name); | ||
212 | 708 | } | ||
213 | 709 | } | ||
214 | 710 | |||
215 | 711 | if (G_IS_OBJECT(_menu_desktop_shortcuts)) | ||
216 | 712 | g_object_unref(G_OBJECT(_menu_desktop_shortcuts)); | ||
217 | 713 | |||
218 | 714 | _menu_desktop_shortcuts = root; | ||
219 | 715 | } | ||
220 | 716 | |||
221 | 717 | g_key_file_free(keyfile); | ||
222 | 718 | } | ||
223 | 719 | |||
224 | 616 | void BamfLauncherIcon::UpdateMenus() | 720 | void BamfLauncherIcon::UpdateMenus() |
225 | 617 | { | 721 | { |
226 | 618 | GList* children, *l; | 722 | GList* children, *l; |
227 | 619 | IndicatorDesktopShortcuts* desktop_shortcuts; | ||
228 | 620 | 723 | ||
229 | 621 | children = bamf_view_get_children(BAMF_VIEW(m_App)); | 724 | children = bamf_view_get_children(BAMF_VIEW(m_App)); |
230 | 622 | for (l = children; l; l = l->next) | 725 | for (l = children; l; l = l->next) |
231 | @@ -639,73 +742,15 @@ | |||
232 | 639 | 742 | ||
233 | 640 | // add dynamic quicklist | 743 | // add dynamic quicklist |
234 | 641 | if (_menuclient_dynamic_quicklist != NULL) | 744 | if (_menuclient_dynamic_quicklist != NULL) |
236 | 642 | _menu_clients["dynamicquicklist"] = _menuclient_dynamic_quicklist; | 745 | { |
237 | 746 | auto menu_client = DBUSMENU_CLIENT(g_object_ref(_menuclient_dynamic_quicklist)); | ||
238 | 747 | _menu_clients["dynamicquicklist"] = menu_client; | ||
239 | 748 | } | ||
240 | 643 | 749 | ||
241 | 644 | // make a client for desktop file actions | 750 | // make a client for desktop file actions |
244 | 645 | if (!DBUSMENU_IS_MENUITEM(_menu_desktop_shortcuts) && | 751 | if (!DBUSMENU_IS_MENUITEM(_menu_desktop_shortcuts)) |
243 | 646 | g_strcmp0(DesktopFile(), """")) | ||
245 | 647 | { | 752 | { |
307 | 648 | GKeyFile* keyfile; | 753 | UpdateDesktopQuickList(); |
247 | 649 | GError* error = NULL; | ||
248 | 650 | |||
249 | 651 | // check that we have the X-Ayatana-Desktop-Shortcuts flag | ||
250 | 652 | // not sure if we should do this or if libindicator should shut up | ||
251 | 653 | // and not report errors when it can't find the key. | ||
252 | 654 | // so FIXME when ted is around | ||
253 | 655 | keyfile = g_key_file_new(); | ||
254 | 656 | g_key_file_load_from_file(keyfile, DesktopFile(), G_KEY_FILE_NONE, &error); | ||
255 | 657 | |||
256 | 658 | if (error != NULL) | ||
257 | 659 | { | ||
258 | 660 | g_warning("Could not load desktop file for: %s" , DesktopFile()); | ||
259 | 661 | g_error_free(error); | ||
260 | 662 | return; | ||
261 | 663 | } | ||
262 | 664 | |||
263 | 665 | if (g_key_file_has_key(keyfile, G_KEY_FILE_DESKTOP_GROUP, | ||
264 | 666 | "X-Ayatana-Desktop-Shortcuts", NULL)) | ||
265 | 667 | { | ||
266 | 668 | DbusmenuMenuitem* root = dbusmenu_menuitem_new(); | ||
267 | 669 | dbusmenu_menuitem_set_root(root, TRUE); | ||
268 | 670 | desktop_shortcuts = indicator_desktop_shortcuts_new(bamf_application_get_desktop_file(m_App), | ||
269 | 671 | "Unity"); | ||
270 | 672 | const gchar** nicks = indicator_desktop_shortcuts_get_nicks(desktop_shortcuts); | ||
271 | 673 | |||
272 | 674 | int index = 0; | ||
273 | 675 | if (nicks) | ||
274 | 676 | { | ||
275 | 677 | while (((gpointer*) nicks)[index]) | ||
276 | 678 | { | ||
277 | 679 | gchar* name; | ||
278 | 680 | DbusmenuMenuitem* item; | ||
279 | 681 | name = indicator_desktop_shortcuts_nick_get_name(desktop_shortcuts, | ||
280 | 682 | nicks[index]); | ||
281 | 683 | ShortcutData* data = g_slice_new0(ShortcutData); | ||
282 | 684 | data->self = this; | ||
283 | 685 | data->shortcuts = INDICATOR_DESKTOP_SHORTCUTS(g_object_ref(desktop_shortcuts)); | ||
284 | 686 | data->nick = g_strdup(nicks[index]); | ||
285 | 687 | |||
286 | 688 | item = dbusmenu_menuitem_new(); | ||
287 | 689 | dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, name); | ||
288 | 690 | dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); | ||
289 | 691 | dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); | ||
290 | 692 | g_signal_connect_data(item, "item-activated", | ||
291 | 693 | (GCallback) shortcut_activated, (gpointer) data, | ||
292 | 694 | (GClosureNotify) shortcut_data_destroy, (GConnectFlags)0); | ||
293 | 695 | |||
294 | 696 | dbusmenu_menuitem_child_append(root, item); | ||
295 | 697 | |||
296 | 698 | index++; | ||
297 | 699 | |||
298 | 700 | g_free(name); | ||
299 | 701 | } | ||
300 | 702 | } | ||
301 | 703 | |||
302 | 704 | // TODO: check unref prior to assign, and add unref to destructor. | ||
303 | 705 | _menu_desktop_shortcuts = root; | ||
304 | 706 | g_key_file_free(keyfile); | ||
305 | 707 | |||
306 | 708 | } | ||
308 | 709 | } | 754 | } |
309 | 710 | 755 | ||
310 | 711 | } | 756 | } |
311 | @@ -738,7 +783,7 @@ | |||
312 | 738 | if (!bamf_view_is_sticky(view)) | 783 | if (!bamf_view_is_sticky(view)) |
313 | 739 | return; | 784 | return; |
314 | 740 | 785 | ||
316 | 741 | const gchar* desktop_file = bamf_application_get_desktop_file(this->m_App); | 786 | const gchar* desktop_file = DesktopFile(); |
317 | 742 | bamf_view_set_sticky(view, false); | 787 | bamf_view_set_sticky(view, false); |
318 | 743 | if (bamf_view_is_closed(view)) | 788 | if (bamf_view_is_closed(view)) |
319 | 744 | this->Remove(); | 789 | this->Remove(); |
320 | @@ -751,7 +796,7 @@ | |||
321 | 751 | { | 796 | { |
322 | 752 | BamfView* view = BAMF_VIEW(self->m_App); | 797 | BamfView* view = BAMF_VIEW(self->m_App); |
323 | 753 | bool sticky = bamf_view_is_sticky(view); | 798 | bool sticky = bamf_view_is_sticky(view); |
325 | 754 | const gchar* desktop_file = bamf_application_get_desktop_file(self->m_App); | 799 | const gchar* desktop_file = self->DesktopFile(); |
326 | 755 | 800 | ||
327 | 756 | if (sticky) | 801 | if (sticky) |
328 | 757 | { | 802 | { |
329 | @@ -774,7 +819,6 @@ | |||
330 | 774 | if (_menu_items.find("Pin") == _menu_items.end()) | 819 | if (_menu_items.find("Pin") == _menu_items.end()) |
331 | 775 | { | 820 | { |
332 | 776 | menu_item = dbusmenu_menuitem_new(); | 821 | menu_item = dbusmenu_menuitem_new(); |
333 | 777 | g_object_ref(menu_item); | ||
334 | 778 | 822 | ||
335 | 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); |
336 | 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")); |
337 | @@ -797,7 +841,6 @@ | |||
338 | 797 | if (_menu_items.find("Quit") == _menu_items.end()) | 841 | if (_menu_items.find("Quit") == _menu_items.end()) |
339 | 798 | { | 842 | { |
340 | 799 | menu_item = dbusmenu_menuitem_new(); | 843 | menu_item = dbusmenu_menuitem_new(); |
341 | 800 | g_object_ref(menu_item); | ||
342 | 801 | 844 | ||
343 | 802 | dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Quit")); | 845 | dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Quit")); |
344 | 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); |
345 | @@ -838,16 +881,22 @@ | |||
346 | 838 | DbusmenuClient* client = (*it).second; | 881 | DbusmenuClient* client = (*it).second; |
347 | 839 | DbusmenuMenuitem* root = dbusmenu_client_get_root(client); | 882 | DbusmenuMenuitem* root = dbusmenu_client_get_root(client); |
348 | 840 | 883 | ||
349 | 884 | if (!root || !dbusmenu_menuitem_property_get_bool(root, DBUSMENU_MENUITEM_PROP_VISIBLE)) | ||
350 | 885 | continue; | ||
351 | 886 | |||
352 | 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)) |
353 | 842 | { | 888 | { |
354 | 843 | DbusmenuMenuitem* item = (DbusmenuMenuitem*) child->data; | 889 | DbusmenuMenuitem* item = (DbusmenuMenuitem*) child->data; |
355 | 844 | 890 | ||
357 | 845 | if (!item) | 891 | if (!item || !DBUSMENU_IS_MENUITEM(item)) |
358 | 846 | continue; | 892 | continue; |
359 | 847 | 893 | ||
361 | 848 | first_separator_needed = true; | 894 | if (dbusmenu_menuitem_property_get_bool(item, DBUSMENU_MENUITEM_PROP_VISIBLE)) |
362 | 895 | { | ||
363 | 896 | first_separator_needed = true; | ||
364 | 849 | 897 | ||
366 | 850 | result.push_back(item); | 898 | result.push_back(item); |
367 | 899 | } | ||
368 | 851 | } | 900 | } |
369 | 852 | } | 901 | } |
370 | 853 | 902 | ||
371 | @@ -872,31 +921,59 @@ | |||
372 | 872 | 921 | ||
373 | 873 | if (first_separator_needed) | 922 | if (first_separator_needed) |
374 | 874 | { | 923 | { |
375 | 924 | auto first_sep = _menu_items_extra.find("FirstSeparator"); | ||
376 | 925 | if (first_sep != _menu_items_extra.end()) | ||
377 | 926 | { | ||
378 | 927 | item = first_sep->second; | ||
379 | 928 | } | ||
380 | 929 | else | ||
381 | 930 | { | ||
382 | 931 | item = dbusmenu_menuitem_new(); | ||
383 | 932 | dbusmenu_menuitem_property_set(item, | ||
384 | 933 | DBUSMENU_MENUITEM_PROP_TYPE, | ||
385 | 934 | DBUSMENU_CLIENT_TYPES_SEPARATOR); | ||
386 | 935 | _menu_items_extra["FirstSeparator"] = item; | ||
387 | 936 | } | ||
388 | 937 | result.push_back(item); | ||
389 | 938 | } | ||
390 | 939 | |||
391 | 940 | auto app_name_item = _menu_items_extra.find("AppName"); | ||
392 | 941 | if (app_name_item != _menu_items_extra.end()) | ||
393 | 942 | { | ||
394 | 943 | item = app_name_item->second; | ||
395 | 944 | } | ||
396 | 945 | else | ||
397 | 946 | { | ||
398 | 947 | gchar* app_name; | ||
399 | 948 | app_name = g_markup_escape_text(BamfName(), -1); | ||
400 | 949 | |||
401 | 950 | item = dbusmenu_menuitem_new(); | ||
402 | 951 | dbusmenu_menuitem_property_set(item, | ||
403 | 952 | DBUSMENU_MENUITEM_PROP_LABEL, | ||
404 | 953 | app_name); | ||
405 | 954 | dbusmenu_menuitem_property_set_bool(item, | ||
406 | 955 | DBUSMENU_MENUITEM_PROP_ENABLED, | ||
407 | 956 | true); | ||
408 | 957 | g_signal_connect(item, "item-activated", (GCallback) OnAppLabelActivated, this); | ||
409 | 958 | g_free(app_name); | ||
410 | 959 | |||
411 | 960 | _menu_items_extra["AppName"] = item; | ||
412 | 961 | } | ||
413 | 962 | result.push_back(item); | ||
414 | 963 | |||
415 | 964 | auto second_sep = _menu_items_extra.find("SecondSeparator"); | ||
416 | 965 | if (second_sep != _menu_items_extra.end()) | ||
417 | 966 | { | ||
418 | 967 | item = second_sep->second; | ||
419 | 968 | } | ||
420 | 969 | else | ||
421 | 970 | { | ||
422 | 875 | item = dbusmenu_menuitem_new(); | 971 | item = dbusmenu_menuitem_new(); |
423 | 876 | dbusmenu_menuitem_property_set(item, | 972 | dbusmenu_menuitem_property_set(item, |
424 | 877 | DBUSMENU_MENUITEM_PROP_TYPE, | 973 | DBUSMENU_MENUITEM_PROP_TYPE, |
425 | 878 | DBUSMENU_CLIENT_TYPES_SEPARATOR); | 974 | DBUSMENU_CLIENT_TYPES_SEPARATOR); |
427 | 879 | result.push_back(item); | 975 | _menu_items_extra["SecondSeparator"] = item; |
428 | 880 | } | 976 | } |
429 | 881 | |||
430 | 882 | gchar* app_name; | ||
431 | 883 | app_name = g_markup_escape_text(BamfName(), -1); | ||
432 | 884 | |||
433 | 885 | item = dbusmenu_menuitem_new(); | ||
434 | 886 | dbusmenu_menuitem_property_set(item, | ||
435 | 887 | DBUSMENU_MENUITEM_PROP_LABEL, | ||
436 | 888 | app_name); | ||
437 | 889 | dbusmenu_menuitem_property_set_bool(item, | ||
438 | 890 | DBUSMENU_MENUITEM_PROP_ENABLED, | ||
439 | 891 | true); | ||
440 | 892 | g_signal_connect(item, "item-activated", (GCallback) OnAppLabelActivated, this); | ||
441 | 893 | result.push_back(item); | ||
442 | 894 | g_free(app_name); | ||
443 | 895 | |||
444 | 896 | item = dbusmenu_menuitem_new(); | ||
445 | 897 | dbusmenu_menuitem_property_set(item, | ||
446 | 898 | DBUSMENU_MENUITEM_PROP_TYPE, | ||
447 | 899 | DBUSMENU_CLIENT_TYPES_SEPARATOR); | ||
448 | 900 | result.push_back(item); | 977 | result.push_back(item); |
449 | 901 | 978 | ||
450 | 902 | EnsureMenuItemsReady(); | 979 | EnsureMenuItemsReady(); |
451 | @@ -978,7 +1055,7 @@ | |||
452 | 978 | { | 1055 | { |
453 | 979 | if (!_remote_uri) | 1056 | if (!_remote_uri) |
454 | 980 | { | 1057 | { |
456 | 981 | const gchar* desktop_file = bamf_application_get_desktop_file(BAMF_APPLICATION(m_App)); | 1058 | const gchar* desktop_file = DesktopFile(); |
457 | 982 | gchar* basename = g_path_get_basename(desktop_file); | 1059 | gchar* basename = g_path_get_basename(desktop_file); |
458 | 983 | 1060 | ||
459 | 984 | _remote_uri = g_strdup_printf("application://%s", basename); | 1061 | _remote_uri = g_strdup_printf("application://%s", basename); |
460 | @@ -1053,6 +1130,9 @@ | |||
461 | 1053 | case G_FILE_MONITOR_EVENT_DELETED: | 1130 | case G_FILE_MONITOR_EVENT_DELETED: |
462 | 1054 | self->UnStick(); | 1131 | self->UnStick(); |
463 | 1055 | break; | 1132 | break; |
464 | 1133 | case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: | ||
465 | 1134 | self->UpdateDesktopQuickList(); | ||
466 | 1135 | break; | ||
467 | 1056 | default: | 1136 | default: |
468 | 1057 | break; | 1137 | break; |
469 | 1058 | } | 1138 | } |
470 | 1059 | 1139 | ||
471 | === modified file 'plugins/unityshell/src/BamfLauncherIcon.h' | |||
472 | --- plugins/unityshell/src/BamfLauncherIcon.h 2011-08-30 16:48:12 +0000 | |||
473 | +++ plugins/unityshell/src/BamfLauncherIcon.h 2011-09-07 09:42:19 +0000 | |||
474 | @@ -81,6 +81,7 @@ | |||
475 | 81 | Launcher* _launcher; | 81 | Launcher* _launcher; |
476 | 82 | std::map<std::string, DbusmenuClient*> _menu_clients; | 82 | std::map<std::string, DbusmenuClient*> _menu_clients; |
477 | 83 | std::map<std::string, DbusmenuMenuitem*> _menu_items; | 83 | std::map<std::string, DbusmenuMenuitem*> _menu_items; |
478 | 84 | std::map<std::string, DbusmenuMenuitem*> _menu_items_extra; | ||
479 | 84 | std::map<std::string, gulong> _menu_callbacks; | 85 | std::map<std::string, gulong> _menu_callbacks; |
480 | 85 | DbusmenuMenuitem* _menu_desktop_shortcuts; | 86 | DbusmenuMenuitem* _menu_desktop_shortcuts; |
481 | 86 | gchar* _remote_uri; | 87 | gchar* _remote_uri; |
482 | @@ -92,14 +93,16 @@ | |||
483 | 92 | 93 | ||
484 | 93 | GFileMonitor* _desktop_file_monitor; | 94 | GFileMonitor* _desktop_file_monitor; |
485 | 94 | gulong _on_desktop_file_changed_handler_id; | 95 | gulong _on_desktop_file_changed_handler_id; |
487 | 95 | 96 | ||
488 | 96 | std::set<std::string> _supported_types; | 97 | std::set<std::string> _supported_types; |
489 | 97 | bool _supported_types_filled; | 98 | bool _supported_types_filled; |
490 | 98 | guint _fill_supported_types_id; | 99 | guint _fill_supported_types_id; |
491 | 99 | 100 | ||
492 | 100 | void EnsureWindowState(); | 101 | void EnsureWindowState(); |
493 | 101 | 102 | ||
494 | 103 | void UpdateDesktopFile(); | ||
495 | 102 | void UpdateMenus(); | 104 | void UpdateMenus(); |
496 | 105 | void UpdateDesktopQuickList(); | ||
497 | 103 | 106 | ||
498 | 104 | void OpenInstanceWithUris(std::set<std::string> uris); | 107 | void OpenInstanceWithUris(std::set<std::string> uris); |
499 | 105 | void Focus(); | 108 | void Focus(); |
500 | 106 | 109 | ||
501 | === modified file 'plugins/unityshell/src/LauncherIcon.cpp' | |||
502 | --- plugins/unityshell/src/LauncherIcon.cpp 2011-09-01 01:55:36 +0000 | |||
503 | +++ plugins/unityshell/src/LauncherIcon.cpp 2011-09-07 09:42:19 +0000 | |||
504 | @@ -763,6 +763,9 @@ | |||
505 | 763 | void | 763 | void |
506 | 764 | LauncherIcon::Remove() | 764 | LauncherIcon::Remove() |
507 | 765 | { | 765 | { |
508 | 766 | if (_quicklist->IsVisible()) | ||
509 | 767 | _quicklist->Hide(); | ||
510 | 768 | |||
511 | 766 | SetQuirk(QUIRK_VISIBLE, false); | 769 | SetQuirk(QUIRK_VISIBLE, false); |
512 | 767 | remove.emit(this); | 770 | remove.emit(this); |
513 | 768 | } | 771 | } |
+1 thanks!