/** * shell_app_system_lookup_app_by_tree_entry: * @system: a #ShellAppSystem * @entry: a #GMenuTreeEntry * * Find a #ShellApp corresponding to a #GMenuTreeEntry. * * Return value: (transfer none): The #ShellApp for @entry, or %NULL if none */ ShellApp * shell_app_system_lookup_app_by_tree_entry (ShellAppSystem *self, GMenuTreeEntry *entry) { /* If we looked up directly in ->entry_to_app, we'd lose the * override of running apps. Thus, indirect through the id. */ return shell_app_system_lookup_app (self, gmenu_tree_entry_get_desktop_file_id (entry)); }
/** * shell_app_system_lookup_heuristic_basename: * @system: a #ShellAppSystem * @id: Probable application identifier * * Find a valid application corresponding to a given * heuristically determined application identifier * string, or %NULL if none. * * Returns: (transfer none): A #ShellApp for @name */ ShellApp * shell_app_system_lookup_heuristic_basename (ShellAppSystem *system, const char *name) { ShellApp *result; GSList *prefix; result = shell_app_system_lookup_app (system, name); if (result != NULL) return result; for (prefix = system->priv->known_vendor_prefixes; prefix; prefix = g_slist_next (prefix)) { char *tmpid = g_strconcat ((char*)prefix->data, name, NULL); result = shell_app_system_lookup_app (system, tmpid); g_free (tmpid); if (result != NULL) return result; } return NULL; }
/** * shell_app_system_lookup_heuristic_basename: * @system: a #ShellAppSystem * @id: Probable application identifier * * Find a valid application corresponding to a given * heuristically determined application identifier * string, or %NULL if none. * * Returns: (transfer none): A #ShellApp for @name */ ShellApp * shell_app_system_lookup_heuristic_basename (ShellAppSystem *system, const char *name) { ShellApp *result; const char *const *prefix; result = shell_app_system_lookup_app (system, name); if (result != NULL) return result; for (prefix = vendor_prefixes; *prefix != NULL; prefix++) { char *tmpid = g_strconcat (*prefix, name, NULL); result = shell_app_system_lookup_app (system, tmpid); g_free (tmpid); if (result != NULL) return result; } return NULL; }
/** * shell_app_system_lookup_setting: * @system: * @id: desktop file id * * Returns: (transfer none): Application in gnomecc.menu, or %NULL if none */ ShellApp * shell_app_system_lookup_setting (ShellAppSystem *self, const char *id) { ShellApp *app; /* Actually defer to the main app set if there's overlap */ app = shell_app_system_lookup_app (self, id); if (app != NULL) return app; return g_hash_table_lookup (self->priv->setting_id_to_app, id); }
/** * shell_app_system_lookup_startup_wmclass: * @system: a #ShellAppSystem * @wmclass: (nullable): A WM_CLASS value * * Find a valid application whose .desktop file contains a * StartupWMClass entry matching @wmclass. * * Returns: (transfer none): A #ShellApp for @wmclass */ ShellApp * shell_app_system_lookup_startup_wmclass (ShellAppSystem *system, const char *wmclass) { const char *id; if (wmclass == NULL) return NULL; id = g_hash_table_lookup (system->priv->startup_wm_class_to_id, wmclass); if (id == NULL) return NULL; return shell_app_system_lookup_app (system, id); }
/** * shell_startup_sequence_get_app: * @sequence: A #ShellStartupSequence * * Returns: (transfer none): The application being launched, or %NULL if unknown. */ ShellApp * shell_startup_sequence_get_app (ShellStartupSequence *sequence) { const char *appid; char *basename; ShellAppSystem *appsys; ShellApp *app; appid = sn_startup_sequence_get_application_id ((SnStartupSequence*)sequence); if (!appid) return NULL; basename = g_path_get_basename (appid); appsys = shell_app_system_get_default (); app = shell_app_system_lookup_app (appsys, basename); g_free (basename); return app; }
static ShellApp * get_app_from_gapplication_id (MetaWindow *window) { ShellApp *app; ShellAppSystem *appsys; const char *id; char *desktop_file; appsys = shell_app_system_get_default (); id = meta_window_get_gtk_application_id (window); if (!id) return FALSE; desktop_file = g_strconcat (id, ".desktop", NULL); app = shell_app_system_lookup_app (appsys, desktop_file); g_free (desktop_file); return app; }
/** * shell_app_usage_get_most_used: * @usage: the usage instance to request * @context: Activity identifier * * Get a list of most popular applications for a given context. * * Returns: (element-type ShellApp) (transfer full): List of applications */ GSList * shell_app_usage_get_most_used (ShellAppUsage *self, const char *context) { GSList *apps; GList *appids, *iter; GHashTable *usages; ShellAppSystem *appsys; SortAppsByUsageData data; usages = g_hash_table_lookup (self->app_usages_for_context, context); if (usages == NULL) return NULL; appsys = shell_app_system_get_default (); appids = g_hash_table_get_keys (usages); apps = NULL; for (iter = appids; iter; iter = iter->next) { const char *appid = iter->data; ShellApp *app; app = shell_app_system_lookup_app (appsys, appid); if (!app) continue; apps = g_slist_prepend (apps, g_object_ref (app)); } g_list_free (appids); data.usage = self; data.context_usages = usages; apps = g_slist_sort_with_data (apps, sort_apps_by_usage, &data); return apps; }
/** * shell_app_system_lookup_app_for_path: * @system: a #ShellAppSystem * @desktop_path: (type utf8): UTF-8 encoded absolute file name * * Find or create a #ShellApp corresponding to a given absolute file * name which must be in the standard paths (XDG_DATA_DIRS). For * files outside the datadirs, this function returns %NULL. * * Return value: (transfer none): The #ShellApp for id, or %NULL if none */ ShellApp * shell_app_system_lookup_app_for_path (ShellAppSystem *system, const char *desktop_path) { const char *basename; const char *app_path; ShellApp *app; basename = g_strrstr (desktop_path, "/"); if (basename) basename += 1; else basename = desktop_path; app = shell_app_system_lookup_app (system, basename); if (!app) return NULL; app_path = gmenu_tree_entry_get_desktop_file_path (shell_app_get_tree_entry (app)); if (strcmp (desktop_path, app_path) != 0) return NULL; return app; }
/* Save app data lists to file */ static gboolean idle_save_application_usage (gpointer data) { ShellAppUsage *self = SHELL_APP_USAGE (data); UsageIterator iter; const char *current_context; const char *context; const char *id; UsageData *usage; GFileOutputStream *output; GOutputStream *buffered_output; GDataOutputStream *data_output; GError *error = NULL; self->save_id = 0; /* Parent directory is already created by shell-global */ output = g_file_replace (self->configfile, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error); if (!output) { g_debug ("Could not save applications usage data: %s", error->message); g_error_free (error); return FALSE; } buffered_output = g_buffered_output_stream_new (G_OUTPUT_STREAM (output)); g_object_unref (output); data_output = g_data_output_stream_new (G_OUTPUT_STREAM (buffered_output)); g_object_unref (buffered_output); if (!g_data_output_stream_put_string (data_output, "<?xml version=\"1.0\"?>\n<application-state>\n", NULL, &error)) goto out; usage_iterator_init (self, &iter); current_context = NULL; while (usage_iterator_next (self, &iter, &context, &id, &usage)) { ShellApp *app; app = shell_app_system_lookup_app (shell_app_system_get_default(), id); if (!app) continue; if (context != current_context) { if (current_context != NULL) { if (!g_data_output_stream_put_string (data_output, " </context>", NULL, &error)) goto out; } current_context = context; if (!g_data_output_stream_put_string (data_output, " <context", NULL, &error)) goto out; if (!write_attribute_string (data_output, "id", context, &error)) goto out; if (!g_data_output_stream_put_string (data_output, ">\n", NULL, &error)) goto out; } if (!g_data_output_stream_put_string (data_output, " <application", NULL, &error)) goto out; if (!write_attribute_string (data_output, "id", id, &error)) goto out; if (!write_attribute_uint (data_output, "open-window-count", shell_app_get_n_windows (app), &error)) goto out; if (!write_attribute_double (data_output, "score", usage->score, &error)) goto out; if (!write_attribute_uint (data_output, "last-seen", usage->last_seen, &error)) goto out; if (!g_data_output_stream_put_string (data_output, "/>\n", NULL, &error)) goto out; } if (current_context != NULL) { if (!g_data_output_stream_put_string (data_output, " </context>\n", NULL, &error)) goto out; } if (!g_data_output_stream_put_string (data_output, "</application-state>\n", NULL, &error)) goto out; out: if (!error) g_output_stream_close_async (G_OUTPUT_STREAM (data_output), 0, NULL, NULL, NULL); g_object_unref (data_output); if (error) { g_debug ("Could not save applications usage data: %s", error->message); g_error_free (error); } return FALSE; }