OSDN Git Service

init autoswitch
[instantos/instantOS.git] / autostart.sh
1 #!/usr/bin/env bash
2
3 ###############################################
4 ## script for instantOS autostart            ##
5 ###############################################
6
7 INSTANTVERSION="$(cat /usr/share/instantutils/version)"
8 if iconf version && [ "$(iconf version)" = "$INSTANTVERSION" ]; then
9         echo "version check successful"
10         echo "running version $INSTANTVERSION"
11 else
12         echo "running update hooks"
13         /usr/share/instantutils/userinstall.sh
14         iconf -i userinstall 1
15         iconf version "$INSTANTVERSION"
16         instantutils default
17 fi
18
19 # architecture detection
20 if [ -z "$1" ]; then
21         if uname -m | grep -q '^arm'; then
22                 export ISRASPI=true
23         fi
24
25         if iconf -i noautostart; then
26                 echo "autostart disabled"
27                 exit
28         fi
29
30         if [ "$(ps aux | grep bash | grep instantautostart | wc -l)" -gt 3 ]; then
31                 echo "already running"
32                 exit
33         fi
34 else
35         echo "forced run"
36 fi
37
38 cd
39 command -v instantdotfiles && instantdotfiles
40
41 if ! iconf -i rangerplugins && command -v rangerplugins; then
42         mkdir instantos
43         echo "installing ranger plugins"
44         mkdir -p ~/.config/ranger/plugins
45         cp -r /usr/share/rangerplugins/* ~/.config/ranger/plugins/
46         iconf -i rangerplugins 1
47 fi
48
49 # find out if it's a live session
50 if [ -e /usr/share/liveutils ] &>/dev/null; then
51         ISLIVE="True"
52         echo "live session detected"
53 fi
54
55 if iconf -i islaptop; then
56         export ISLAPTOP="true"
57         echo "laptop detected"
58 else
59         echo "not a laptop"
60 fi
61
62 islive() {
63         if [ -n "$ISLIVE" ]; then
64                 return 0
65         else
66                 return 1
67         fi
68 }
69
70 # optionally disable status bar
71 if iconf -i nobar; then
72         NMON=$(iconf names | wc -l)
73         for i in $(eval "echo {1..$NMON}"); do
74                 echo "found monitor $i"
75                 xdotool key super+comma
76                 xdotool key super+b
77         done &
78 fi
79
80 if [ -n "$ISRASPI" ]; then
81         # enable double drawing for moving floating windows
82         # greatly increases smoothness
83         iconf -i highfps 1
84         if ! [ -e ~/.config/instantos/israspi ]; then
85                 echo "marking machine as raspi"
86                 mkdir -p ~/.config/instantos
87                 touch ~/.config/instantos/israspi
88                 # logo does not work on raspi
89                 iconf -i nologo 1
90         fi
91 fi
92
93 if ! iconf -i notheming; then
94         instantthemes a
95         xrdb ~/.Xresources
96         iconf -i instantthemes 1
97
98         # dynamically switch between light and dark gtk theme
99         DATEHOUR=$(date +%H)
100         if [ "$DATEHOUR" -gt "20" ] || [ "$DATEHOUR" -lt "7" ]; then
101                 instantthemes d &
102                 touch /tmp/instantdarkmode
103                 [ -e /tmp/instantlightmode ] && rm /tmp/instantlightmode
104         else
105                 instantthemes l &
106                 touch /tmp/instantlightmode
107                 [ -e /tmp/instantdarkmode ] && rm /tmp/instantdarkmode
108         fi &
109 else
110         touch /tmp/instantlightmode
111 fi
112
113 mkdir -p /tmp/notifications &>/dev/null
114 if ! pgrep dunst; then
115         while :; do
116                 # wait for theming before starting dunst
117                 if [ -e /tmp/instantdarkmode ] || [ -e /tmp/instantlightmode ]; then
118                         dunst
119                 fi
120                 sleep 2
121         done &
122 fi
123
124 onlinetrigger() {
125         instantwallpaper &
126 }
127
128 # set up oh-my-zsh config if not existing already
129 iconf -i nozsh || instantshell &
130
131 # fix resolution on virtual machine
132 if ! iconf -i novmfix && grep -q 'hypervisor' /proc/cpuinfo; then
133         # indicator file only exists on kvm/QEMU on amd
134         if [ -e /opt/instantos/kvm ]; then
135                 iconf -i highfps 1
136                 if lshw -c video | grep -i 'qxl' || xrandr | grep -i '^qxl'; then
137                         iconf -i qxl 1
138                         # iconf -i noanimations 1
139                         if ! iconf -i potato && ! iconf -i nopotato; then
140                                 if echo "please set your video card to virtio or passthrough
141 QXL on AMD on QEMU/kvm has been known to cause a severe Xorg memory leak. 
142 Disabling compositing makes this somewhat bearable,
143 but switching really is recommended.
144 (or switch to virtualbox, no issues there...)
145 Disable compositing for this VM?" | imenu -C; then
146                                         iconf -i potato 1
147                                         pkill picom
148                                 else
149                                         if ! imenu -c "ask again next time?"; then
150                                                 iconf -i nopotato 1
151                                         fi
152                                 fi
153                         fi
154                 else
155                         iconf -i qxl 1
156                 fi
157         fi
158
159         if ! [ -e /opt/instantos/guestadditions ]; then
160                 if echo "virtual machine detected.
161 Would you like to switch to a 1080p resolution?" | imenu -C; then
162                         echo "applying virtual machine workaround"
163                         /usr/share/instantassist/assists/t/v.sh
164                 else
165                         if ! imenu -c "ask again next session"; then
166                                 iconf -i novmfix 1
167                         fi
168                 fi
169         fi
170 fi
171
172 if ! islive; then
173         echo "not a live session"
174         if [ -e /opt/instantos/installtrigger ]; then
175                 zenity --info --text "finishing installation in background" &
176
177                 # ask for password if postinstall already ran
178                 if ! timeout 2 sudo echo test; then
179                         instantsudo instantpostinstall
180                         sudo rm /opt/instantos/installtrigger
181                 else
182                         sudo instantpostinstall
183                 fi
184
185                 pkill zenity
186         fi
187
188         cd ~/instantos || exit 1
189         if ! iconf -i max; then
190                 instantmonitor
191         fi
192
193         if [ -e ~/instantos/monitor.sh ]; then
194                 echo "restoring resolution"
195                 bash ~/instantos/monitor.sh &
196         elif [ -e ~/.config/autorandr/instantos/config ]; then
197                 echo "restoring autorandr resolution"
198                 autorandr instantos &
199         fi
200
201         if checkinternet; then
202                 onlinetrigger
203         else
204                 # fall back to already installed wallpapers
205                 instantwallpaper offline
206                 for i in $(seq 10); do
207                         if checkinternet; then
208                                 onlinetrigger
209                                 break
210                         else
211                                 sleep 10
212                         fi
213                 done
214         fi &
215
216         # apply keybpard layout
217         if iconf layout; then
218                 setxkbmap -layout "$(iconf layout)"
219         else
220                 CURLOCALE=$(locale | grep LANG | sed 's/.*=\(.*\)\..*/\1/')
221                 case "$CURLOCALE" in
222                 de_DE)
223                         setxkbmap -layout de
224                         ;;
225                 *)
226                         echo "no keyboard layout found for your locale"
227                         ;;
228                 esac
229         fi
230
231         # read cursor speed
232         if iconf mousespeed; then
233                 echo "setting mousespeed"
234                 instantmouse s "$(iconf mousespeed)"
235         fi
236
237         if iconf -i reversemouse; then
238                 instantmouse r 1
239         else
240                 instantmouse r 0
241         fi
242
243         if ! iconf -i noconky; then
244                 shuf /usr/share/instantwidgets/tooltips.txt | head -1 >~/.cache/tooltip
245                 conky -c /usr/share/instantwidgets/tooltips.conf &
246         fi
247
248 else
249         echo "live session detected"
250         instantmonitor
251
252         echo "disabling compositing for qxl graphics"
253         if lshw -c video | grep -i 'qxl' || xrandr | grep -i '^qxl'; then
254                 iconf -i potato 1
255         fi
256
257         sudo systemctl start NetworkManager
258
259         iconf -b welcome 1
260         iconf -i wifiapplet 1
261         instantwallpaper set /usr/share/instantwallpaper/defaultphoto.png
262         conky -c /usr/share/instantwidgets/install.conf &
263         sleep 0.3
264         while :; do
265                 if ! pgrep python; then
266                         installapplet
267                 fi &
268                 sleep 6m
269         done &
270         sleep 1
271 fi
272
273 # make built in status optional
274 if ! iconf -i nostatus; then
275         source /usr/bin/instantstatus &
276 fi
277
278 iconf -i potato || ipicom &
279
280 while :; do
281         lxpolkit
282 done &
283
284 xfce4-power-manager &
285
286 # start processes that need to be kept running
287 while :; do
288         sleep 10
289         if iconf -i wifiapplet && ! pgrep nm-applet; then
290                 echo "starting bluetooth applet"
291                 nm-applet &
292         fi
293
294         if iconf -i bluetoothapplet && ! pgrep blueman-applet; then
295                 echo "starting bluetooth applet"
296                 blueman-applet &
297         fi
298
299         if iconf -i alttab && ! pgrep alttab; then
300                 alttab -fg "#ffffff" -bg "#292F3A" -frame "#5293E1" -d 0 -s 1 -t 128x150 -i 127x64 -w 1 -vp pointer &
301         fi
302         sleep 2m
303
304 done &
305
306 # auto open menu when connecting/disconnecting monitor
307 if ! (iconf -i noautoswitch && iconf -i islaptop) || iconf -i autoswitch; then
308         DISPLAYCOUNT="$(xrandr | grep -c '[^s]connected')"
309         if [ "$DISPLAYCOUNT" -eq "$DISPLAYCOUNT" ]; then
310                 while :; do
311                         NEWDISPLAYCOUNT="$(xrandr | grep -c '[^s]connected')"
312                         if ! [ "$DISPLAYCOUNT" = "$NEWDISPLAYCOUNT" ]; then
313                                 echo "displays changed"
314                                 notify-send "display changed"
315                                 DISPLAYCOUNT="$NEWDISPLAYCOUNT"
316                                 # todo: open menu
317                         fi
318                         sleep 10
319                 done &
320         else
321                 echo "error detecting display count"
322         fi
323 fi
324
325 # welcome greeter app
326 if iconf -b welcome; then
327         instantwelcome
328 fi &
329
330 # prompt to fix configuration if installed from the AUR
331 if ! iconf -i norootinstall && ! islive; then
332         if ! command -v imenu || ! command -v instantmenu; then
333                 notify-send "please install instantmenu and imenu"
334         else
335                 if ! [ -e /opt/instantos/rootinstall ]; then
336                         imenu -m "instantOS is missing some configuration"
337                         while ! [ -e /tmp/rootskip ]; do
338                                 if imenu -c "would you like to fix that?"; then
339                                         touch /tmp/topinstall
340                                         instantsudo bash -c "instantutils root"
341                                         touch /tmp/rootskip
342                                 else
343                                         if imenu -c "Are you sure? this will prevent parts of instantOS from functioning correctly"; then
344                                                 touch /tmp/rootskip
345                                         fi
346                                 fi
347
348                         done
349                 fi
350         fi
351 fi
352
353 # displays message user opens the terminal for the first time
354 if ! iconf -i nohelp; then
355         if ! grep -q 'instantterminalhelp' ~/.zshrc; then
356                 echo '[[ $- == *i* ]] && instantterminalhelp' >>~/.zshrc
357         fi
358 fi
359
360 confkey() {
361         [ -n "$2" ] || return
362         iconf -i "$1" || return
363         xdotool key "$2"
364 }
365
366 confkey highfps "super+alt+shift+d"
367 confkey noanimations "super+alt+shift+s"
368 # disable wm alttab for graphical alttab
369 confkey alttab "super+alt+control+shift+Tab"
370
371 # desktop icons
372 if iconf -i desktopicons; then
373         rox --pinboard Default
374 fi &
375
376 # optional udiskie
377 if iconf -i udiskie; then
378         command -v udiskie && udiskie -t &
379 fi
380
381 # user declared autostart
382 if [ -e ~/.instantautostart ]; then
383         bash ~/.instantautostart &
384 fi