• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

AppleScript für Fenstermanagement

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Hi!

Zu aller erst möchte ich mal sagen, dass ich bei weitem kein AppleScript Guru bin, eher als Anfänger einzuordnen.
Ich will endlich mal ein bisschen automatische Fensterpositionierung haben, wie z.B. die Programme Cinch oder Divvy das machen.
Also dachte mir, dass man so ein ähnliches Fenstermanagement, zumindest vorerst für den Finder, bestimmt auch mit AppleScript erledigen könnte. So hab ich mal ein AppleScript geschrieben, das tatsächlich zu funktionieren scheint... ;)

Code:
-- ordnet 2 Finderfenster am oberen Rand an
-- für eine Auflösung von 1920x1200
set screen_width to 1920
set screen_height to 1200
set dock_height to 150 -- mit etwas Freiraum
set margin_west to 150 -- Seitenabstand links
set margin_east to 230 -- Seitenabstand rechts

-- Maße für Fenster 
set finder_width to (screen_width - (margin_west + margin_east)) / 2
set finder_height to ((screen_height - dock_height) / 2)

tell application "Finder"
	
	--  kein Finderfenster vorhanden
	if not (the first window exists) then
		
		set window1 to make new Finder window
		set sidebar width of window1 to 100
		set the target of window1 to (folder (path to home folder))
		set the bounds of window1 to {margin_west, 0, margin_west + finder_width, finder_height}
		
		set window2 to make new Finder window
		set the target of window2 to (folder (path to home folder))
		set the bounds of window2 to {margin_west + finder_width, 0, margin_west + finder_width * 2, finder_height}
		
		-- ein Finderfenster vorhanden
	else if not (the second window exists) then
		
		set the bounds of the first window to {margin_west, 0, margin_west + finder_width, finder_height}
		set window3 to make new Finder window
		set the target of window3 to (folder (path to home folder))
		set the bounds of window3 to {margin_west + finder_width, 0, margin_west + finder_width * 2, finder_height}
		
		-- beide vorhanden
	else
		set the bounds of the first window to {margin_west, 0, margin_west + finder_width, finder_height}
		set the bounds of the second window to {margin_west + finder_width, 0, margin_west + finder_width * 2, finder_height}
	end if
	activate
end tell

Jetzt geht es mir dabei vor allem um die Performance, d.h. wie führt man das Teil möglichst schnell aus?

Ich hab es schon als Service probiert - zu langsam. Als Applikation gespeichert - schon schneller, aber wie startet man diese möglichst schnell und wenn es geht per Shortcut ? Das Teil ins Dock legen will ich auch nicht und Spotlight is auch nich so mein Ding.

Daher bin ich für alle Arten von Verbesserungsvorschlägen dankbar, d.h. falls No-Gos drin sind, gravierende Fehler oder einfach nicht performante Befehle. Auch Tipps zum AppleScript Stil oder wie ich die Applikation möglichst schnell starte wären sehr hilfreich.

Danke und Gruß,
Guy.brush
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
@geschwindigkeit: hast schon mit osascript ausführen aus der kommandozeile versucht? als text oder scpt gespeichert... (würde mal beides versuchen)

Code:
osascript deinscript.applescript
(text)

oder
Code:
osascript deinscript.scpt
(scpt)


@auführen per shortcut
Benutzt du irgendetwas wie keyboardmaestro oder quicksilver oder sowas? damit wäre es ein einfaches das zu bewerkstelligen.
BetterTouchTool kann das übrigens auch (also irgendwas ausführen auf tastenkombi). Dann fällt aber osascript aus, allerdings kann es scpt's ausführen...

ah das wäre vielleicht noch ein tipp zum testen für die performance:
im applescripteditor, in den preferences, mach dir mal das script menü an. dann speicherst du dein script als scpt un legst es in ~/Library/Scripts ab und führst es dann über das scriptmenü aus.
 

