AppleScript der Woche -- Fenster maximieren

michaelbach

Roter Seeapfel
Registriert
05.01.04
Beiträge
2.109
Hier war schon einmal danach gefragt worden: Fenster maximieren wie das in einem anderen Betriebssystem geht, das wir hier nicht nennen wollen. Nun, nicht unbedingt maximieren, aber wenigstens in der Höhe voll und rechts unter zumindest unter Berücksichtigung der Dockbreite oder auf z.B. 900 Pixel -- je nachdem welche Bildschirmgröße man hat.
Wem das gefällt, der kann es z.B. direkt in Butler einbauen (man kann da ja neuerdings direkt AS-Quellcode drin stehen haben) und dann per heißer Taste (bei mir ^M) aktivieren. Ich find's irre praktisch.
Das ganze Skript ist erstaunlich lang geworden, weil nicht alle Leute das Dock rechts haben ;), und weil (natürlich) M$-Programme anders sind…
Ach ja, damit's geht muss "Universal Access>Enable access for assistive devices" (oder wie immer das auf Deutsch heißt) aktiv sein.
Code:
--	2006-02-05	(Nearly) Maximize front window
--	best run from Butler, or Quicksilver for that matter
--	©2006 Michael Bach <www.michaelbach.de>, building on ideas from many colleagues
--	special treatment for incompatible programs only done for Word so far


-- line below to be customized by you
set rightEdgeOfWindow to -1 -- negative values will set the window to the full screen size (minus Dock)
set rightEdgeOfWindow to 900 --   <—— this will depend on your taste and your display size
-- end of easily customizable part


