XRandr options for specifying outputs relative position can only top-align or left-align outputs, while in many cases it seems practical to align outputs by bottom or right edges too. There are two new sub-options to allow syntax like that:
* xrandr --output A --left-of [--bottom-align] B * xrandr --output A --right-of [--bottom-align] B * xrandr --output A --above [--right-align] B * xrandr --output A --below [--right-align] B Signed-off-by: Pavel Kretov <[email protected]> --- Why I think there options are useful. For example, I use a laptop which gets occasionally connected to different external monitors: one at home and another at work. Laptop built-in screen is lot smaller and physically placed much lower then external one, so it's unconvenient to just use --left-of option. I could workaround this using explicit --pos in pixels, but monitors have different resolutions and I have to keep two variants of the command. But: $ xrandr --output DP1 --left-of --bottom-align LVDS1 gives me usable configuration for both cases (and I can just put this line in .xinitrc and forget about it). I know I could just write a wrapper script to extract geometry from xrandr's output, calculate offsets and run xrandr --output DP1 --pos, but I thought sending a patch here was a better way since xrandr already has --left-of and other relative positioning options. Adding sub-options seemed better for me then adding options with names like --left-bottom-of, but I do not really insist on that exact way. I'm also not very experienced in submitting patches, so tell me please if something is wrong. man/xrandr.man | 11 +++++---- xrandr.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/man/xrandr.man b/man/xrandr.man index 73d337c..21c09d7 100644 --- a/man/xrandr.man +++ b/man/xrandr.man @@ -54,10 +54,10 @@ xrandr \- primitive command line interface to RandR extension [\-\-rate \fIrate\fP] [\-\-reflect \fIreflection\fP] [\-\-rotate \fIorientation\fP] -[\-\-left\-of \fIoutput\fP\] -[\-\-right\-of \fIoutput\fP\] -[\-\-above \fIoutput\fP\] -[\-\-below \fIoutput\fP\] +[\-\-left\-of [\-\-bottom\-align] \fIoutput\fP\] +[\-\-right\-of [\-\-bottom\-align] \fIoutput\fP\] +[\-\-above [\-\-right\-align] \fIoutput\fP\] +[\-\-below [\-\-right\-align] \fIoutput\fP\] [\-\-same-as \fIoutput\fP\] [\-\-set \fIproperty\fP \fIvalue\fP] [\-\-off] @@ -278,6 +278,9 @@ rotation. .IP "\-\-left\-of, \-\-right\-of, \-\-above, \-\-below, \-\-same-as \fIanother-output\fP" Use one of these options to position the output relative to the position of another output. This allows convenient tiling of outputs within the screen. +By default \-\-left\-of and \-\-right\-of aligns output by top edge, \-\-above +and \-\-below aligns by left. Use additional \-\-bottom\-align or \-\-right\-align +options to change this behavior. The position is always computed relative to the new position of the other output, so it is not valid to say \-\-output a \-\-left\-of b \-\-output b \-\-left\-of a. diff --git a/xrandr.c b/xrandr.c index 366f6dc..6470e3a 100644 --- a/xrandr.c +++ b/xrandr.c @@ -126,10 +126,10 @@ usage(void) " --rate <rate> or --refresh <rate>\n" " --reflect normal,x,y,xy\n" " --rotate normal,inverted,left,right\n" - " --left-of <output>\n" - " --right-of <output>\n" - " --above <output>\n" - " --below <output>\n" + " --left-of [--bottom-align] <output>\n" + " --right-of [--bottom-align] <output>\n" + " --above [--right-align] <output>\n" + " --below [--right-align] <output>\n" " --same-as <output>\n" " --set <property> <value>\n" " --scale <x>x<y>\n" @@ -248,9 +248,13 @@ capability_name (int cap_bit) typedef enum _relation { relation_left_of, + relation_left_of_bottom_align, relation_right_of, + relation_right_of_bottom_align, relation_above, + relation_above_right_align, relation_below, + relation_below_right_align, relation_same_as, } relation_t; @@ -1997,18 +2001,38 @@ set_positions (void) output->y = relation->y; output->x = relation->x - mode_width (output->mode_info, output->rotation); break; + case relation_left_of_bottom_align: + output->x = relation->x - mode_width (output->mode_info, output->rotation); + output->y = relation->y + mode_height (relation->mode_info, relation->rotation) + - mode_height (output->mode_info, output->rotation); + break; case relation_right_of: output->y = relation->y; output->x = relation->x + mode_width (relation->mode_info, relation->rotation); break; + case relation_right_of_bottom_align: + output->x = relation->x + mode_width (relation->mode_info, relation->rotation); + output->y = relation->y + mode_height (relation->mode_info, relation->rotation) + - mode_height (output->mode_info, output->rotation); + break; case relation_above: output->x = relation->x; output->y = relation->y - mode_height (output->mode_info, output->rotation); break; + case relation_above_right_align: + output->y = relation->y - mode_height (output->mode_info, output->rotation); + output->x = relation->x + mode_width (relation->mode_info, relation->rotation) + - mode_width (output->mode_info, output->rotation); + break; case relation_below: output->x = relation->x; output->y = relation->y + mode_height (relation->mode_info, relation->rotation); break; + case relation_below_right_align: + output->y = relation->y + mode_height (relation->mode_info, relation->rotation); + output->x = relation->x + mode_width (relation->mode_info, relation->rotation) + - mode_width (output->mode_info, output->rotation); + break; case relation_same_as: output->x = relation->x; output->y = relation->y; @@ -2760,32 +2784,56 @@ main (int argc, char **argv) if (!strcmp ("--left-of", argv[i])) { if (!config_output) argerr ("%s must be used after --output\n", argv[i]); if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]); - config_output->relation = relation_left_of; - config_output->relative_to = argv[i]; + if (strcmp(argv[i], "--bottom-align")) { + config_output->relation = relation_left_of; + config_output->relative_to = argv[i]; + } else { + if (++i >= argc) argerr ("%s %s requires an argument\n", argv[i-2], argv[i-1]); + config_output->relation = relation_left_of_bottom_align; + config_output->relative_to = argv[i]; + } config_output->changes |= changes_relation; continue; } if (!strcmp ("--right-of", argv[i])) { if (!config_output) argerr ("%s must be used after --output\n", argv[i]); if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]); - config_output->relation = relation_right_of; - config_output->relative_to = argv[i]; + if (strcmp(argv[i], "--bottom-align")) { + config_output->relation = relation_right_of; + config_output->relative_to = argv[i]; + } else { + if (++i >= argc) argerr ("%s %s requires an argument\n", argv[i-2], argv[i-1]); + config_output->relation = relation_right_of_bottom_align; + config_output->relative_to = argv[i]; + } config_output->changes |= changes_relation; continue; } if (!strcmp ("--above", argv[i])) { if (!config_output) argerr ("%s must be used after --output\n", argv[i]); if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]); - config_output->relation = relation_above; - config_output->relative_to = argv[i]; + if (strcmp(argv[i], "--right-align")) { + config_output->relation = relation_above; + config_output->relative_to = argv[i]; + } else { + if (++i >= argc) argerr ("%s %s requires an argument\n", argv[i-2], argv[i-1]); + config_output->relation = relation_above_right_align; + config_output->relative_to = argv[i]; + } config_output->changes |= changes_relation; continue; } if (!strcmp ("--below", argv[i])) { if (!config_output) argerr ("%s must be used after --output\n", argv[i]); if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]); - config_output->relation = relation_below; - config_output->relative_to = argv[i]; + if (strcmp(argv[i], "--right-align")) { + config_output->relation = relation_below; + config_output->relative_to = argv[i]; + } else { + if (++i >= argc) argerr ("%s %s requires an argument\n", argv[i-2], argv[i-1]); + config_output->relation = relation_below_right_align; + config_output->relative_to = argv[i]; + } config_output->changes |= changes_relation; continue; } -- 1.9.3 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
