-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0m
More file actions
executable file
·128 lines (112 loc) · 2.97 KB
/
0m
File metadata and controls
executable file
·128 lines (112 loc) · 2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#! /usr/bin/env tclsh
###############################################################################
# 0m: desktop utility for positioning monitors
source $::env(HOME)/bin/lib.tcl
need rg \
xrandr
###############################################################################
proc help {} {
global ME
puts "Usage: $ME <option>"
puts { x off}
puts { s = same}
puts { d b bot bottom down}
puts { u t up}
puts { l left}
puts { r right}
exit
}
proc detect {which} {
catch {exec xrandr --query | rg -A1 primary} grep_prm
set prm [lindex $grep_prm 0]
switch -regexp -- $which {
^prm.* {
if {{prm} eq $which} {
return $prm
}
return [lindex [exec echo $grep_prm | tail -1] 0]
}
^ext.* {
catch {exec xrandr --query | rg -v $prm | rg -A1 " connected"} grep_ext
if {{ext} eq $which} {
return [lindex $grep_ext 0]
}
# matches the last line, so presumes a single external
return [lindex [exec echo $grep_ext | tail -1] 0]
}
^first$ {
catch {exec xrandr --query | rg {\+0\+0 \(}} grep_first
return [lindex $grep_first 0]
}
}
return {}
}
proc connected {} {
global ext
if {[string length $::env(DISPLAY)] \
&& ![catch {exec xrandr -q | rg "^$ext connected "}]} {
return true
} else {
return false
}
}
proc opt {rel dir ref} {
global prm prm_res ext ext_res
if {[string equal $rel {prm}]} {
set dir "primary --orientation normal --rotate normal --$dir"
}
return "--auto --output [subst $${rel}]\
--mode [subst $${rel}_res]\
--$dir [subst $${ref}]"
}
###############################################################################
set arg [lindex $::argv 0]
set prm [detect prm]
set ext [detect ext]
set prm_res [detect prm_res]
set ext_res [detect ext_res]
set cmd1 {xrandr}
set cmd2 {}
switch -- $arg {
{} - x - off - \
= - s - same - \
b - d - bot - bottom - down - \
t - u - top - up - \
l - left - \
r - right {
if {![connected]} { fail "no external monitor connected" }
}
default { help }
}
switch -- $arg {
{} - x - off {
append cmd1 " --output $ext --off"
}
= - s - same {
append cmd1 " [opt prm same-as ext]"
}
b - d - bot - bottom - down {
set cmd2 "$cmd1 [opt prm above ext]"
append cmd1 " [opt ext {rotate normal --below} prm]"
}
t - u - top - up {
set cmd2 "$cmd1 [opt prm below ext]"
append cmd1 " [opt ext {rotate normal --above} prm]"
}
l - left {
set cmd2 "$cmd1 [opt prm right-of ext]"
append cmd1 " [opt ext {rotate normal --left-of} prm]"
}
r - right {
set cmd2 "$cmd1 [opt prm left-of ext]"
append cmd1 " [opt ext {rotate normal --right-of} prm]"
}
default { help }
}
# workaround: polybar seems to mess monitor borders
catch {exec pkill polybar}
exec {*}$cmd1
if {{} ne $cmd2} { exec {*}$cmd2 }
# workaround: restart polybar on "northwest-most" monitor
set ::env(MONITOR) [detect first]
exec >>&$LOGX nohup polybar 0bar &