Question

While I'm running some program in Terminal (or iTerm2), when the program forks the process, the OS X desktop switches focus from the current application to the forked process. When this happens, the forked process name shows in OS X menu bar.

This is especially annoying while using full screen mode as it causes the workspace to change when the forked process receives focus.

How can I stop this focus switch from happening? These terminal programs are interrupting the work I'm doing in other applications while they run.

Was it helpful?

Solution

In my case it was the Maven Failsafe Plugin that caused the annoying window focus stealing of ForkedBooter, and setting the JAVA_TOOL_OPTIONS variable in .bashrc didn't help.

This fix applies to both Failsafe and Surefire (although in my case, Surefire wasn't stealing focus).

In your pom.xml, add a <argLine>-Djava.awt.headless=true</argLine> line inside the <configuration> for the failsafe (and/or) surefire plugin.

It will look like this:

<!-- this is inside your <project><build><plugins> block -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven.surefire.plugin.version}</version>
    <configuration>
      <includes>
        <include>**/unit/**/*Test*.java</include>
      </includes>
      <!-- prevent the annoying ForkedBooter process from stealing window 
        focus on Mac OS -->
      <argLine>-Djava.awt.headless=true</argLine>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>${maven.failsafe.plugin.version}</version>
    <configuration>
      <!-- prevent the annoying ForkedBooter process from stealing window 
        focus on Mac OS -->
      <argLine>-Djava.awt.headless=true</argLine>
      <includes>
        <include>**/integration/**/*Test*</include>
      </includes>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>integration-test</goal>
          <goal>verify</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

OTHER TIPS

As @patrix has suggested, it seems I'm only having this problem with Java processes.

This answer over at StackOverflow seems to solve the problem

Can you run your terminal program in the background? I believe this will keep it from coming in focus on the desktop as well. Just add '&' to the end of the terminal command to run a process in the background.

So if your terminal command were:

sh someprocess.sh

change it to:

sh someprocess.sh &

To bring a background process to the foreground in terminal use the command:

fg

Licensed under: CC-BY-SA with attribution
Not affiliated with apple.stackexchange
scroll top