Associate process identifiers with applications

Cache the set of pids for an application, in preparation for
landing an XSMP patch which requires this information.

https://bugzilla.gnome.org/show_bug.cgi?id=619542
This commit is contained in:
Colin Walters 2010-05-24 10:59:52 -04:00
parent e4a6bf994f
commit bf6d0dc808
3 changed files with 55 additions and 20 deletions

View File

@ -739,6 +739,32 @@ _shell_app_remove_window (ShellApp *app,
} }
} }
/**
* shell_app_get_pids:
* @app: a #ShellApp
*
* Returns: (transfer container) (element-type int): An unordered list of process identifers associated with this application.
*/
GSList *
shell_app_get_pids (ShellApp *app)
{
GSList *result;
GSList *iter;
result = NULL;
for (iter = shell_app_get_windows (app); iter; iter = iter->next)
{
MetaWindow *window = iter->data;
int pid = meta_window_get_pid (window);
/* Note in the (by far) common case, app will only have one pid, so
* we'll hit the first element, so don't worry about O(N^2) here.
*/
if (!g_slist_find (result, GINT_TO_POINTER (pid)))
result = g_slist_prepend (result, GINT_TO_POINTER (pid));
}
return result;
}
void void
_shell_app_set_starting (ShellApp *app, _shell_app_set_starting (ShellApp *app,
gboolean starting) gboolean starting)

View File

@ -56,6 +56,8 @@ guint shell_app_get_n_windows (ShellApp *app);
GSList *shell_app_get_windows (ShellApp *app); GSList *shell_app_get_windows (ShellApp *app);
GSList *shell_app_get_pids (ShellApp *app);
gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace); gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
int shell_app_compare (ShellApp *app, ShellApp *other); int shell_app_compare (ShellApp *app, ShellApp *other);

View File

@ -746,33 +746,40 @@ shell_window_tracker_get_window_app (ShellWindowTracker *monitor,
* *
* Look up the application corresponding to a process. * Look up the application corresponding to a process.
* *
* Returns: (transfer full): A #ShellApp, or %NULL if none * Returns: (transfer none): A #ShellApp, or %NULL if none
*/ */
ShellApp * ShellApp *
shell_window_tracker_get_app_from_pid (ShellWindowTracker *self, shell_window_tracker_get_app_from_pid (ShellWindowTracker *self,
int pid) int pid)
{ {
ShellGlobal *global = shell_global_get (); GSList *running = shell_window_tracker_get_running_apps (self, "");
GList *windows, *iter; GSList *iter;
ShellApp *result = NULL;
windows = shell_global_get_windows (global);
for (iter = windows; iter; iter = iter->next) for (iter = running; iter; iter = iter->next)
{ {
MutterWindow *win = iter->data; ShellApp *app = iter->data;
MetaWindow *metawin; GSList *pids = shell_app_get_pids (app);
int windowpid; GSList *pids_iter;
ShellApp *app;
for (pids_iter = pids; pids_iter; pids_iter = pids_iter->next)
metawin = mutter_window_get_meta_window (win); {
windowpid = meta_window_get_pid (metawin); int app_pid = GPOINTER_TO_INT (pids_iter->data);
if (windowpid != pid) if (app_pid == pid)
continue; {
result = app;
app = shell_window_tracker_get_window_app (self, metawin); break;
if (app) }
return app; }
g_slist_free (pids);
if (result != NULL)
break;
} }
return NULL;
g_slist_free (running);
return result;
} }
/** /**