Anhänge

  • 2008_2010-07-27_2008.png
    2008_2010-07-27_2008.png
    67,2 KB · Aufrufe: 123
  • 2011_2010-07-27_2011.png
    2011_2010-07-27_2011.png
    48 KB · Aufrufe: 385
  • Like
Reaktionen: Guy.brush

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
@geschwindigkeit: hast schon mit osascript ausführen aus der kommandozeile versucht? als text oder scpt gespeichert... (würde mal beides versuchen)
Ja, das geht schon sehr fix, aber wie startet man das am besten? das Terminal hab ich ja nicht immer auf.

@auführen per shortcut
Benutzt du irgendetwas wie keyboardmaestro oder quicksilver oder sowas? damit wäre es ein einfaches das zu bewerkstelligen.
Ja, tatsächlich Alfred kann das (sowohl per default Suche als auch mit dem "run" Command) und auch nicht gerade langsam, daran kann ich mich glaub ich gewöhnen. Aber Shortcut wär evtl. noch besser.

Danke derweil. :)
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
hmm ich hab mir grad alfred angeguckt... der kann das nicht, was ich meinte.

haste nicht ne magic mouse oder so und hast lust auf bettertouchtool? damit könntest du es tatsächlich mit einer tastenkombi ausführen. oder eben quicksilver, keyboarmaestro oder... ähm... da gabs noch eins... moment.. ahc da gibts mehrere. buttler kannd as wohl auch. quickkeys ist für solche dinge auch sehr geil, aber auch sehr teuer.

ich hab lange quicksilver benutzt, um genau das zu machen, was du vorhast, also skripte und wasweißich mit nem keystroke zu versehen, war aber mit quicksilver dann irgendwann unzufrieden, weil es mir u.a. mehr als einmal meine mühsam konfigurierten actions gelöscht hat und bin zu keyboardmaestro gewechselt. ist zwar auch nicht günstig, aber ich habs's nie bereut. ich könnte ohne nicht leben ;)

quickkeys ist aber noch ein tick geiler, finde ich, aber auch teurer... naja, kommt auch drauf an für was.

quicksilver, kennst du ja bestimmt, würde dir das, was alfred anbietet, auch zur verfügung stellen + shortcuts wie du es dir wünschst, allerdings ist die usability, imho, verglichen mit keyboard maestro und quickkeys, fürn po - leider.

ja weiß nicht, die zuverlässigen, die ich kenne, sind die teuren und um nur dieses eine script damit auszuführen (dabei bleibts aber nicht, wenn du sowas erstmal hast ;)), ist es ein bisschen mit kanonen auf spatzen geschossen... du weißt schon...
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
hast du eigentlich schon folgendes mit den services versucht?

1. service ohne input, führt ein shellscript aus mit inhalt
osascript /kompletter/pfad/zu/deinem/script.scpt

2. service ohne input, führt ein apfelscript aus mit deinem script als inhalt

denen kannst du ja dann ein shortcut zuweisen... und vielleicht ist es dann trotzdem schnell genug...
 

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
hast du eigentlich schon folgendes mit den services versucht?

1. service ohne input, führt ein shellscript aus mit inhalt
osascript /kompletter/pfad/zu/deinem/script.scpt

2. service ohne input, führt ein apfelscript aus mit deinem script als inhalt

denen kannst du ja dann ein shortcut zuweisen... und vielleicht ist es dann trotzdem schnell genug...

Gut, dass du mich nochmal daran erinnerst! Es klappt! :-D
Das Problem war, dass ich das Script zuerst noch mit einem GUI Auswahl-Dialog verknüpft hatte, was den Service wohl um einiges verlangsamt hat. Nummer 1 bringt zwar nen Fehler, aber 2. funktioniert jetzt super und auch in angenehmer Zeit!

Hier meine Script-Variationen, mit denen ich nun (vorerst) wunschlos glücklich bin:

