155
156
return g_hash_table_lookup (property_hash, type);
159
/* Check to see if a Dbusmenu Menuitem has a shortcut, and if
160
so make it into a pretty string. */
162
shortcut_string_for_menuitem (DbusmenuMenuitem * mi)
164
if (!dbusmenu_menuitem_property_exist(mi, DBUSMENU_MENUITEM_PROP_SHORTCUT)) {
168
GVariant * shortcut = dbusmenu_menuitem_property_get_variant(mi, DBUSMENU_MENUITEM_PROP_SHORTCUT);
169
GString * output = g_string_new("");
172
for (keypress = 0; keypress < g_variant_n_children(shortcut); keypress++) {
173
GVariant * key = g_variant_get_child_value(shortcut, keypress);
175
if (output->len > 0) {
176
g_string_append(output, ", ");
180
for (subkey = 0; subkey < g_variant_n_children(key); subkey++) {
181
GVariant * skeyv = g_variant_get_child_value(key, subkey);
182
const gchar * button = g_variant_get_string(skeyv, NULL);
183
g_variant_unref(skeyv); /* We can do this because we know it's parent is held, and this makes things a bit cleaner further down */
185
if (g_strcmp0(button, DBUSMENU_MENUITEM_SHORTCUT_ALT) == 0) {
186
g_string_append(output, "Alt + ");
187
} else if (g_strcmp0(button, DBUSMENU_MENUITEM_SHORTCUT_CONTROL) == 0) {
188
g_string_append(output, "Ctrl + ");
189
} else if (g_strcmp0(button, DBUSMENU_MENUITEM_SHORTCUT_SHIFT) == 0) {
190
g_string_append(output, "Shift + ");
191
} else if (g_strcmp0(button, DBUSMENU_MENUITEM_SHORTCUT_SUPER) == 0) {
192
g_string_append(output, "Super + "); /* TODO: Can we detect if this is Apple or Windows or Ubuntu? */
194
g_string_append(output, button);
198
g_variant_unref(key);
201
return g_string_free(output, FALSE);
159
204
static HudDbusmenuItem *
160
205
hud_dbusmenu_item_new (HudStringList *context,
161
const gchar *desktop_file,
206
const gchar *application_id,
162
207
const gchar *icon,
208
HudKeywordMapping *keyword_mapping,
163
209
DbusmenuMenuitem *menuitem)
165
HudStringList *tokens;
211
HudStringList *full_label, *keywords;
166
212
HudDbusmenuItem *item;
167
213
const gchar *type;
168
214
const gchar *prop;
169
216
gboolean enabled;
171
218
type = dbusmenu_menuitem_property_get (menuitem, DBUSMENU_MENUITEM_PROP_TYPE);
172
219
prop = hud_dbusmenu_item_get_label_property (type);
220
shortcut = shortcut_string_for_menuitem(menuitem);
174
222
if (prop && dbusmenu_menuitem_property_exist (menuitem, prop))
176
224
const gchar *label;
178
227
label = dbusmenu_menuitem_property_get (menuitem, prop);
179
tokens = hud_string_list_cons_label (label, context);
228
full_label = hud_string_list_cons_label (label, context);
230
GPtrArray *mapping = hud_keyword_mapping_transform(keyword_mapping, label);
231
for (i = 0; i < mapping->len; i++)
233
keywords = hud_string_list_cons_label (
234
(gchar*) g_ptr_array_index(mapping, i), keywords);
184
tokens = hud_string_list_ref (context);
240
full_label = hud_string_list_ref (context);
197
254
enabled &= !dbusmenu_menuitem_property_exist (menuitem, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY);
199
item = hud_item_construct (hud_dbusmenu_item_get_type (), tokens, desktop_file, icon, enabled);
256
item = hud_item_construct (hud_dbusmenu_item_get_type (), full_label, keywords, shortcut, application_id, icon, NULL, enabled);
200
257
item->menuitem = g_object_ref (menuitem);
202
hud_string_list_unref (tokens);
259
hud_string_list_unref (full_label);
260
hud_string_list_unref (keywords);
221
280
gboolean reentrance_check;
281
HudKeywordMapping* keyword_mapping;
282
HudSourceItemType type;
224
285
typedef GObjectClass HudDbusmenuCollectorClass;
226
287
static void hud_dbusmenu_collector_iface_init (HudSourceInterface *iface);
288
static GList * hud_dbusmenu_collector_get_items (HudSource * source);
289
const gchar * hud_dbusmenu_collector_get_app_id (HudSource *collector);
290
static const gchar * hud_dbusmenu_collector_get_app_icon (HudSource *collector);
227
292
G_DEFINE_TYPE_WITH_CODE (HudDbusmenuCollector, hud_dbusmenu_collector, G_TYPE_OBJECT,
228
293
G_IMPLEMENT_INTERFACE (HUD_TYPE_SOURCE, hud_dbusmenu_collector_iface_init))
306
372
result = hud_result_get_if_matched (item, search_string, collector->penalty);
308
g_ptr_array_add (results_array, result);
374
append_func(result, user_data);
379
hud_dbusmenu_collector_list_application (HudSource *source,
380
HudTokenList *search_string,
381
void (*append_func) (const gchar *application_id, const gchar *application_icon, HudSourceItemType type, gpointer user_data),
384
HudDbusmenuCollector *collector = HUD_DBUSMENU_COLLECTOR (source);
388
g_hash_table_iter_init (&iter, collector->items);
389
while (g_hash_table_iter_next (&iter, NULL, &item))
393
result = hud_result_get_if_matched (item, search_string, collector->penalty);
395
append_func(collector->application_id, collector->icon, collector->type, user_data);
396
g_object_unref(result);
404
hud_dbusmenu_collector_get (HudSource *source,
405
const gchar *application_id)
407
HudDbusmenuCollector *collector = HUD_DBUSMENU_COLLECTOR (source);
409
if (g_strcmp0 (application_id, collector->application_id) == 0)
379
482
was_open = item->is_opened;
380
483
g_hash_table_remove (collector->items, menuitem);
382
item = hud_dbusmenu_item_new (context, collector->application_id, collector->icon, menuitem);
485
item = hud_dbusmenu_item_new (context, collector->application_id,
486
collector->icon, collector->keyword_mapping, menuitem);
384
488
if (collector->use_count && !was_open && dbusmenu_menuitem_property_exist (menuitem, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY))
400
504
HudDbusmenuItem *item;
403
item = hud_dbusmenu_item_new (context, collector->application_id, collector->icon, menuitem);
507
item = hud_dbusmenu_item_new (context, collector->application_id,
508
collector->icon, collector->keyword_mapping, menuitem);
404
509
context = hud_item_get_tokens (HUD_ITEM (item));
406
511
g_signal_connect (menuitem, "property-changed", G_CALLBACK (hud_dbusmenu_collector_property_changed), collector);
552
660
iface->use = hud_dbusmenu_collector_use;
553
661
iface->unuse = hud_dbusmenu_collector_unuse;
554
662
iface->search = hud_dbusmenu_collector_search;
663
iface->list_applications = hud_dbusmenu_collector_list_application;
664
iface->get = hud_dbusmenu_collector_get;
665
iface->get_items = hud_dbusmenu_collector_get_items;
666
iface->get_app_id = hud_dbusmenu_collector_get_app_id;
667
iface->get_app_icon = hud_dbusmenu_collector_get_app_icon;
558
671
hud_dbusmenu_collector_class_init (HudDbusmenuCollectorClass *class)
560
class->finalize = hud_dbusmenu_collector_finalize;
673
GObjectClass * gclass = G_OBJECT_CLASS(class);
674
gclass->finalize = hud_dbusmenu_collector_finalize;
592
706
const gchar *icon,
594
708
const gchar *bus_name,
595
const gchar *object_path)
709
const gchar *object_path,
710
HudSourceItemType type)
597
712
HudDbusmenuCollector *collector;
599
714
collector = g_object_new (HUD_TYPE_DBUSMENU_COLLECTOR, NULL);
600
715
collector->application_id = g_strdup (application_id);
601
716
collector->icon = g_strdup (icon);
717
collector->type = type;
603
719
collector->prefix = hud_string_list_cons (prefix, NULL);
604
720
collector->penalty = penalty;
605
721
hud_dbusmenu_collector_setup_endpoint (collector, bus_name, object_path);
722
collector->keyword_mapping = hud_keyword_mapping_new();
723
hud_keyword_mapping_load(collector->keyword_mapping, collector->application_id, DATADIR, GNOMELOCALEDIR);
607
725
collector->alive = TRUE;
621
739
* Returns: a new #HudDbusmenuCollector
623
741
HudDbusmenuCollector *
624
hud_dbusmenu_collector_new_for_window (BamfWindow *window,
625
const gchar *desktop_file,
742
hud_dbusmenu_collector_new_for_window (AbstractWindow *window,
743
const gchar *application_id,
745
HudSourceItemType type)
628
747
HudDbusmenuCollector *collector;
630
749
collector = g_object_new (HUD_TYPE_DBUSMENU_COLLECTOR, NULL);
631
collector->application_id = g_strdup (desktop_file);
750
collector->application_id = g_strdup (application_id);
632
751
collector->icon = g_strdup (icon);
752
collector->type = type;
633
755
collector->xid = bamf_window_get_xid (window);
757
#ifdef HAVE_PLATFORM_API
758
collector->xid = _ubuntu_ui_session_properties_get_window_id(window);
760
collector->keyword_mapping = hud_keyword_mapping_new();
761
hud_keyword_mapping_load(collector->keyword_mapping, collector->application_id, DATADIR, GNOMELOCALEDIR);
634
763
g_debug ("dbusmenu on %d", collector->xid);
635
764
hud_app_menu_registrar_add_observer (hud_app_menu_registrar_get (), collector->xid,
636
765
hud_dbusmenu_collector_registrar_observer_func, collector);
677
806
collector->icon = g_strdup (icon);
678
807
hud_dbusmenu_collector_setup_root (collector, collector->root);
811
* hud_dbusmenu_collector_get_items:
812
* @collector: a #HudDbusmenuCollector
814
* Gets the items that have been collected at any point in time.
816
* Return Value: (element-type HudItem) (transfer full) A list of #HudItem
817
* objects. Free with g_list_free_full(g_object_unref)
820
hud_dbusmenu_collector_get_items (HudSource * source)
822
g_return_val_if_fail(HUD_IS_DBUSMENU_COLLECTOR(source), NULL);
823
HudDbusmenuCollector * dcollector = HUD_DBUSMENU_COLLECTOR(source);
825
GList * hashvals = g_hash_table_get_values (dcollector->items);
827
return g_list_copy_deep (hashvals, (GCopyFunc) g_object_ref, NULL );
831
* hud_dbusmenu_collector_get_app_id:
832
* @collector: a #HudDbusmenuCollector
834
* Gets the ID of the collected application
836
* Return value: Application ID
839
hud_dbusmenu_collector_get_app_id (HudSource *collector)
841
g_return_val_if_fail(HUD_IS_DBUSMENU_COLLECTOR(collector), NULL);
842
return HUD_DBUSMENU_COLLECTOR(collector)->application_id;
846
* hud_dbusmenu_collector_get_app_icon:
847
* @collector: a #HudDbusmenuCollector
849
* Gets the icon of the collected application
851
* Return value: Application icon
854
hud_dbusmenu_collector_get_app_icon (HudSource *collector)
856
g_return_val_if_fail(HUD_IS_DBUSMENU_COLLECTOR(collector), NULL);
857
return HUD_DBUSMENU_COLLECTOR(collector)->icon;