diff --git a/src/shell-app-system.c b/src/shell-app-system.c index 4b57e8a4a..4d8b7c809 100644 --- a/src/shell-app-system.c +++ b/src/shell-app-system.c @@ -484,6 +484,32 @@ shell_app_system_get_app (ShellAppSystem *self, return app; } +/** + * shell_app_system_get_app_for_window: + * @self: A #ShellAppSystem + * @window: A #MetaWindow + * + * Find or create a #ShellApp for window + * + * Return value: (transfer full): The #ShellApp for window, or %NULL if none + */ +ShellApp * +shell_app_system_get_app_for_window (ShellAppSystem *self, + MetaWindow *window) +{ + char *id = g_strdup_printf ("window:%p", window); + ShellApp *app = g_hash_table_lookup (self->priv->app_id_to_app, id); + + if (app) + g_object_ref (G_OBJECT (app)); + else + app = _shell_app_new_for_window (window); + + g_free (id); + + return app; +} + /* ShellAppSystem ensures we have a unique instance of * apps per id. */ diff --git a/src/shell-app-system.h b/src/shell-app-system.h index d6c75817c..a02cfb7c5 100644 --- a/src/shell-app-system.h +++ b/src/shell-app-system.h @@ -66,6 +66,7 @@ gboolean shell_app_info_launch (ShellAppInfo *info, ShellAppInfo *shell_app_system_load_from_desktop_file (ShellAppSystem *system, const char *filename, GError **error); ShellApp *shell_app_system_get_app (ShellAppSystem *system, const char *id); +ShellApp *shell_app_system_get_app_for_window (ShellAppSystem *self, MetaWindow *window); void _shell_app_system_register_app (ShellAppSystem *self, ShellApp *app); diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c index 0865b2b86..bf7648881 100644 --- a/src/shell-window-tracker.c +++ b/src/shell-window-tracker.c @@ -302,15 +302,15 @@ get_app_for_window_direct (MetaWindow *window) char *wmclass; char *with_desktop; + appsys = shell_app_system_get_default (); wmclass = get_appid_from_window (window); if (!wmclass) - return _shell_app_new_for_window (window); + return shell_app_system_get_app_for_window (appsys, window); with_desktop = g_strjoin (NULL, wmclass, ".desktop", NULL); g_free (wmclass); - appsys = shell_app_system_get_default (); app = shell_app_system_lookup_heuristic_basename (appsys, with_desktop); g_free (with_desktop); @@ -323,9 +323,7 @@ get_app_for_window_direct (MetaWindow *window) } if (app == NULL) - { - app = _shell_app_new_for_window (window); - } + app = shell_app_system_get_app_for_window (appsys, window); return app; }