Code:
-- Split Finder vertical Script Version 1.0
-- ordnet 2 Finderfenster vertikal mit voller Höhe an

-- für eine Auflösung von 1920x1200
set screen_width to 1920
set screen_height to 1200
set dock_height to 150 -- mit etwas Freiraum
set margin_west to 150 -- Seitenabstand links
set margin_east to 230 -- Seitenabstand rechts

-- Maße für Fenster 
set finder_width to (screen_width - (margin_west + margin_east)) / 2
set finder_height to ((screen_height - dock_height))

tell application "Finder"
	
	--  kein Finderfenster vorhanden
	if not (the first window exists) then
		
		set window1 to make new Finder window
		set sidebar width of window1 to 100
		set the target of window1 to (folder (path to home folder))
		set the bounds of window1 to {margin_west, 0, margin_west + finder_width, finder_height}
		
		set window2 to make new Finder window
		set the target of window2 to (folder (path to home folder))
		set the bounds of window2 to {margin_west + finder_width, 0, margin_west + finder_width * 2, finder_height}
		
		-- ein Finderfenster vorhanden
	else if not (the second window exists) then
		
		set the bounds of the first window to {margin_west, 0, margin_west + finder_width, finder_height}
		set window3 to make new Finder window
		set the target of window3 to (folder (path to home folder))
		set the bounds of window3 to {margin_west + finder_width, 0, margin_west + finder_width * 2, finder_height}
		
		-- beide vorhanden
	else
		set the bounds of the first window to {margin_west, 0, margin_west + finder_width, finder_height}
		set the bounds of the second window to {margin_west + finder_width, 0, margin_west + finder_width * 2, finder_height}
	end if
	activate
end tell

Das Script aus dem 1. Post mach übrigens das selbe, nur mit halber Finder Höhe...

Code:
-- Split Finder horizontal Version 1.0
-- ordnet 2 Finderfenster horizontal mit voller Breite an

-- für eine Auflösung von 1920x1200
set screen_width to 1920
set screen_height to 1200
set dock_height to 150 -- mit etwas Freiraum
set margin_west to 150 -- Seitenabstand links
set margin_east to 230 -- Seitenabstand rechts
set pitch to 75 -- Abstand für Menüleisten

-- Maße für Fenster 
set finder_width to (screen_width - (margin_west + margin_east))
set finder_height to ((screen_height - dock_height - pitch) / 2)

tell application "Finder"
	
	--  kein Finderfenster vorhanden
	if not (the first window exists) then
		
		set window1 to make new Finder window
		set sidebar width of window1 to 100
		set the target of window1 to (folder (path to home folder))
		set the bounds of window1 to {margin_west, 0, margin_west + finder_width, finder_height}
		
		set window2 to make new Finder window
		set the target of window2 to (folder (path to home folder))
		set the bounds of window2 to {margin_west, finder_height + pitch, margin_west + finder_width, finder_height * 2 + pitch}
		
		-- ein Finderfenster vorhanden
	else if not (the second window exists) then
		
		set the bounds of the first window to {margin_west, 0, margin_west + finder_width, finder_height}
		set window3 to make new Finder window
		set the target of window3 to (folder (path to home folder))
		set the bounds of window3 to {margin_west, finder_height + pitch, margin_west + finder_width, finder_height * 2 + pitch}
		
		-- beide vorhanden
	else
		set the bounds of the first window to {margin_west, 0, margin_west + finder_width, finder_height}
		set the bounds of the second window to {margin_west, finder_height + pitch, margin_west + finder_width, finder_height * 2 + pitch}
	end if
	activate
end tell


Code:
-- CenterFinder Version 1.0
-- zentriert das Finderfenster

-- für eine Auflösung von 1920x1200
set screen_width to 1920
set screen_height to 1200
set dock_height to 150 -- mit etwas Freiraum
set pitch to 230 -- zusätzlicher Abstand