set menubarHeight to 22
set screenHeight to (word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Height")) as number
set yTop to menubarHeight
set yBottom to screenHeight
set xLeft to 0
set xRight to (word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Width")) as number

tell application "System Events"
	set frontProcessName to name of first application process whose frontmost is true
	tell list 1 of process "Dock"
		set dockOrientation to orientation
		set dockPositionRecord to position
		set dockSizeRecord to size
	end tell
	set dockXLeft to (item 1 of dockPositionRecord)
	set dockYTop to (item 2 of dockPositionRecord)
	set dockWidth to (item 1 of dockSizeRecord)
	set dockHeight to (item 2 of dockSizeRecord)
	if dockOrientation = "AXHorizontalOrientation" then
		set yBottom to yBottom - dockHeight -- need to leave room for dock at bottom
	else
		if dockOrientation = "AXVerticalOrientation" then
			if dockXLeft < 2 then -- dock is at left side of screen
				set xLeft to dockWidth
			else -- dock is at right side of screen
				set xRight to xRight - dockWidth
			end if
		end if
	end if
end tell
if (rightEdgeOfWindow > 0) then set xRight to min(xRight, rightEdgeOfWindow)
if (frontProcessName = "Finder") then set menubarHeight to 44

if (frontProcessName = "Microsoft Word") then
	set xLeft to xLeft + 1
	set yTop to yTop - 22
	tell application "Microsoft Word"
		tell window 1
			set left position to xLeft
			set top to yTop
			set width to {xRight - xLeft}
			set height to {yBottom - yTop} - 56
		end tell
	end tell
else
	tell application "System Events"
		tell process frontProcessName to tell window 1
			set position to {xLeft, yTop}
			set size to {xRight - xLeft, yBottom - yTop}
		end tell
	end tell
end if

tell application frontProcessName to activate --back to where we were
--
--
on max(i1, i2) -- I think I don't need this here any more…
	if i1 > i2 then return i1
	return i2
end max
--
on min(i1, i2)
	if i1 < i2 then return i1
	return i2
end min
 
  • Like
Reaktionen: michast und yjnthaar

michaelbach

Roter Seeapfel
Registriert
05.01.04
Beiträge
2.109
pete schrieb:
Du hast eine sehr angenehme Art, AppleScript zu schreiben. Ich habe es auf Anhieb verstanden!
Vielen Dank für die Blumen ;)

"/Library/Preferences/com.apple.windowserver" gibt es bei mir nicht (10.4.4),
Mist, ich dachte das ist universell. Unter OS9 war es leichter an die Bildschirmgröße dranzukommen. Weiß jemand Rat?

ich habe die Monitorwerte selbst eingetragen und dann gings.
pfiffig

Bisher allerdings mangels Butler nur mit Script Editor selbst ausprobiert.
Ich habe es dann als AppleScript-Programm gesichert und in die Symbolleiste des Finders gezogen, um es direkt mit Finderfenstern auszuprobieren. Resultat war dieser Error: NSReceiverEvaluationScriptError: 4
Das kann deshalb nicht gehen, weil dann das Programm sein eigenes Fenster -- das es ja gar nicht gibt -- groß machen will.
Man muss es schon mit einem Hotkey-Programm starten. Butler ist doch erst mal umsonst, siehe hier früheres Fädchen.
 

michaelbach

Roter Seeapfel
Registriert
05.01.04
Beiträge
2.109
pete schrieb:
...Warum kennt der Finder seine eigenen Fenster nicht? Ich grübele schon länger - aus anderen Gründen - darüber nach, warum der Finder sich hinsichtlich Fenstern so seltsam verhält.
Es ist ja nicht das Fenster des Finders, sondern das Fenster des Maximier-Programms! Im Finder geht es schon, wenn man das über ein Hotkey-Programmm aufruft.

Was für Seltsamkeiten bei Finder-Fenstern meinst Du? Mir fiele da nur die etwas seltsame Größe ein -- Rand oben & unten ist mal dabei (bounds), mal nicht.
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
michaelbach schrieb:
Mist, ich dachte das ist universell. Unter OS9 war es leichter an die Bildschirmgröße dranzukommen. Weiß jemand Rat?

Moin,

probier's mal so:

Code:
set myResolution to (do shell script "system_profiler -detailLevel mini | grep Resolution | sed 's|.*Resolution:\\ ||'")

Ist nicht gerade besonders schnell und ich habe noch nicht probiert, was der profiler bei zwei angeschlossenen Monitoren ausspuckt. Evtl. muss dann das Shellscript noch etwas aufwändiger werden.

Grüße,

Daisy

Nachtrag: Das könnte sicher auch ins Auge gehen, wenn noch andere Geräte angeschlossen sind, die 'Resolution' unter ihren Eigenschaften haben (z.B. Scanner?, Drucker?) Das wäre mal noch zu testen ... kann ich aber z.Zt. nicht, da ich nur mit PowerBook ohne Peripherie unterwegs bin.
 

Dante101

Ralls Genet
Registriert
11.10.05
Beiträge
5.048
Hallo allerseits.

Auch ein sehr gutes Freeware-Programm um Hotkeys zu definieren ist Spark (ACHTUNG: direkter Download) sh. Screenshot

Liebe Grüße
Daniel
 
Zuletzt bearbeitet:

michaelbach

Roter Seeapfel
Registriert
05.01.04
Beiträge
2.109
Daisy schrieb:
probier's mal so:
Code:
set myResolution to (do shell script "system_profiler -detailLevel mini | grep Resolution | sed 's|.*Resolution:\\ ||'")
...
Das ist ja toll, kannte ich noch gar nicht. In der Tat muss man das noch genauer prüfen, aber mit "system_profiler SPDisplaysDataType" kann man schon mal die Datenmasse auch noch einschränken.

Vielen Dank!
 

atl

Niederhelfenschwiler Beeriapfel
Registriert
04.11.04
Beiträge
842
Falls es hilft, die Ausgabe bei 2 Monitoren ist folgende:
Code:
outsider:~ atl$ system_profiler SPDisplaysDataType | grep Resolution | sed 's|.*Resolution:\\ ||'
          Resolution: 1280 x 1024 @ 60 Hz
          Resolution: 1280 x 1024 @ 60 Hz

ByE...
 

LaForce

Transparent von Croncels
Registriert
18.01.06
Beiträge
309
Hi Michael,
i hab das Script zwar nicht aussprobiert, aber so beim Durchlesen ist mir folgendes aufgefallen:
Wenn ein Programm eine Tool-Palette hat, kann es sein, daß dieses Fenster das vorderste Fenster ist, obwohl ich gerade in einem Dokumentenfenster arbeite. In dem Falle würde natürlich das falsche Fenster vergrößert.

Befindet sich das Fenster auf einem anderen als dem Hauptmonitor, wird das Fenster verschoben.
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
atl schrieb:
Falls es hilft, die Ausgabe bei 2 Monitoren ist folgende:
Code:
outsider:~ atl$ system_profiler SPDisplaysDataType | grep Resolution | sed 's|.*Resolution:\\ ||'
          Resolution: 1280 x 1024 @ 60 Hz
          Resolution: 1280 x 1024 @ 60 Hz

ByE...
Vielen Dank - zwischenzeitlich habe ich's auch mit einem externen Monitor ausprobieren können - der bei mir auch eine andere Auflösung hat als der erste. Erwartungsgemäß ist der erste ausgespuckte Wert für den internen und der zweite für den externen Monitor. Interessant, dass das 'sed ..' bei dir das 'Resolution: ' nicht weggeschnitten hat. Falls das nicht überall geht, müsste man das halt anders machen - vielleicht so:

Code:
set myResolution to (do shell script "system_profiler SPDisplaysDataType | grep Resolution | awk '{print $2, $4}'")

Dann ist der Output (bei mir) so:

"1152 768
1024 768"

Grüße,

Daisy
 

atl

Niederhelfenschwiler Beeriapfel
Registriert
04.11.04
Beiträge
842
Daisy schrieb:
Interessant, dass das 'sed ..' bei dir das 'Resolution: ' nicht weggeschnitten hat. Falls das nicht überall geht, müsste man das halt anders machen - ...
So funktioniert's:
system_profiler SPDisplaysDataType | grep Resolution | sed 's/.*Resolution:\ //'
Es lag nicht a dem Code, sondern daran, dass beim Einfügen in den Webbrowser der Backslash nach 'Resolution:' gedoppelt wird. :)

