static struct pidset filter_out_forks(struct pidset in) { /* * Discard any process whose parent is also in our remaining match * set and looks sufficiently like it for us to decide this one's * an uninteresting fork (e.g. of a shell script executing a * complex pipeline). */ struct pidset ret; int pid; pidset_init(&ret); for (pid = pidset_first(&in); pid >= 0; pid = pidset_next(&in)) { const struct procdata *proc = get_proc(pid); if (pidset_in(&in, proc->ppid)) { /* The parent is in our set too. Is it similar? */ const struct procdata *parent = get_proc(proc->ppid); if (!strnullcmp(parent->exe, proc->exe) && !argcmp(parent->argv, proc->argv)) { /* Yes; don't list it. */ continue; } } pidset_add(&ret, pid); } return ret; }
static int vicmp(const char *name, int num, const vdp_instance_t *vi) { int val = strnullcmp(name, vi->name); if (val) return val; if (num < 0) num = XDefaultScreen(vi->display); return num - vi->num; }