-- Maße für Fenster 
set finder_width to (screen_width - pitch) / 2
set finder_height to (screen_height - dock_height) / 2

tell application "Finder"
	
	--  kein Finderfenster vorhanden
	if not (the first window exists) then
		
		set window1 to make new Finder window
		set sidebar width of window1 to 100
		set the target of window1 to (folder (path to home folder))
		set the bounds of window1 to {(screen_width - finder_width) / 2, (screen_height - finder_height) / 2, (screen_width + finder_width) / 2, (screen_height + finder_height) / 2}
		
		-- ein Finderfenster vorhanden
	else
		set the bounds of the first window to {(screen_width - finder_width) / 2, (screen_height - finder_height) / 2, (screen_width + finder_width) / 2, (screen_height + finder_height) / 2}
	end if
	activate
end tell

Alle einzeln als Service mit Aktion "Run AppleScript" gespeichert und mit Shortcuts versehen. Mir gefällts.

Es gibt bestimmt noch mehr nützliche Fensterarrangements.
Danke nochmal. :-D
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo!

Ich habe mal kurz über die Skripte geschaut und mir sind 2 Dinge aufgefallen:
• Der Finder zählt ein wenig anders, als andere Programme: der kleinste mögliche Wert der y Achse ist dort 44 ( = Höhe der Menüleiste) und nicht 0.
set sidebar width of window1 to 100 -- Seit 10.5 geht dieser Wert schon nicht mehr und dürfte dazu führen, dass deine Fenster ohne Toolbar geöffnet werden.


Gruß
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Guy.brush

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Hehe, Danke, ja das dachte ich mir schon, dass da was komisch läuft mit den Abständen, ich hab dann immer irgendwelche Pseudo-Abstände eingeführt, damit das dann einigermaßen hin haut. Ich verbesser es, wenn ich wieder Zeit und Lust hab.

Zu der Sidebar: Als ich den Befehl nicht drin hatte, hab ich bemerkt, dass die Sidebar in neuen Finderfenstern immer zu breit war. Mit dem Befehl wars besser und ich kann auch keinen Nachteil entdecken, es ist alles wo es sein sollte. o_O

Hab mal eben ein Video erstellt:

[video=youtube;TigoUj5ebPI]http://www.youtube.com/watch?v=TigoUj5ebPI[/video]
 
Zuletzt bearbeitet:

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Also das mit der "0" wird quasi automatisch "korrigiert". Ist also nur ein halber Fehler.
Und zur Sidebar: Ok. Wenn es denn so funktionert... Ich glaube, dass 135 der kleinste mögliche Wert ist.

Gruß
 

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Ok, ich hab noch eines geschrieben, diesmal für alle aktiven Apps. Allerdings muss man feststellen, dass es nicht mit allen Apps klarkommt, siehe Script Kommentar, was wohl schon ein großes Manko ist. Aber für die wirklich wichtigen Apps funktioniert es.

Es ordnet die Applikationen auf folgende Weise an (die Nummer ist die Anzahl der aktiven Applikationen):

(0) Nichts
(1) Zentriere Fenster (oder alternativ: Vollbild)
(2) Vertikal halbierter Screen, beide Apps mit voller Screen Höhe
(3) Vertikal halbierter Screen, eine Seite zusätzlich horizontal halbiert, eine App hat volle Höhe, 2 halbe Höhe
(4) Vertikal und horizontal halbierter Screen, 4 gleich große Fenster mit halber Breite und Höhe
(5) Nichts
...

Die Applikationen, bei denen die Darstellung überhaupt nicht klappt, werden rausgefiltert (z.B. iTunes, Firefox, Thunderbird, Preview).

Hier das Script:

Code:
-- Arrange Windows Script Version 1.3.1
-- Script ordnet Fenster automatisch am Bildschirm an (funktioniert nur für sichtbare Fenster, d.h. nicht für ausgeblendete oder minimierte), entworfen für Dock am unteren Rand
-- erfolgreich getestet mit: Safari, Mail, Finder, Fraise, iCal, QuickTime Player, VLC, Pages, Keynote, AppleScript Editor
-- funktioniert nicht mit: Firefox, Thunderbird, Preview, iTunes, Adium
-- Wackelkandidaten: Automator, Terminal, EyeTV, Numbers, Xcode

global screen_width, screen_height, margin_west, margin_east, split_height, split_width, menubar_height, appList, dock_height

-- für eine Auflösung von 1920x1200
set screen_width to 1920
set screen_height to 1200
set menubar_height to 44
set dock_height to 150 -- mit etwas Freiraum

-- Seitenabstand, für fullscreen beides auf 0 setzen
set margin_west to 50
set margin_east to 50

-- Maße für Fenster
set split_width to (screen_width - (margin_west + margin_east)) / 2
set split_height to (screen_height - dock_height) / 2

-- Apps, deren Fenster möglichst das größte sein sollte (für 3 Fenster) -> konflikt bei mehreren
set priorityAppList to {"Safari", "Pages"}

-- diese Programme werden vom Fenstermanagement ausgeschlossen
set badAppList to {"iTunes", "firefox-bin", "thunderbird-bin", "Preview", "Adium"}

set activeAppList to {}
-- aktive Programme bestimmen
tell application "Finder"
	set activeAppList to (get the name of every process whose visible is true)
	
	-- Finderfenster entfernen, wenn nicht geöffnet
	if not (the first window exists) then
		rest of activeAppList
		set activeAppList to items 2 thru -1 of activeAppList
	end if
end tell

-- Anzahl der active_apps
set counter to 0
set counter to count of items of activeAppList

set appList to {}

-- Apps herausfiltern (badApps, Apps ohne Priorität) 
repeat with i from 1 to counter
	set element to item i of activeAppList
	if ((element is not in appList) and (element is not in priorityAppList) and (element is not in badAppList)) then
		set appList's end to element
	else if (element is in badAppList) then
		set counter to counter - 1
	end if
end repeat

-- priority Apps am Ender der Liste hinzufügen, denn diese werden zum Schluss erzeugt (fullEastSide usw.)
repeat with i from 1 to count of priorityAppList
	set listItem to item i of priorityAppList
	if (listItem is in activeAppList) then set appList's end to listItem
end repeat

-- Hauptauswahl,  counter = Anzahl der Fenster
if counter = 4 then
	
	upperWestside(item 1 of appList)
	lowerWestside(item 2 of appList)
	upperEastside(item 3 of appList)
	lowerEastside(item 4 of appList)
	
else if counter = 3 then
	
	-- "2x1"
	upperWestside(item 1 of appList)
	lowerWestside(item 2 of appList)
	fullEastside(item 3 of appList)
	
	-- alternative "1x2" 
	(*
		upperEastside(item 1 of appList)
		lowerEastside(item 2 of appList)
		fullWestside(item 3 of appList)
		*)
	
else if counter = 2 then -- split 2 applications
	
	fullWestside(item 1 of appList)
	fullEastside(item 2 of appList)
	
else if counter = 1 then
	
	centerWindow(item 1 of appList)
	--alternativ fullSize(item 1 of appList)
	
else
	-- display dialog "Choose max. 4 applications!"
end if

-- Funktionen zum Platzieren von Fenstern
-- links oben
on upperWestside(appname)
	tell application (appname)
		try
			set the bounds of the first window to {margin_west, 0, margin_west + split_width, split_height}
		end try
		activate
	end tell
end upperWestside

-- links unten
on lowerWestside(appname)
	tell application appname
		try
			set the bounds of the first window to {margin_west, split_height + menubar_height, margin_west + split_width, split_height * 2 + menubar_height}
		end try
		activate
	end tell
end lowerWestside