ByE...
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Hallo zusammen

Ich habe gerade den Thread gelesen er ist für mich gerade interesant, weil ich ein fenster gerne automatisch auf einen anderen Monitor verschieben möchte. allerdings möchte ich die monitore über ihren namen identifizieren. Der Name des Monitors ist allerdings nicht über grep ... zu lesen, da er nicht wie z.B: die auflösung über resolution definiert wird. Aber ich bin überzeugt, auch dass läst sich lösen! :)

gruss Patric
 

JohannesDörnte

Gast
Mich hat das Script animiert, es ein bisschen zu erweitern. Ich habe mehrere Scripte geschrieben, die verschiedene Fensteraktionen vollführen:
  • Fenster maximieren
  • Fenster auf dem Bildschirm zentrieren
  • Fenster vergrößern bzw. verkleinern auf den nächsten Wert von 640x480, 800x600 etc.
  • Fenster in eine der vier Ecken des Bildschirms schieben
  • Fenster bis zum Bildschirmrand nach rechts, links oben oder unten vergrößern.
Ist das Dock sichtbar, so wird der Platz des Docks berücksichtigt. Die Skripte funktionieren auch für Wordfenster. Alle Skripte sind inhaltlich identisch, lediglich die Position und Größe des neuen Fensters ist jeweils unterschiedlich. Die Skripte laufen unter Butler wunderbar. Sie haben von mir den Namen "spooky" bekommen und die jeweils aktuelle Version ist herunter zu laden unter www.doernte.net unter software. Selbstverständlich ist die Benutzung vollkommen frei...

Johannes Dörnte
 
Zuletzt bearbeitet von einem Moderator:

atl

Niederhelfenschwiler Beeriapfel
Registriert
04.11.04
Beiträge
842
Wo wir gerade dabei sind. Schon seit längerem habe ich mich - unter zu Hilfenahme hier aufgeführter Beispiele - daran versucht, eine einfache Möglichkeit zu schaffen, mehrere Fenster einer Applikation nebeneinander anzuordnen. Mittlerweile habe ich ein halbwegs funktionsfähiges Skript zusammengezimmert.
Code:
global screenSize, frontProcessName
property dockWidthOnLeft : 0
property dockWidthOnRight : 0
property dockHeightOnBottom : 0
property windowPadding : 5

