pw-dot: added -L/--lr for outputting the graph using 'rankdir = "LR"'

Graphs laid out this way may be look nicer sometimes.
This commit is contained in:
Erkki Seppälä 2021-04-02 11:41:02 +03:00
parent 21a36f3c51
commit 71b53f1590
2 changed files with 19 additions and 2 deletions

View file

@ -58,6 +58,11 @@ This file is part of PipeWire.
<optdesc><p>Output file name (Default pw.dot). Use - for stdout.</p></optdesc> <optdesc><p>Output file name (Default pw.dot). Use - for stdout.</p></optdesc>
</option> </option>
<option>
<p><opt>-L | --lr</opt></p>
<optdesc><p>Lay the graph from left to right, instead of dot's default top to bottom.</p></optdesc>
</option>
</options> </options>
<section name="Authors"> <section name="Authors">

View file

@ -53,6 +53,7 @@ struct data {
struct spa_list globals; struct spa_list globals;
char *dot_str; char *dot_str;
const char *dot_rankdir;
bool show_all; bool show_all;
bool show_smart; bool show_smart;
@ -458,6 +459,11 @@ static int draw_graph(struct data *d, const char *path)
/* draw the header */ /* draw the header */
dot_str_add(&d->dot_str, "digraph pipewire {\n"); dot_str_add(&d->dot_str, "digraph pipewire {\n");
if (d->dot_rankdir) {
/* set rank direction, if provided */
dot_str_add(&d->dot_str, "rankdir = \"%s\";\n", d->dot_rankdir);
}
/* iterate the globals */ /* iterate the globals */
spa_list_for_each(g, &d->globals, link) { spa_list_for_each(g, &d->globals, link) {
/* skip null and non-info globals */ /* skip null and non-info globals */
@ -757,7 +763,8 @@ static void show_help(const char *name)
" -s, --smart Show linked objects only\n" " -s, --smart Show linked objects only\n"
" -d, --detail Show all object properties\n" " -d, --detail Show all object properties\n"
" -r, --remote Remote daemon name\n" " -r, --remote Remote daemon name\n"
" -o, --output Output file (Default %s)\n", " -o, --output Output file (Default %s)\n"
" -L, --lr Use left-right rank direction\n",
name, name,
DEFAULT_DOT_PATH); DEFAULT_DOT_PATH);
} }
@ -776,13 +783,14 @@ int main(int argc, char *argv[])
{ "detail", no_argument, NULL, 'd' }, { "detail", no_argument, NULL, 'd' },
{ "remote", required_argument, NULL, 'r' }, { "remote", required_argument, NULL, 'r' },
{ "output", required_argument, NULL, 'o' }, { "output", required_argument, NULL, 'o' },
{ "lr", no_argument, NULL, 'L' },
{ NULL, 0, NULL, 0} { NULL, 0, NULL, 0}
}; };
int c; int c;
pw_init(&argc, &argv); pw_init(&argc, &argv);
while ((c = getopt_long(argc, argv, "hVasdr:o:", long_options, NULL)) != -1) { while ((c = getopt_long(argc, argv, "hVasdr:o:L", long_options, NULL)) != -1) {
switch (c) { switch (c) {
case 'h' : case 'h' :
show_help(argv[0]); show_help(argv[0]);
@ -815,6 +823,10 @@ int main(int argc, char *argv[])
dot_path = optarg; dot_path = optarg;
fprintf(stderr, "set output file %s\n", dot_path); fprintf(stderr, "set output file %s\n", dot_path);
break; break;
case 'L' :
data.dot_rankdir = "LR";
fprintf(stderr, "set rank direction to LR\n");
break;
default: default:
show_help(argv[0]); show_help(argv[0]);
return -1; return -1;