as of today I am new to this forum and look forward to exchange tips and tricks, thoughts and ideas ... and to get also some help
Getting help is my first post about and I hope this is the right place.
I am trying to set up a routine, which runs every time I turn on my iMac and the macOS is loading. I want several applications to load in different desktops to keep it tidy. To do so, I am using a little Apple Script routine, which I have defined as a Service Routine triggered by ^â„âD. The routine looks as follows:
on run {input, parameters}
do shell script "open -a 'Mission Control'"
delay 0.5
tell application "System Events" to click (every button whose value of attribute "AXDescription" is "add desktop") of group 2 of group 1 of group 1 of process "Dock"
delay 0.5
tell application "System Events" to key code 53
return input
end run
So what I am doing in Keyboard Maestro is to call the routine, give the iMac some time to cope with it and then call it again for three times.
Then I start loading the apps and sort on the different desktops. Between the different steps I have included some Pause functions, because I realized that the system needs some time to go ahead with the individual commands being executed.
My problems ist that the Keyboard Maestro routine shows up different results almost any time I test it.
Sometimes the Apple Script routine has problems, sometimes the Desktop are not being correctly addressed, sometimes the setup go the windows does not work.
What it never does is to load the script when I am starting the iMac - I have included Keyboard Maestro in the Login Items for my user, but it never executes upon start.
I have attached several print screens showing the routine hoping that somebody can help me to understand what I am doing wrong.
Again, I hope I am at the right space to ask for help - if not, just let me know and point me where to go, please.
Welcome to the forum! You have definitely come to the right place. I'm far from the most experienced or technically savvy user here, but I think I can still help you out with your macro in a few areas.
Starting here:
This sounds to me like you have the Keyboard Maestro Editor set to launch upon startup, when what you really want is the Keyboard Maestro Engine. In case you haven't already, make sure that the "Launch Engine at Login" item is checked in KM's preferences:
and that your login item looks like this:
Next, I would use your AppleScript routine directly in an Execute an AppleScript action instead of trying to activate it as a service. In other words, I'd replace this action:
with this action:
On my Mac, I was able to consistently create two new desktops this way with only a 0.5 second pause in between:
Once it's time to launch applications, instead of an arbitrary pause, I'd suggest pausing until the app is at the front before executing your Move and Resize Front Window actions:
And with that, I think you should be able to significantly improve both the reliability of creating new desktops and your macro's overall speed. Feel free to post again if you have any further questions!
Wow- thank you, that was already a big help. The idea to execute the Apps Script inside Keyboard Maestro is perfect and runs much smoother.
Now, I still have to play with the window management. The individual windows open based on their last condition, e.g. if a window was full screen before (like in Mail sometimes) it opens in full screen again and that mixes up the setup I have defined.
Also the move between the Desktops does not really work yet. I have - after opening the various Desktops- one right arrow keystroke defined to move to the next Desktop, but the system moves two Desktops
Funny enough: when I have it running in debugging mode, it runs perfectly and every window and program is in the Desktop I have defined it to be.
Thank you - yes, it was a timing issue! Playing around with the Actions Delay helped a lot.
Now started the tweaking on the details:
I have to include a Pause for Slack to load - or is there a way to tell KBM to Pause until an application is fully loaded ?
While loading a program is there a way to check upon the window condition of the program (full screen, minimised, etc. ) and based upon the status define an action? I have some programs which restart in full screen mode and thus open a new Desktop and one remains unused.
By fully loaded, I assume you mean until this window goes away and the proper Slack app appears?
This window appears to be titled just "Slack", so in this case, one way I can think of to wait until Slack is finished loading is to add a condition to Slack's "pause until frontmost" action to also checks that the front window title contains more than just "Slack":
Unfortunately there's no uniform way to determine whether an app has finished loading or not, so you need to get creative and think about what testable conditions are only in place once the app is in the state you want it.
I'm not sure about minimized, but there is an AppleScript-based way to check if the frontmost app is fullscreen or not, and to de-fullscreen it if it is. Combine that with KM's Pause Until action to ensure that the frontmost app is no longer fullscreen before proceeding, and I think you should be good to go:
##applescript to Set Fullscreen Apps to Non-Fullscreen
try
tell application "System Events"
tell (first application process whose frontmost is true)
tell (first window whose subrole is "AXStandardWindow")
set fullScreen to value of attribute "AXFullScreen"
if fullScreen = true then
set value of attribute "AXFullScreen" to false
end if
end tell
end tell
end tell
on error e number n
set e to e & return & return & "Num: " & n
if n â -128 then
try
tell application (path to frontmost application as text) to set ddButton to button returned of ÂŹ
(display dialog e with title "ERROR!" buttons {"Copy Error Message", "Cancel", "OK"} ÂŹ
default button "OK" giving up after 30)
if ddButton = "Copy Error Message" then set the clipboard to e
end try
end if
end try
##applescript Used in Pause Until to Determine Fullscreen Status (i.e. wait until script returns "false")
tell application "System Events"
tell (first application process whose frontmost is true)
tell (first window whose subrole is "AXStandardWindow")
value of attribute "AXFullScreen"
end tell
end tell
end tell
(full credit for these scripts goes to @ccstone; I just figured out a way to tweak them for this situation)
Thank you! Though I am using the Pause function, the KM continues to execute - this is all about timing as when I am increasing the Action Delay to 1.5 it works.
By the way, the script looks very useful but delivers me an error message that says:
System Events got an error: Canât get window 1 of application process 1 whose frontmost = true whose subrole = âAXStandardWindowâ. Invalid index.
Num: -1719
which seems to be an invalid index âŠ
But this forum is great, your help is tremendous and I am making much regress, thank you!
Youâre quite welcome! Iâm not sure why the script(s?) arenât working for you though; I just tested them both again and they work fine for me. Is there a particular app that always makes them fail? The simplest way to troubleshoot this would be for you to upload your full macro; in case you donât know how, you can find instructions here: https://wiki.keyboardmaestro.com/Forum#How_to_PostUpload_Your_Macro_to_the_Forum
So I have uploaded the complete macro - I have just started with KM and wanted to spend some hours the next few days with some tutorials to learn better the architecture of KM and the possibilities of the system. However, any suggestion highly welcomed!
Thanks! This made it much easier to figure out the problem: DEVONthink launches with a loading window similar to Slack that does not respond to the script, so you need to ensure that, like Slack, DEVONthink is finished loading before proceeding with the macro. This worked in my testing with zero delay between actions:
Thank to this forum I have my first macro up and running - great!
Last question I have: do you have any recommendation for a nice and effective tutorial (youtube?) or do you recommend to go through the library of macros and the forum ?
Glad that did the trick! As for video tutorials, Iâm afraid I donât have any good recommendations, but if you havenât already, I can suggest reading the Quick Start, looking over KMâs triggers and actions, perusing the Best Macro List post and Macro Library category to get an idea of whatâs possible, and generally keep visiting this forum. The more ways you see how KM can be used, the better youâll be able to think of how to harness it for your own needs. And donât be afraid to keep posting here, even for questions that you feel are too simple to merit a response! (though donât forget to also try searching the forum for those questions first, since chances are very good that whatever they are, someone else has posted about them before )
Heureka
I found a nugget here. Every time my iMac starts several apps are launching. I click some of those to minimise them. like iTunes and KM. I have looked in many places but never ventured into the Systems settings of macOS. But now, inspired by your screenshot, I have made iTunes and KM start up but not using pixels on my desktop. and wauw it does what I desired