-- linke Hälfte 
on fullWestside(appname)
	tell application appname
		try
			set the bounds of the first window to {margin_west, 0, margin_west + split_width, split_height * 2}
		end try
		activate
	end tell
end fullWestside

-- rechts oben
on upperEastside(appname)
	tell application appname
		try
			set the bounds of the first window to {margin_west + split_width, 0, margin_west + split_width * 2, split_height}
		end try
		activate
	end tell
end upperEastside

-- rechts unten
on lowerEastside(appname)
	tell application appname
		try
			set the bounds of the first window to {margin_west + split_width, split_height + menubar_height, margin_west + split_width * 2, split_height * 2 + menubar_height}
		end try
		activate
	end tell
end lowerEastside

-- rechte Hälfte 
on fullEastside(appname)
	tell application appname
		try
			set the bounds of the first window to {margin_west + split_width, 0, margin_west + split_width * 2, split_height * 2}
		end try
		activate
	end tell
end fullEastside

-- fullSize 
on fullSize(appname)
	tell application appname
		try
			set the bounds of the first window to {margin_west, 0, margin_west + split_width * 2, split_height * 2}
		end try
		activate
	end tell
end fullSize

-- centerWindow
on centerWindow(appname)
	tell application appname
		try
			set the bounds of the first window to {(screen_width - split_width) / 2, 0, (screen_width + split_width) / 2, screen_height - dock_height}
		end try
		activate
	end tell
end centerWindow
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo!
Das wird ja langsam was.

Zwei Tipps:
Programme, die nicht skriptfähig sind, verstehen bounds nicht. Dort stellt man die Größe mit position und size ein.
Wackelkandidaten gibt es immer wieder. Das eine Programm verlangt 44 für Oberkante, andere 0 oder 22 ...

Ich habe leider keine Zeit, dir tatkräftig unter die Arme zu greifen. Dafür hier aber zwei Codeschnippsel zum basteln:
(Dann klappt es auch mit Firefox und Vorschau)

Code:
tell application "Finder"
	set {x1, y1, x2, y2} to get bounds of window of desktop
	set res to {x2, y2}
end tell

Code:
tell application "System Events"
	set frontApp to name of first application process whose frontmost is true
	--set appFile to (get application file of process frontApp) as Unicode text
	set appname to displayed name of process frontApp
	
	tell process appname
		-- nicht immer ist window 1 das "erste" sichtbare Fenster !
		try
			set w1 to (get first window whose visible is true)
		on error
			set w1 to front window
		end try
		tell w1
			set position to {10, 10}
			set size to {900, 700}
		end tell
	end tell
end tell

Gruß
 

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Danke, auch nicht schlecht. Nur behandeln diese Scripts immer nur das Front Window. Ich versuche es doch noch ein bisschen mehr zu automatisieren. Vielleicht kann ich mir aber doch das ein oder andere abschauen, wenn ich wieder Zeit und vor allem Lust dazu habe. ;)
 

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Ok, danke euch beiden. Hab die Tipps berücksichtigt und mit Hilfe der anderen Skripte meines ein bisschen optimiert.
Es funktioniert jetzt mit so gut wie jedem Programm, das ist die gute Nachricht.

Aber es gibt noch einige Probleme:

  • minimierte Fenster werden mitgezählt
  • es dürfen nicht mehr als 4 Apps aktiv sein (+ die ausgeschlossenen, aber inklusive der minimierten)
  • wenn mehr als ein Fenster von einer App aktiv ist, wird nur das erste Fenster berücksichtigt
Habt ihr Ideen dazu? ;)

Code:
-- Arrange Windows Script Version 1.5
-- Script ordnet Fenster automatisch am Bildschirm an (funktioniert nur für sichtbare Fenster, d.h. nicht für ausgeblendete oder minimierte)

global screen_width, screen_height, margin_west, margin_east, margin_north, margin_south, split_height, split_width, menubar_height, appList

