def find_windows_for_process(self, process_id, display_name):
        """Return visible windows belonging to a process."""
        pids = self.get_process_ids(process_id)
        if not pids:
            return []

        logger.info(
            'Waiting for 30 seconds to ensure all windows appear: '
            'pid=%s, display=%s', pids, display_name)
        time.sleep(30)

        visible_windows = set()
        for pid in pids:
            _, windows = common.execute(
                'xdotool',
                'search --all --pid %s --onlyvisible --name ".*"' % pid,
                '.',
                env={'DISPLAY': display_name},
                exit_on_error=False,
                print_command=False,
                print_output=False,
                stdin=common.BlockStdin())
            for line in windows.splitlines():
                if not line.isdigit():
                    continue
                visible_windows.add(line)

        logger.info('Found windows: %s', ', '.join(list(visible_windows)))
        return visible_windows
 def xdotool_command(self, command, display_name):
     """Run a command, returning its output."""
     common.execute('xdotool',
                    command,
                    '.',
                    env={'DISPLAY': display_name},
                    stdin=common.BlockStdin())
 def test_stdin(self):
     """Test stdin."""
     stdin = common.BlockStdin()
     self.assertEqual(subprocess.PIPE, stdin.get())
     self.assertEqual('cmd', stdin.update_cmd_log('cmd'))