tell application "System Events"
    set frontProcessName to name of first application process whose frontmost is true
    --set frontProcessName to "Microsoft Word"
    tell list 1 of process "Dock"
        set dockOrientation to orientation
        set dockPositionRecord to position
        set dockSizeRecord to size
    end tell
    if dockOrientation as string = "AXHorizontalOrientation" then
        set dockHeightOnBottom to (item 2 of dockSizeRecord)
        set dockWidthOnLeft to 0
        set dockWidthOnRight to 0
    else
        if dockOrientation as string = "AXVerticalOrientation" then
            if (item 1 of dockPositionRecord) < 2 then -- dock is at left side of screen
                set dockWidthOnLeft to (item 1 of dockSizeRecord) + windowPadding
                set dockWidthOnRight to 0
                set dockHeightOnBottom to 0
            else -- dock is at right side of screen
                set dockWidthOnRight to (item 1 of dockSizeRecord)
                set dockWidthOnLeft to 0
                set dockHeightOnBottom to 0
            end if
        end if
    end if
end tell

tell application "Finder" to copy the bounds of window of desktop to screenSize
set numItems to count of documents of application frontProcessName
--display dialog numItems
if (numItems > 0) then
    set windowWidth to (((item 3 of (screenSize)) - dockWidthOnLeft - dockWidthOnRight) / numItems)
end if

if (frontProcessName = "Microsoft Word") then
    repeat with n from 1 to (numItems)
        tell application "Microsoft Word"
            tell window n
                set left position to {(((n - 1) * windowWidth) + windowPadding)}
                set top to {(windowPadding)}
                set width to {windowWidth - 2 * windowPadding}
                set height to {(item 4 of screenSize) - 22 - 2 * windowPadding - dockHeightOnBottom - 67}
            end tell
        end tell
    end repeat
else
    repeat with n from 1 to (numItems)
        tell application "System Events" to tell process frontProcessName
            -- tell application frontProcessName
            tell (item n of windows)
                --set bounds to {((n - 1) * windowWidth) + dockWidthOnLeft, 22 + windowPadding, n * windowWidth + dockWidthOnLeft - dockWidthOnRight - windowPadding, (item 4 of screenSize) - windowPadding - dockHeightOnBottom}
                set position to {(((n - 1) * windowWidth) + dockWidthOnLeft + windowPadding), (22 + windowPadding)}
                set size to {windowWidth - 2 * windowPadding, (item 4 of screenSize) - 22 - 2 * windowPadding - dockHeightOnBottom}
            end tell
        end tell
    end repeat
end if
tell application frontProcessName to activate
Mittels Butler auf die Tastenkombination <ctrl> + <apfel> + <M> gelegt funktioniert es bei mir mit folgenden Applikationen:
  • Skripteditor
  • SubEthaEdit
  • Microsoft Word
  • Safari
  • Textedit
  • OmniOutliner
Bei Camino, Microsoft Excel, Microsoft PowerPoint funktioniert es leider nicht, obwohl da die Funktionalität auch sinnvoll wäre. Mal sehen, vielleicht setze ich mich da noch dran. Falls jemand dafür schon Sachen hat, immer her damit. :)

Aber auch Verbesserungen, die das Skript für weitere Programme nutzbar machen, sind herzlich willkommen. :)

ByE...
 

xxxsemoi

Golden Delicious
Registriert
18.12.06
Beiträge
11
Hallo,


nach dieser Option habe ich bereits lange gesucht. Butler scheint mir ein fantastisches Programm zu sein. Ich habe lange unter Linux mit Enlightenment gearbeitet und habe mir alles so einrichten können, wie ich es wollte.

Leider bin ich zu blöd, um das Skript richtig zu benutzen. Ich habe es jetzt bereits auf zwei Arten versucht, aber bin kläglich gescheitert:
1) Skript als Datei in $HOME/bin speichern und anschließend die Datei von Butler via Tastenkombination aufrufen.
2) Quelltext direkt in Butler eingegeben.

Gibt es eine Internetseite, auf der Schritt für Schritt das Vorgehen beschrieben wird?

Gruß
xxx
 

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
Hallo,

für Applescript ist:

Programme/Applescript/SkriptEditor

gedacht.


mfg pi26