-- für eine Auflösung von 1920x1200
set screen_width to 1920
set screen_height to 1200

-- Seitenabstand, für fullscreen auf 0 setzen
set margin_west to 50
set margin_east to 50
set margin_north to 22 -- Menüleiste
set margin_south to 150 -- etwas Freiraum für das Dock

-- Maße für Fenster
set split_width to (screen_width - (margin_west + margin_east)) / 2
set split_height to (screen_height - margin_south) / 2

-- Apps, deren Fenster möglichst das größte sein sollte (für counter = 3 ) -> bei konflikt wird das alphabetisch letzte genommen
set priorityAppList to {"iTunes", "Safari", "Pages"}

-- diese Programme werden vom Fenstermanagement ausgeschlossen
set badAppList to {"Adium", "System Preferences"}

set activeAppList to {}

-- aktive Programme bestimmen
tell application "Finder"
	set activeAppList to (get the name of every process whose visible is true)
	
	-- Finderfenster entfernen, wenn nicht geöffnet
	if not (the first window exists) then
		rest of activeAppList
		set activeAppList to items 2 thru -1 of activeAppList
	end if
end tell

-- Anzahl der active_apps
set counter to 0
set counter to count of items of activeAppList

set appList to {}

-- Apps herausfiltern (badApps, Apps ohne Priorität) 
repeat with i from 1 to counter
	set element to item i of activeAppList
	if ((element is not in appList) and (element is not in priorityAppList) and (element is not in badAppList)) then
		set appList's end to element
	else if (element is in badAppList) then
		set counter to counter - 1
	end if
end repeat

-- priority Apps am Ende der Liste hinzufügen, denn diese werden zum Schluss erzeugt (fullEastSide usw.)
repeat with i from 1 to count of priorityAppList
	set listItem to item i of priorityAppList
	if (listItem is in activeAppList) then set appList's end to listItem
end repeat


-- Hauptauswahl,  counter = Anzahl der Fenster
if counter = 4 then
	try
		sizeAndPos(item 1 of appList, "west up")
		sizeAndPos(item 2 of appList, "west low")
		sizeAndPos(item 3 of appList, "east up")
		sizeAndPos(item 4 of appList, "east low")
	end try
	
else if counter = 3 then
	-- "2x1"	
	try
		sizeAndPos(item 1 of appList, "west up")
		sizeAndPos(item 2 of appList, "west low")
		sizeAndPos(item 3 of appList, "east full")
		
	end try
	-- alternativ "1x2" 
	
else if counter = 2 then
	try
		sizeAndPos(item 1 of appList, "west full")
		sizeAndPos(item 2 of appList, "east full")
	end try
	
else if counter = 1 then
	try
		sizeAndPos(item 1 of appList, "center")
	end try
	--alternativ 
	--sizeAndPos(item 1 of appList, "fullsize")		
else
	-- display dialog  "max. 4 applications!"
end if

-- lege size und position fest
on sizeAndPos(appname, place)
	
	set menubar_height to getSpecialAppDistance(appname)
	
	tell application "System Events"
		tell process appname
			try
				set window1 to (get first window whose visible is true)
			on error
				set window1 to front window
			end try
			tell window1
				
				if (place is "west up") then
					set position to {margin_west, menubar_height}
					set size to {split_width, split_height}
					
				else if (place is "west low") then
					set position to {margin_west, split_height + margin_north + 1}
					set size to {split_width, split_height}
					
				else if (place is "west full") then
					set position to {margin_west, menubar_height}
					set size to {split_width, split_height * 2}
					
				else if (place is "east up") then
					set position to {margin_west + split_width + 1, menubar_height}
					set size to {split_width, split_height}
					
				else if (place is "east low") then
					set position to {margin_west + split_width + 1, split_height + margin_north + 1}
					set size to {split_width, split_height}
					
				else if (place is "east full") then
					set position to {margin_west + split_width + 1, menubar_height}
					set size to {split_width, split_height * 2}
					
				else if (place is "fullsize") then
					set position to {margin_west, menubar_height}
					set size to {split_width * 2, split_height * 2}
					
				else if (place is "center") then
					set position to {(screen_width - split_width) / 2, menubar_height}
					set size to {split_width, split_height * 2}
				end if
			end tell
		end tell
	end tell
