D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Hey! Angespornt durch Neuromatic habe ich das Skript mit Dmenu nochmals umgebaut. Ich nenne es weiterhin "activate.sh" und gebe dem aktuellen Zustand einfach mal die Version 0.3. Das Skript ist nun erheblich komplexer und größer geworden, integriert dafür aber Dmenu stärker als zuvor. Es besteht jetzt aus sechs Funktionen und einer While-Schleife. Das macht das ganze wesentlich flexibler. Im Grunde funktioniert es ohne Fehler und kann benutzt werden; in den nächsten Tagen werde ich das ganze aber noch straffen und schöner gestalten. Es macht rege Gebrauch von GNU Sed und Parameter Expansion. Geändert hat sich: Die Apps werden nur noch aus einer File gelesen, die zwingend notwendig ist und gefüllt werden muss. Außerdem können Apps ignoriert oder blockiert werden. Dazu müsssen die Apps in der File mit "block" oder "ign" maskiert werden. Ist eine App/ein Kommando blockiert, wird weder ein Prozess gestartet noch ein Fenster aktiviert; wird lediglich ignoriert, ist zwar das Prozessstarten möglich, nicht aber das Aktivieren der Fenster. Es gilt: pro Zeile eine App; Groß- und Kleinschreibung möglich; die Reihenfolge ist egal, da die File später sortiert werden wird. Beispiel:
| ign vlc
block firefox
geany
|
In Dmenu selbst kann die File nun editiert werden. Dazu werden die Kommandos [add/block/ign/del] APP eingegeben. Momentan kann nur eine App angegeben werden. Nach der Eingabe wird die File aktualisiert und Dmenu wieder neu geöffnet (das ist die while-Schleife). Es gilt: Jede App hat in der File nur einen Status, d.h., doppelte Auflistungen oder Variationen sind nicht vorgesehen. Demnach wird eine App immer mit ihrer Maskierung "deletet". Falls die File per Hand bearbeit wurde und eine App mehr als einmal auftaucht, werden alle Vorkommen der App mit dem Kommando "del" entfernt. Beispiel:
| add thunar
block firefox
ign vlc
del firefox
|
Integrieren möchte in noch ein Logfile sowie die Möglichkeit, Argumente in Dmenu einzulesen. Der Code:
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 | #!/bin/bash
# activate.sh
# version: 0.3
# requires dmenu, GNU sed, wmctrl, xdotool
#
# For xft support to Dmenu you need to patch Dmenu. See http://tools.suckless.org/dmenu/patches/xft or https://bitbucket.org/melek/dmenu2. See also https://bitbucket.org/rafaelgg/slmenu.
#
# 1. In File include your Apps. You can mask lines with "block" or "ign". Example: "ign vlc".
# 2. Further you can edit the File in Dmenu with "[add/block/ign/del] APP". Example: "add firefox".
# 3. Choose or enter any other App in Dmenu.
#
# Status Codes
# 0: Script finished!
# 1: "$app_file" is unset!
# 2: There is no App File!
# 3: Empty App File exists!
# 4: Bye, Bye! No App has been chosen.
# 5: App '$app' is blocked!
# 6: Could not activate Window!
# 7: Could not run App!
# 8: Command "$app" does not exist!
# 9: App '${app##* }' has already been edited!
#
# If status 6, try to replace 'w_id=$(wmctrl -lx | awk -v app_name="$app" 'BEGIN {IGNORECASE=1} app_name ~ /[a-z]/ && $0 ~ app_name {print $1}')' with 'w_id=$([[ "$app" == *[a-z]* ]] && { wmctrl -lx | grep -i "$app" | awk '{print $1}' ; })'.
#
################################################################################
#
# Feel free to fit these variables into your position.
#
# App list. Use upper or lower case. One App or command per line. Sequence is irrelevant. You can mask lines with "block" or "ign".
app_file=$HOME/.config/activatesh/app_file
#
# Dmenu options. Comment out and see manpage of dmenu for all of them.
#d_opt='-b -f -i -l 10'
#d_name='-name dmenu'
#d_class='-class dmenu'
#d_prompt='-p GO'
#d_h='-h 5'
#d_w='-w 1280'
#d_x='-x 0'
#d_y='-y 0'
#d_o='-o 1.0'
#d_dim='-dim 1.0'
#d_dc='-dc #000000'
#
# Preconfig. To find xft fonts on your system, you can run 'fc-list | cut -d' ' -f2-'.
#d_fn="'Droid Sans Mono-9'"
#d_nb='#2C2C2C'
#d_nf='#DCDCCC'
#d_sb='#DCDCCC'
#d_sf='#2C2C2C'
#
################################################################################
_exec_app() {
if command -v "$app" >/dev/null
then
{ shopt -s execfail && exec "$app" ; } 2>/dev/null || { echo 'Could not run App!' >&2 ; exit 7 ; }
else
{ echo "Command '$app' does not exist!" >&2 ; exit 8 ; }
fi
}
_check() {
if [ $(egrep -xci -e "(block).+$app" "$app_file") -gt 0 ]
then
{ echo "App '$app' is blocked!" >&2 ; exit 5 ; }
else
w_id=$(wmctrl -lx | awk -v app_name="$app" 'BEGIN {IGNORECASE=1} app_name ~ /[a-z]/ && $0 ~ app_name {print $1}')
fi
if [ $(egrep -xci -e "(ign).+$app" "$app_file") -gt 0 ]
then
{ echo "App '$app' is an ignore case!" >&2 ; _exec_app ; }
elif [ -n "$w_id" ]
then
xdotool windowactivate --sync "$w_id" 2>/dev/null || { echo 'Could not activate Window!' >&2 ; exit 6 ; }
else
_exec_app
fi
}
_app() {
export app=$(\
egrep -iv -e "block" "$app_file" |
sed 's#ign ##g' |
sort -fg |
dmenu $d_opt $d_name $d_class $d_prompt $d_h $d_w $d_x $d_y $d_o $d_dim $d_dc \
-fn "${d_fn:='Droid Sans Mono-9'}" -nb "${d_nb:="#2C2C2C"}" -nf ${d_nf:="#DCDCCC"} \
-sb ${d_sb:="#DCDCCC"} -sf ${d_sf:="#2C2C2C"} |
tr '[:upper:]' '[:lower:]')
}
_file() {
if [ -z "$app_file" ]
then
{ echo '"$app_file" is unset!' >&2 ; exit 1 ; }
elif [ ! -f "$app_file" ]
then
{ echo 'There is no App File!' >&2 ; exit 2 ; }
elif [ $(stat -c %s "$app_file" 2>/dev/null) -lt 2 ]
then
{ echo 'Empty App File exists!' >&2 ; exit 3 ; }
fi
}
_edit ()
{
case ${app%% *} in
add)
{ echo "${app##add }" >> "$app_file" ; } && { echo "App '${app##add }' has been added!" >&2 ; }
;;
block)
{ sed -i -e "s#ign "${app##* }"#block ${app##* }#g;t;$ i $app" "$app_file" && _post-edit ; } && echo "Added App '${app##block }' is blocked now!" >&2
;;
ign)
{ sed -i -e "s#block "${app##* }"#ign ${app##* }#g;t;$ i $app" "$app_file" && _post-edit ; } && echo "Added App '${app##ign }' is ignored now!" >&2
;;
del)
{ sed -i -e "/[block|ign][[:space:]]"${app##del }"$/d" -e "/^"${app##del }"$/d" "$app_file" && echo "App '${app##del }' has been deleted!" >&2 ; }
;;
*)
{ _check ; echo 'Script finished!' >&2 ; exit 0 ; }
;;
esac
}
_post-edit ()
{
{ { sort -k2 -f "$app_file" | uniq > "$app_file.$$" ; } && mv "$app_file.$$" "$app_file" ; }
{ [ $(grep -cix -e "${app##* }" -e "${app%% }" "$app_file") -gt 1 ] && sed -i "/^"${app##* }"$/d" "$app_file" ; }
}
################################################################################
_file
_app
while [ -n "$app" ]
do
if [ $(grep -xci "$app" "$app_file") -gt 0 ]
then
[[ "$app" =~ ^(block|ign)[[:space:]].+ ]] && { echo "App '${app##* }' has already been edited!" >&2 ; exit 9 ; }
{ _check ; echo 'Script finished!' >&2 ; exit 0 ; }
else
_edit
fi
_file
_app
done
{ echo 'Bye, Bye! No App has been chosen.' >&2 ; exit 4 ; }
|
- activate_0.3.sh (4.6 KiB)
- Download activate_0.3.sh
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
Nun da D630 und ich unsere Scripte täglich kommentieren, also quasi zusammen Entwickeln bin ich geneigt ebenfalls aktiver an diesem Script zu basteln. Mein Script ist etwas einfacher gehalten und hat ungefähr 100 Zeilen weniger Code ( 😀 ) und konzentriert sich zunehmend darauf durch Parameter und Argumente kontrolliert zu werden. Das bringt den Umstand mit sich, dass die Funktionalität eher Kommandoorientiert ist, sprich mit kleinen Einzeilern in .desktop Dateien, oder in anderen Scripten Hauptanwendungszweck findet. Integriert ist bis jetzt: Konfigurationsdatei
ignorecasedatei
install.sh Es können sowohl Programme ignoriert werden, als auch $extended_options genutzt werden, sofern aktiviert. Desweiteren lässt sich ein Programm fixiert werden. Das beduetet, dass das Script darauf ausgelegt werden kann sich auf ein einziges Programm zu konzentieren. Geplant sind noch:
Kontolle über ein eigens dafür ausgelegtes Pipemenu (Alt+Click = Clickable Menu)
Vermehrte nutzung von Dateien (gemäß der Unix-Philosophie)
Entfernung von xdotool Zur besseren Versionskontrolle lade ich das Script extern hoch; vielleicht auf Google Code oder so. Jedoch will ich zuvor noch sicherstellen, dass die Installation keinen Schaden verursacht. Und damit meine ich, ich habe gerade keine Lust das zu machen 😛
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Was passiert eigentlich, wenn man von einem Programm mehr als eine Instanz laufen hat? Bspw. wenn zwei Firefox-Fenster offen sind?
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
Dann sollen sie vertikal maximiert nebeneinander gestellt werden; jedenfalls ist das bei mir so geplant; die Technik die dazu verwendet werden muss wird allerdings nicht wmctrl sein können.
Da ich den Firefox nicht nutze muss ich ihn allerdings erst installieren und schauen, wie er sich überhaubt verhält. Notfalls wird mit der jeweiligen PID gearbeiet werden. Generell sehe ich dabei aber keine große Schwierigkeit. Das positive an der PID-Methodee ist, dass sie mit jedem Programm funktionieren würde und da man Daemon-Prozesse ignorieren kann (und auch sollte) verwechselt das jeweilige Script die Anwendung nicht mit einem Hintergrundprozess.
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Übrigens kann
wmctrl -ax $app
nicht funktionieren, weil $app ein Parameter der Option -a sein muss, bei dieser Schreibweise aber ein Parameter von -x ist. Dreh das einfach mal um:
wmctrl -xa $app
Firefox sollte an dieser Stelle nur ein Beispiel sein. Allerdings vielleicht kein verkehrtes, weil alle Instanzen von Firefox die gleiche PID haben, während andere Programme durchaus eine eigene PID für jede Instanz haben. Mehrere Firefox-Fenster könnte man also nicht über die PID ansprechen, sondern müsste die dann anhand der WM_CLASS abgreifen und am ehsten durch eine Schleife über die WINDOW_ID mit Befehlen ansprechen. Beispielsweise alle Firefox-Fenster auf die zweite Arbeitsfläche verschieben:
| for w in $(wmctrl -lx | sed -n '/.Firefox / s/ .*//p'); do wmctrl -ir $w -t 1; done
|
Hat man einzelne PIDs für jede Instanz ist es etwas einfacher das Skript dynamisch aufzubauen, weil der Befehl für den Programmstart der gleiche Parameter ist um die PID abzugreifen:
| program=COMMAND
function move () {
winid=()
for p in $(pidof $program); do winid=( ${winid[*]} $(wmctrl -lp | sed -n "/$p/ s/ .*//p") ); done
for w in ${winid[*]}; do wmctrl -ir $w -t 1; done
}
$program &
$program &
move
|
Hoffe, das hilft hier irgendjemandem weiter.
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
mrkramps schrieb: Übrigens kann
wmctrl -ax $app
nicht funktionieren, weil $app ein Parameter der Option -a sein muss, bei dieser Schreibweise aber ein Parameter von -x ist. Dreh das einfach mal um:
wmctrl -xa $app
Mensch, Du hast natürlich Recht. So funktioniert es!
Firefox sollte an dieser Stelle nur ein Beispiel sein. Allerdings vielleicht kein verkehrtes, weil alle Instanzen von Firefox die gleiche PID haben, während andere Programme durchaus eine eigene PID für jede Instanz haben.
Ich selbst bin gerade etwas sehr auf Dmenu fixiert. Wenn ich die Zeilen um das Hervolen überarbeite, werde ich das nochmal aufgreifen!
|
grillparzer
(Themenstarter)
Anmeldungsdatum: 7. März 2010
Beiträge: 873
|
Hallo, eine Frage: Wo wird das Skript von Neuromatic (siehe unten) eigentlich abgelegt? In ~/.local/share/applications , wie HaCeMei hier schrieb? Hier hat HaCeMei ausserdem einen wichtigen Punkt angesprochen: Starter, die immer sichbar sind (wie z.B. beim Unity-Desktop). Leider sind die Notebooks für Unity zu alt. Also wäre super, wenn das Skript mit Panel- und Desktop-Starter gleichzeitig umgehen könnte.... (bitte nicht böse sein, wenn ich vielleicht was überlesen hab) Neuromatic schrieb: @HaCeMei Ich beschäftige mich zunächst nur mit zwei Instanzen, deswegen die einenartige Ausdrucksweise. ☺ [update] 1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
#focus.sh
#requires: wmctrl
#app > 1=prog name; 2=Window Class
app=( firefox Firefox )
if [[ -n $(pgrep ${app[0]}) ]]
then
$(wmctrl -ax ${app[1]})
else
exec ${app[0]}
fi
|
Gruß, grillparzer
|
HaCeMei
Anmeldungsdatum: 2. August 2010
Beiträge: 2262
|
grillparzer schrieb: Hallo, eine Frage: Wo wird das Skript von Neuromatic (siehe unten) eigentlich abgelegt? In ~/.local/share/applications , wie HaCeMei hier schrieb? Hier hat HaCeMei ausserdem einen wichtigen Punkt angesprochen: Starter, die immer sichbar sind (wie z.B. beim Unity-Desktop). Leider sind die Notebooks für Unity zu alt. Also wäre super, wenn das Skript mit Panel- und Desktop-Starter gleichzeitig umgehen könnte.... (bitte nicht böse sein, wenn ich vielleicht was überlesen hab)
Für den Einstieg in die Arbeit mit Skripten empfehle ich dir im Wiki den Artikel Bash-Skripting-Guide für Anfänger. Dass dir Skripte nahezu unbegrenzte Möglichkeiten eröffnen, erlebst du ja gerade in diesem Thread 😉. Unterscheide den Ort des Skripts und den Ort des *.desktop-Starters. Für deine persönlichen Skripte legst du am besten einen Ordner ~/bin oder ~/.local/bin an. Wenn du den Wikiartikel gelesen hast, weißt du, wie du den von dir gewählten Pfad exportierst, damit du auf die dort liegenden Skripte zugreifen kannst, auch wenn du dich gerade in einem anderen Verzeichnis befindest. Das Skript muss "ausführbar" gemacht werden, siehe chmod. In deinem Fall z.B. chmod +x /pfad/zum/skript.sh Etwas anderes sind die Starter, die sollten - wie schon geschrieben - in ~/.local/share/applications (möglich wäre auch /usr/share/applications/ , dann würden sie allen Nutzern zur Verfügung stehen). Dort wären Sudo-Rechte nötig. In der Desktopdatei in der Zeile Exec=/pfad/zum/skript.sh eintragen (absoluten Pfad beachten, *.desktop-Dateien müssen nicht ausführbar gemacht werden). Immer sichtbar im "Unity-Stil": Lxpanel > Rechtsklick > Neues Panel anlegen > Reiter "Geometrie" Position Links | Höhe 100% | Breite 40 Pixel | Symbolgröße 38 Pixel > Reiter "Erscheinungsbild" Durchgehend Farbe Deckkraft (nach Geschmack). Dann Rechtsklick auf das neue Panel > Paneleinträge hinzufügen > Hinzufügen > Anwendungsstartleiste > bearbeiten > aus dem Menü deine Starter wählen. Das war's schon 😛
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Dem Skript mit Dmenu sind 17 kleinere und größere Änderungen widerfahren (Version 0.4). Zu nennen ist:
Titel: Das Skript heißt nun bis auf Weiteres acti.sh . Backup: Bevor die App File durch das Skript editiert wird, wird ein Backup imselben Verzeichnis angelegt. Case sensitivity: Die Apps werden nun case sensitiv verarbeitet. Das Aktivieren des Windows betrifft dies noch nicht, das Editieren der App File und das Prozessstarten schon. Also auf Groß- und Kleinschreibung achten. N: In den Kommandos zum Editieren der App File können jetzt mehrere Apps angegeben werden. Beispiel: add vlc firefox emacs . edit: Es gibt den Befehl edit , der die App File in einem Editor öffnet. Dazu müssen die Variablen $_editor und $_visual gesetzt sein. CLI: Es besteht nun die Möglichkeit, einige Kommandos auf der Kommandozeile einzugeben. Dmenu wird nicht geöffnet.
Folgende Befehle gibt es nun:
in Dmenu [add|block|ign|del] APP edit
Command line [add|block|ign|del] APP edit cat print und print -fm
Beispiele:
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 |
$ acti.sh cat
claws-mail
emacs24-x
thunar
ign firefox
block qupzilla
$ acti.sh print
added claws-mail
added emacs24-x
added thunar
ignored firefox
blocked qupzilla
$ acti.sh add firefox qupzilla
App 'firefox' has been added!
App 'qupzilla' has been added!
$ acti.sh print -fm
STATUS APP
------------------
added claws-mail
added emacs24-x
added firefox
added qupzilla
added thunar
|
Als nächstes werde ich die Funktion _check() überarbeiten und sehen, was davon auf die Kommandozeile übertragen werden kann. Der Code: 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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239 | #!/bin/bash
#title :acti.sh
#description :
#authors :
#date :2013-11-02
#version :0.4
#usage :
#notes :requires dmenu, GNU sed, wmctrl, xdotool
#bash_version :
#===============================================================================
#
# For xft support to Dmenu you need to patch Dmenu. See http://tools.suckless.org/dmenu/patches/xft or https://bitbucket.org/melek/dmenu2. See also https://bitbucket.org/rafaelgg/slmenu.
#
# 1. First of all include minimum one App into the App File. You can mask lines with "block" or "ign". Example: "ign vlc". "block" means, that an App can not be started or activated; "ign" means, that an App can only be started, but can not be activated.
# 2. After that you can also edit the File in Dmenu with "[add|block|ign|del] APP " or "edit" (invokes your Editor and reads App File). Example: "add firefox vlc emacs" or "edit".
# 3. Further you may edit the App File on command line. Type "acti.sh [add|block|ign|del] APP". Example: "acti.sh add vlc firefox emacs". Command "edit" invokes your Editor. In addition you can type "cat" to print the raw App File or "print" and "print -fm", when you need a formatted App File.
# 4. Choose or enter any other App in Dmenu.
#
# Status Codes
# 0: Script finished!
# 1: "$app_file" is unset!
# 2: There is no App File!
# 3: Empty App File exists!
# 4: Bye, Bye! No App has been chosen.
# 5: App '$app' is blocked!
# 6: Could not activate Window!
# 7: Could not run App!
# 8: Command "$app" does not exist!
# (9: App '${app##* }' has already been edited!) deprecated
# 10: Could not run 'edit .'!
# 11: Could not print App File!
# 12: Could not print formatted App File!
# 13: Command '${0##*/} $1' is unknown!
#
# If status 6, try to replace 'w_id=$(wmctrl -lx | awk -v app_name="$app" 'BEGIN {IGNORECASE=1} app_name ~ /[a-z]/ && $0 ~ app_name {print $1}')' with 'w_id=$([[ "$app" == *[a-z]* ]] && { wmctrl -lx | grep -i "$app" | awk '{print $1}' ; })'.
#
#===============================================================================
#
# Feel free to fit these parameters into your position.
#
# App list. One App or command per line. Sequence is irrelevant. You can mask lines with "block" or "ign".
#app_file=$HOME/.config/acti/app_file
#
# Editors. You may run 'which APP' to exactly determine path.
_editor=$EDITOR
_visual=/usr/bin/geany
#
# Dmenu options. Comment out and see manpage of Dmenu for all of them.
#d_opt='-b -f -i -l 10'
#d_name='-name dmenu'
#d_class='-class dmenu'
#d_prompt='-p GO'
#d_h='-h 5'
#d_w='-w 1280'
#d_x='-x 0'
#d_y='-y 0'
#d_o='-o 1.0'
#d_dim='-dim 1.0'
#d_dc='-dc #000000'
#
declare -A d_color
#d_color["d_nb"]='-nb #2C2C2C'
#d_color["d_nf"]='-nf #DCDCCC'
#d_color["d_sb"]='-sb #DCDCCC'
#d_color["d_sf"]='-sf #2C2C2C'
#
# Preconfig. To find xft fonts on your system, you may run 'fc-list | cut -d' ' -f2- | sort | less'.
#d_fn="'Droid Sans Mono-9'"
#
# Commandline parameter.
pf_head="STATUS APP"
#===============================================================================
_exec_app() {
if command -v "$app" >/dev/null
then
exec "$app" 2>/dev/null || { echo 'Could not run App!' >&2 ; exit 7 ; }
else
{ echo "Command '$app' does not exist!" >&2 ; exit 8 ; }
fi
}
_check() {
if [ $(egrep -xc -e "(block).+$app" "$app_file") -gt 0 ]
then
{ echo "App '$app' is blocked!" >&2 ; exit 5 ; }
else
w_id=$(wmctrl -lx | awk -v app_name="$app" 'BEGIN {IGNORECASE=1} app_name ~ /[a-z]/ && $0 ~ app_name {print $1}')
fi
if [ $(egrep -xc -e "(ign).+$app" "$app_file") -gt 0 ]
then
{ echo "App '$app' is an ignore case!" >&2 ; _exec_app ; }
elif [ -n "$w_id" ]
then
xdotool windowactivate --sync "$w_id" 2>/dev/null || { echo 'Could not activate Window!' >&2 ; exit 6 ; }
else
_exec_app
fi
}
_app() {
export app=$(\
sed -e "/block[[:space:]]./d;s/ign //g" < "$app_file" |
sort -fg |
dmenu $d_opt $d_name $d_class $d_prompt $d_h $d_w $d_x $d_y $d_o $d_dim $d_dc \
${d_color[*]} -fn "${d_fn:='Droid Sans Mono-9'}")
}
_file() {
if [ -z "$app_file" ]
then
{ echo '"$app_file" is unset!' >&2 ; exit 1 ; }
elif [ ! -f "$app_file" ]
then
{ echo 'There is no App File!' >&2 ; exit 2 ; }
elif [ $(stat -c %s "$app_file" 2>/dev/null) -lt 2 ]
then
{ echo 'Empty App File exists!' >&2 ; exit 3 ; }
fi
}
_dmenu() {
case ${app%% *} in
add|block|ign|del)
_cli $app
;;
edit)
_cli "edit"
;;
*)
{ _check ; echo 'Script finished!' >&2 ; exit 0 ; }
;;
esac
}
_post_edit() {
{ { sort -k2 -f "$app_file" | uniq > "$app_file.$$" ; } && mv "$app_file.$$" "$app_file" ; }
}
_pre_edit() {
cp "$app_file" ""$app_file".backup"
}
_cli() {
case "$1" in
print)
pf_ext=$(sed "s/^/added /g;s#added block#blocked#g;s#added ign#ignored#g" < "$app_file")
if [ "$2" = -fm ]
then
pf_width=$(($(wc -L "$app_file" | awk '{print $1}')+4))
{ column -t -s " " <<< "${pf_head:-"K1 K2"}" ; printf '%*s\n' "${pf_width:-$(tput cols)}" '' | tr ' ' - ; }
{ echo "$pf_ext" | column -t -s " " ; } || { echo 'Could not print formatted App File!' >&2 ; exit 12 ; }
else
echo "$pf_ext" || { echo 'Could not print App File!' >&2 ; exit 11 ; }
fi
;;
cat)
cat "$app_file"
;;
edit)
{ exec "$_editor" "$app_file" || exec "$_visual" "$app_file" ; } 2>/dev/null || { echo 'Could not run 'edit .'!' >&2 ; exit 10 ; }
;;
del)
_pre_edit
shift
for a in "$@"
do
{ sed -i -e "/[block|ign][[:space:]]"$a"$/d" -e "/^"$a"$/d" "$app_file" && echo "App '$a' has been deleted!" >&2 ; }
done
_post_edit
;;
block)
_pre_edit
shift
for a in "$@"
do
{ sed -i -e "s#ign "$a"#block "$a"#g;t;$ i block $a" -e "/^"$a"$/d" "$app_file" && echo "Added App '$a' is blocked now!" >&2 ; }
done
_post_edit
;;
ign)
_pre_edit
shift
for a in "$@"
do
{ sed -i -e "s#block "$a"#ign "$a"#g;t;$ i ign $a" -e "/^"$a"$/d" "$app_file" && echo "Added App '$a' is ignored now!" >&2 ; }
done
_post_edit
;;
add)
_pre_edit
shift
for a in "$@"
do
{ sed -i -e "s/block "$a"$/"$a"/g;s/ign "$a"$/"$a"/g;t;$ i $a" "$app_file" && echo "App '$a' has been added!" >&2 ; }
done
_post_edit
;;
*)
{ echo "Command '${0##*/} $1' is unknown!" >&2 ; exit 13 ; }
;;
esac
}
#===============================================================================
case "$#" in
0)
shopt -s execfail
_file
_app
while [ -n "$app" ]
do
_dmenu
_file
_app
done
{ echo 'Bye, Bye! No App has been chosen.' >&2 ; exit 4 ; }
;;
*)
_file
_cli $*
;;
esac
|
- acti_0.4.sh (6.5 KiB)
- Download acti_0.4.sh
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Acti.sh ist jetzt einfach mal bei V 0.5 angekommen. Neu ist:
Es wird nun kein xdotool mehr gebraucht, nur noch wmctrl. Die Sed-Skripte sind überarbeitet. Wo es ging, wurde auf Sed umgestellt. Logfile ohne Datum (optional). "Error"-Nachrichten werden auch durch Xmessage ausgegeben (optional). Wer es vorzieht, dass das Xmessage-Fenster undekoriert ist, muss dies zusätzlich einrichten. Der Name/Titel des Fensters kann im Skript gesetzt werden (default "xmessage:acti"). Es dürfen jetzt auch mehrere Befehle zum Editieren der App File in einer Zeile angegeben werden. Beispiel: add vlc firefox del qupzilla ign emacs block thunar Es gibt einen neuen Befehl list , hinter dem sich wmctrl -lpx versteckt. Er ist auf der Kommandozeile möglich und in Dmenu. In Dmenu öffnet sich dann ein neues Menu, von wo aus jedes Fenster aktiviert werden kann. Die Funktion _check() ist überarbeitet. Falls eine App mehr als ein Fenster geöffnet hat, werden die Fenster jener App in einem neuen Dmenu gelistet und können ausgewählt werden.
In $HOME/.Xresources oder $HOME/.Xdefaults können diese für Xmessage angepassten Optionen eingetragen werden (danach X neustarten oder mit xrdb "reloaden"):
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 | !acti-------------------------------------------------------------------------------
!acti*geometry: 300x60
acti*center: true
acti*nearMouse: false
acti*printValue: false
acti*timeout: 3
!acti*maxHeight
!acti*maxWidth
acti*background: #2C2C2C
acti*foreground: #DCDCCC
acti*Font: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-*
!acti*borderWidth: 1
!acti*borderColor: black
acti*defaultButton: quit
acti*buttons: quit:0
acti*.Scrollbar: Never
!acti*Scrollbar.borderWidth: 0
!acti*Scrollbar.width: 0
acti*message.scrollVertical: Never
acti*message.scrollHorizontal: Never
!acti*message.background: #2C2C2C
!acti*message.foreground: #DCDCCC
!acti*message.borderColor: black
acti*message.borderWidth: 0
!acti*message.font: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-*
acti*Command.shapeStyle: rectangle
acti*Command.borderWidth: 0
!acti*Command.borderColor: black
!acti*Command.internalWidth: 1
!acti*Command.internalHeight: 3
acti*Command.highlightThickness: 1
!acti*Command.background: #2C2C2C
!acti*Command.foreground: #2C2C2C
|
Was ich noch machen möchte:
Config File, die in das Skipt eingelesen wird README Die Status-Codes überarbeiten und kompakter darstellen Die Möglichkeit bieten, Programme - wenn nötig - über ein Terminal auszuführen (also eine kleine Runner-Funktion) Vllt eine Art History File Logfile verbessern _check() überarbeiten und wmctrl besser integrieren. Den Gedanken von Neuromatic und mrkramps aufgreifen: Weitere Umgangsmöglichkeiten mit Apps, die mehr als ein Fenster offen haben.
Der Code:
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321 | #!/bin/bash
#title :acti.sh
#description :Activates the windows being managed by the window manager with Dmenu. Focus or exec an App.
#authors :
#date :2013-11-04
#version :0.5
#usage :
#notes :requires dmenu, GNU sed, wmctrl; optional: xmessage
#bash_version :
#===============================================================================
#
# For xft support to Dmenu you need to patch Dmenu. See http://tools.suckless.org/dmenu/patches/xft or https://bitbucket.org/melek/dmenu2. See also https://bitbucket.org/rafaelgg/slmenu.
#
# 1. First of all include minimum one App into the App File. You can mask lines with "block" or "ign". Example: "ign vlc". "block" means, that an App can not be started or activated; "ign" means, that an App can only be started, but can not be activated.
# 2. After that you can also edit the File in Dmenu with "[add|block|ign|del] APP". Command "edit" invokes your Editor and reads App File. Command "list" lists the windows being managed by the window manager. Examples: "add firefox vlc emacs" or "edit".
# 3. Further you may edit the App File on command line. Type "acti.sh [add|block|ign|del] APP". Example: "acti.sh add vlc firefox emacs". Command "edit" invokes your Editor; "lists" lists the managed windows. In addition you can type "cat" to print the raw App File or "print" and "print -fm", when you need a formatted App File.
# 4. If you want to, you may typ also several Commands in one line to edit the App File. Example: "add vlc firefox del qupzilla ign emacs block thunar" etc.
# 5. Choose or enter any other App in Dmenu. Is there more than one window of an App, Dmenu provides an second selection menu.
#
# Status Codes
# 0: Script finished!
# 1: App File is unset!
# 2: There is no App File!
# 3: Empty App File exists!
# 4: Bye, Bye! No App has been chosen.
# 5: App '$app' is blocked!
# 6: Could not activate Window!
# 7: Could not run App!
# 8: Command "$app" does not exist!
# (9: App '${app##* }' has already been edited!) deprecated
# 10: Could not run 'edit .'!
# 11: Could not print App File!
# 12: Could not print formatted App File!
# 13: Command '${0##*/} $1' is unknown!
# 14: Could not create Backup File!
#
#===============================================================================
#
# Feel free to fit these parameters into your position. You NEED TO SET "$app_file" and "$backup_file".
#
# App list. One App per line. Sequence is irrelevant. You can mask lines with "block" or "ign".
#app_file=$HOME/.config/acti/app_file #needed
#
# Backup File.
#backup_file=$HOME/.config/acti/app_file.backup #needed
#
# Editors. You may run 'which APP' to exactly determine path.
#_editor=$EDITOR
#_visual=/usr/bin/geany
#
# Dmenu options. Comment out and see manpage of Dmenu for all of them.
#d_opt='-b -f -i -l 10'
#d_name='-name dmenu'
#d_class='-class dmenu'
#d_prompt='-p GO'
#d_h='-h 5'
#d_w='-w 1280'
#d_x='-x 0'
#d_y='-y 0'
#d_o='-o 1.0'
#d_dim='-dim 1.0'
#d_dc='-dc #000000'
#
declare -A d_color #needed
#d_color["d_nb"]='-nb #2C2C2C'
#d_color["d_nf"]='-nf #DCDCCC'
#d_color["d_sb"]='-sb #DCDCCC'
#d_color["d_sf"]='-sf #2C2C2C'
#
# Preconfig. To find xft fonts on your system, you may run 'fc-list | cut -d' ' -f2- | sort | less'.
#d_fn="'Droid Sans Mono-9'"
#
# Xmessage.
#xm_echo="| tee >(xmessage -title "xmessage:acti" -name "acti" -file -)"
#
# You can put these options below (without hash keys) into $HOME/.Xresources or $HOME/.Xdefaults to edit settings of Xmessage. Then restart X or type "xrdb ~/.Xresources". Maybe you prefer to undecorate the Xmessage Window. The default name/title is "xmessage:acti".
# !acti-------------------------------------------------------------------------------
# !acti*geometry: 300x60
# acti*center: true
# acti*nearMouse: false
# acti*printValue: false
# acti*timeout: 3
# !acti*maxHeight
# !acti*maxWidth
# acti*background: #2C2C2C
# acti*foreground: #DCDCCC
# acti*Font: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-*
# !acti*borderWidth: 1
# !acti*borderColor: black
#
# acti*defaultButton: quit
# acti*buttons: quit:0
#
# acti*.Scrollbar: Never
# !acti*Scrollbar.borderWidth: 0
# !acti*Scrollbar.width: 0
#
# acti*message.scrollVertical: Never
# acti*message.scrollHorizontal: Never
# !acti*message.background: #2C2C2C
# !acti*message.foreground: #DCDCCC
# !acti*message.borderColor: black
# acti*message.borderWidth: 0
#!acti*message.font: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-*
#
# acti*Command.shapeStyle: rectangle
# acti*Command.borderWidth: 0
# !acti*Command.borderColor: black
# !acti*Command.internalWidth: 1
# !acti*Command.internalHeight: 3
# acti*Command.highlightThickness: 1
# !acti*Command.background: #2C2C2C
# !acti*Command.foreground: #2C2C2C
#
# Logfile.
#log_file=$HOME/.config/acti/app_file.log
log_echo="| tee -a "$log_file"" #needed
#
# Commandline parameter.
#
# This is the header of output, when you type "print -fm" on command line.
#pf_head="STATUS APP"
#===============================================================================
_exec_app() {
if command -v "$app" >/dev/null
then
eval "exec "$app"" 2>/dev/null || { eval echo '7: Could not run App!' "$log_echo" "$xm_echo" >&2 ; exit 7 ; }
else
{ eval echo "8: Command '$app' does not exist!" "$log_echo" "$xm_echo" >&2 ; exit 8 ; }
fi
}
_check() {
[ $(egrep -xc -e "(block).+$app" "$app_file") -gt 0 ] && { eval echo "5: App '$app' is blocked!" "$log_echo" "$xm_echo" >&2 ; exit 5 ; }
[ $(egrep -xc -e "(ign).+$app" "$app_file") -gt 0 ] && { eval echo "App '$app' is an ignore case!" "$log_echo" >&2 ; _exec_app ; }
w_l="$(wmctrl -lpx | sed -rn "/( "$app"\.|\."$app" )/I p")"
if [ "$(sed -n '$=' <<< "$w_l")" -ge 2 ]
then
w_id=$(\
dmenu $d_opt $d_name $d_class $d_prompt $d_h $d_w $d_x $d_y $d_o $d_dim $d_dc \
${d_color[*]} -fn "${d_fn:='Droid Sans Mono-9'}" <<< "$w_l" |
sed -n "s/ .*//p")
[ -z "$w_id" ] && { eval echo '4: Bye, Bye! No App has been chosen.' "$log_echo" >&2 ; exit 4 ; }
else
w_id=$(sed -n "s/ .*//p" <<< "$w_l")
fi
if [ -n "$w_id" ]
then
wmctrl -i -a "$w_id" 2>/dev/null || { eval echo '6: Could not activate Window!' "$log_echo" "$xm_echo" >&2 ; exit 6 ; }
else
_exec_app
fi
}
_app() {
export app=$(\
sed -r -e "/^\<block\> /d" -e "s/^\<ign\> //g" < "$app_file" |
sort -fg |
dmenu $d_opt $d_name $d_class $d_prompt $d_h $d_w $d_x $d_y $d_o $d_dim $d_dc \
${d_color[*]} -fn "${d_fn:='Droid Sans Mono-9'}")
}
_file() {
if [ -z "$app_file" ]
then
{ eval echo "1: App File is unset!" "$log_echo" "$xm_echo" >&2 ; exit 1 ; }
elif [ ! -f "$app_file" ]
then
{ eval echo '2: There is no App File!' "$log_echo" "$xm_echo" >&2 ; exit 2 ; }
elif [ $(stat -c %s "$app_file" 2>/dev/null) -lt 2 ]
then
{ eval echo '3: Empty App File exists!' "$log_echo" "$xm_echo" >&2 ; exit 3 ; }
fi
}
_dmenu() {
case ${app%% *} in
add|block|ign|del)
_cli $app
;;
edit)
_cli "edit"
;;
list)
{ wmctrl -i -a "$(wmctrl -lpx | dmenu $d_opt $d_name $d_class $d_prompt $d_h $d_w $d_x $d_y $d_o $d_dim $d_dc ${d_color[*]} -fn "${d_fn:='Droid Sans Mono-9'}")" 2>/dev/null && break ; } || { eval echo '6: Could not activate Window!' "$log_echo" "$xm_echo" >&2 ; exit 6 ; }
;;
*)
{ _check ; eval echo '0: Script finished!' "$log_echo" >&2 ; exit 0 ; }
;;
esac
}
_post_edit() {
{ sort -k2 -f "$app_file" | uniq > "$app_file.$$" ; } && mv "$app_file.$$" "$app_file"
}
_pre_edit() {
cp "$app_file" "$backup_file" 2>/dev/null || { eval echo '14: Could not create Backup File!' "$log_echo" "$xm_echo" >&2 ; exit 14 ; }
}
_cli() {
while [ $# -ne 0 ]
do
case "$1" in
print)
pf_ext=$(sed -r -e "/^(block |ign )/! s/^/added /g" -e "s#^\<block\>#&ed#g" -e "s#^\<ign\>#&ored#g" < "$app_file")
case "$2" in
-fm)
{
pf_width=$(($(wc -L "$app_file" | sed 's/ .*//')+9)) &&
column -t <<< "${pf_head:-"K1 K2"}" &&
printf '%*s\n' "${pf_width:-$(tput cols)}" '' | tr ' ' - &&
column -t <<< "$pf_ext"
} || { eval echo '12: Could not print formatted App File!' "$log_echo" >&2 ; exit 12 ; }
break
;;
esac
{ sed -n 'p' <<< "$pf_ext" && return 0 ; } || { eval echo '11: Could not print App File!' "$log_echo" >&2 ; exit 11 ; }
;;
cat)
{ sed -n 'p' "$app_file" && return 0 ; }
;;
list)
{ wmctrl -lpx && return 0 ; }
;;
edit)
{ eval exec "$_editor" "$app_file" || eval exec "$_visual" "$app_file" ; } 2>/dev/null && return 0 || { eval echo '10: Could not run 'edit .'!' "$log_echo" "$xm_echo" >&2 ; exit 10 ; }
;;
del)
_pre_edit
shift
for a in "$@"
do
{ [[ "$a" =~ (add|block|ign) ]] && break ; }
{ sed -ri -e "/^(\<block\> |\<ign\> |\<"$a"\>)(\<"$a"\>|)$/d" "$app_file" && eval echo "App '$a' has been deleted!" "$log_echo" >&2 ; }
shift
done
_post_edit
;;
block)
_pre_edit
shift
for a in "$@"
do
{ [[ "$a" =~ (add|del|ign) ]] && break ; }
{ sed -ri -e "s/^(ign \<"$a"\>)$/block "$a"/g;t;$ i block $a" -e "/^\<"$a"\>$/d" "$app_file" && eval echo "Added App '$a' is blocked now!" "$log_echo" >&2 ; }
shift
done
_post_edit
;;
ign)
_pre_edit
shift
for a in "$@"
do
{ [[ "$a" =~ (add|block|del) ]] && break ; }
{ sed -ri -e "s/^(block \<"$a"\>)$/ign "$a"/g;t;$ i ign $a" -e "/^\<"$a"\>$/d" "$app_file" && eval echo "Added App '$a' is ignored now!" "$log_echo" >&2 ; }
shift
done
_post_edit
;;
add)
_pre_edit
shift
for a in "$@"
do
{ [[ "$a" =~ (del|block|ign) ]] && break ; }
{ sed -ri -e "$ i $a" -e "/^(\<block\> |\<ign\> )(\<"$a"\>)$/d" "$app_file" && eval echo "App '$a' has been added!" "$log_echo" >&2 ; }
shift
done
_post_edit
;;
*)
{ eval echo "13: Command '${0##*/} $1' is unknown!" "$log_echo" >&2 ; exit 13 ; }
;;
esac
done
}
#===============================================================================
shopt -s execfail
case "$#" in
0)
_file
_app
while [ -n "$app" ]
do
_dmenu
_file
_app
done
{ eval echo '4: Bye, Bye! No App has been chosen.' "$log_echo" >&2 ; exit 4 ; }
;;
*)
_file
_cli $*
;;
esac
|
- acti_0.5.sh (10.5 KiB)
- Download acti_0.5.sh
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
Bei diesem Umfang wäre es vielleicht sinnvoll auf eine README zu verzichten und stattdessen eine manpage zu schreiben.
|
grillparzer
(Themenstarter)
Anmeldungsdatum: 7. März 2010
Beiträge: 873
|
Danke HaCeMei für Deine Antwort. Und danke natürlich auch an alle anderen, die sich hier beteiligen. Ich lese fleißig mit.... 😉 Liebe Grüße grillparzer
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Aufgepasst! In acti.sh hat sich folgendes getan: Der Befehl list ist überarbeitet und in die Funktion _check() integriert. Es ist nun nicht mehr möglich, die Probe auf ign und block zu umgehen. Es gibt einen neuen Befehl mit dem Namen term (nicht für die Kommandozeile). Er öffnet eine App in einem Terminal. Die neue Variable dafür heißt _term . Beispiel: term task . Die Funktion _check() ist überabeitet und ein Teil von ihr in die neue Funktion _wm() ausgelagert. Acti hat nun die Fähigkeit, alle Fenster einer APP auf einmal in der Größe zu verändern und/oder sie zu bewegen. Dazu habe ich "GRID MODE" und "MAX mode" aus wmtiler adaptiert. Sobald eine APP mehr als ein Fenster offen hat, öffnet sich ein zweites Dmenu, in dem alle Fenster der APP auf allen Desktops einzeln aktiviert werden können (nach wie vor mit wmctrl -a ) oder einer der folgenden Befehle eingegeben/ausgewählt werden können: GRID_HORIZONTAL GRID_VERTICAL MAXIMIZE CLOSE_ALL MV_TO_DESKTOP CYCLE
Wird MV_TO_DESKTOP gewählt, öffnet sich ein drittes Dmenu, in dem MV_AND_SWITCH_TO oder MV_TO_BUT_STAY ausgewählt werden können. Beispiel: MV_AND_SWITCH_TO 1 . CYCLE verändert die Reihenfolge der Liste aus wmctrl -l und führt dazu, dass die Fenster der APP umgeordnet werden. Für die Größen habe ich aus wmtiler diese Variablen übernommen: TOP_MARGIN, BOTTOM_MARGIN, LEFT_MARGIN, RIGHT_MARGIN, TITLE_BAR_HEIGHT. Beispiel: Ich tippe "thunar" in Dmenu ein. Dann öffnet sich ein zweites Dmenu, weil thunar drei maximierte Fenster auf Desktop 0 und ein viertes auf Desktop 1 offen hat, von denen derzeit eins auf Desktop 0 aktiviert ist und "oben" liegt. Mit GRID_VERTICAL teile ich diese drei Fenster auf Desktop 0. Möchte ich, dass die Reihenfolge verändert wird, wähle ich CYCLE und dann wieder GRID_VERTICAL. Die Fensteranordnung ist diegleiche, aber jedes Fenster ist im Uhrzeigersinn um eine "Zelle" weitergerückt. Das vormals letzte Fenster ist nun an erste Stelle (oben links) gerückt und das erste Fenster an die zweite Position. Jetzt möchte ich alle APP-Fenster in dieser exakten Anordnung auf den nächsten Dekstop verschieben. Dazu wähle ich MV_TO_DESKTOP und danach MV_AND_SWITCH_TO 1. Dort angekommen, wähle ich GRID_VERTICAL und sehe, dass nun auch das vierte Fenster von thunar angeordet ist. Schließlich wähle ich aus Spaß nochmal MAXIMIZE, wobei das zuletzt aktivierte Fenster nun (maximiert) oben liegt, und danach CLOSE_ALL. Alle Fenster von thunar sind nun geschlossen.
- acti_0.6.sh (18.7 KiB)
- Download acti_0.6.sh
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
Ich habe in den letzen Tagen viel zutun gehabt, deswegen die Inaktivität. Das Konzept meines Scriptes hat sich ein wenig geändert, deswegen habe ich es komplett neu geschrieben. Es funktioniert mittels einer rules Datei.
Diese soll in dem Verzeichnis ~/.config/focus/ liegen.
Diese sieht etwas so aus. ignore urxvtc
sticky xclock
fullscreen firefox
hide pcmanfm Der Code wurde auf ~50 Zeilen reduziert.
Ist eine gegebene Anwengung nicht in dieser Datei, funktioniert das Script wie es ursprünglich gewünscht war.
In der Datei ~/.config/focus/config gibt es drei Variablen. Die erste ist use_fix_app. Steht diese auf "1" kann in den anderen beiden ein Programm fixiert werden. Ist dies der Fall, dann wird immer dieses Programm verarbeitet. Ich habe mich von dem Gedanken entfern mehrere Anwendungen nebeneinander stellen zu wollen, denn wenn man Tiling will, kann man sich einen entsprechenden WM installieren, oder diverse Scripte nutzen, wobei ein richtiger Windowmanager wahrscheinlich besser wäre. Das Script ist simpler geworden und wird von Funktionen dominiert. Dies hier soll das erste Release darstellen. Es gibt dazu ein install.sh und eine manpage. install.sh muss in dem selben Verzeichnis wie focus.tar.gz liegen. Da ich vermutlich nichts von dem was ich ursprünglich geplant habe tatsächlich implementiert habe, werde ich in Zukunft auf Release-Pläne verzichten 😛 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 | #!/bin/bash
# focus.sh
# requires: wmctrl
# app > focus appname windowclass
rules_file=$HOME/.config/focus/rules
source $HOME/.config/focus/config
# functions
#activate client with given name
function activate() {
wmctrl -xa ${app[1]}
}
#use defined STARG
function use() {
wmctrl -r :ACTIVE: -b add,"$rule_check"
}
#function to read users config
function check_rules() {
rule_check=$(grep ${app[0]} $rules_file | awk '{ print $1 }')
if [[ $rule_check == "ignore" ]]; then
exit 1
elif [[ $rule_check == "sticky" ]]; then
$(activate) && $(use)
exit 0
elif [[ $rule_check == "hidden" ]]; then
$(activate) && $(use)
exit 0
elif [[ $rule_check == "fullscreen" ]]; then
$(activate) && $(use)
exit 0
else
$(activate) || $(exec ${app[0]})
exit 0
fi
}
if [[ $use_fix_app == "1" ]]; then
app=( "$fix_app_name" "$fix_app_wm" )
else
app=( $1 $2 )
fi
$(check_rules)
exit 0
|
- focus.tar.gz (20.0 KiB)
- Download focus.tar.gz
- install.sh (617 Bytes)
- Download install.sh
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
So. Ich habe nur ein paar Kleinigkeiten verändert. Es gibt jetzt eine Manpage und eine Config File.
- acti_0.6.6.tar.gz (8.1 KiB)
- Download acti_0.6.6.tar.gz
|