end sizeAndPos

-- get Abstand zur Menüleiste für Problemfälle (für fullEast, fullWest & upperSides)
on getSpecialAppDistance(appname)
	
	set list1 to {"Automator", "Xcode"}
	
	if appname is in list1 then
		return -60
	else if appname is "iTunes" then
		return 22
	else if appname is "EyeTV" then
		return 44
	else
		return 0
	end if
end getSpecialAppDistance

Noch ein Zusatz:
Ich starte es jetzt immer mit FastScripts, das funktioniert wirklich sehr schnell und bis jetzt fantastisch.

Gruß,

Guy.brush

Edit: hier noch das dazu passende Video:

[video=youtube;cpjr3igdn90]http://www.youtube.com/watch?v=cpjr3igdn90[/video]
 
Zuletzt bearbeitet:

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Ideen hätte ich schon, bin aber die nächsten zwei Wochen ohne Mac. Werde mich dann noch mal melden.
Du kannst mit "count every window" die Fenster auslesen, auch ihren Status bestimmen und nacheinander abarbeiten.
Da die letzten Positionen der Fenster oft gespeichert werden, wäre es wohl vorteilhaft, die Fensterpositionen zurück zu setzten.
Und du arbeitest ohne Spaces, oder ? Sonst müssten diese ja auch berücksichtigt werden, was machbar, aber garantiert nicht so leicht umzusetzen ist.

Ich hatte mir mal ein "ähnliches" Skript geschrieben. Es hat ein paar Fehler, die ich mit meinem heutigen Wissen ausmerzen könnte. Ich werde mich in naher Zukunft noch mal ransetzen und auch auf 2 Display Betrieb erweitern.
Kannst du dir ja mal anschauen: Hier

Gruß
 

toc-rox

Weigelts Zinszahler (Rotfranch)
Registriert
15.11.09
Beiträge
247
@sedna: Das AppleScript ist leider als "nur ausführbar" abgespeichert.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Ja :)
Code gebe ich gerne auf Anfrage ... in zwei Wochen.
 

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Ok, ich denke, das Skript ist jetzt ziemlich einsatzfähig. Hab noch mit eingefügt, dass geschlossene Fenster nicht berücksichtigt werden, d.h. es können mehr als 4 Apps aktiv sein.

Es gibt also nur noch 2 Hauptprobleme:

  • minimierte Fenster
  • mehrere Fenster eines Programmes
Hier mal der Downloadlink zum Skript.
 

Guy.brush

Weißer Winterkalvill
Registriert
15.12.08
Beiträge
3.545
Hallo nochmal!

Nach halbjähriger Testphase will ich jetzt mal meine Optimallösung vorstellen, diese besteht aus den Scripts, die ich geschrieben habe + Alfred. Mit Alfred ist es möglich AppleScripts direkt und schnell auszuführen. Ich habe auch verschiedene Programme getestet, die mich nicht zufriedenstellten, sowohl vom Preis, als auch von der Funktionalität. Eine App, die insbesondere alle aktiven Fenster anordnet (Arrangement Script), gibt es wohl nicht.

Ich hab mal wieder ein paar Videos zur Veranschaulichung gemacht:


Ich hab sie in 2 Kategorien geordnet. Wer sich die Skripte mal anschauen will, hier sind sie:


Für Verbesserungsvorschläge und Fehler bin ich natürlich immer offen. Es gibt einige Programme, die "rumzicken".

Grußbrush