/* * OperatingSystem.java - OS detection * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2002, 2005 Slava Pestov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Toolkit; import javax.swing.UIManager; import java.io.File; import java.util.Set; import java.util.HashSet; import org.gjt.sp.util.Log; /** * Operating system detection routines. * @author Slava Pestov * @version $Id$ * @since jEdit 4.0pre4 */ public class OperatingSystem { //{{{ getScreenBounds() method /** * Returns the bounds of the default screen. */ public static Rectangle getScreenBounds() { int screenX = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth(); int screenY = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight(); int x, y, w, h; if (isMacOS()) { x = 0; y = 22; w = screenX; h = screenY - y - 4;//shadow size } else if (isWindows()) { x = -4; y = -4; w = screenX - 2*x; h = screenY - 2*y; } else { x = 0; y = 0; w = screenX; h = screenY; } return new Rectangle(x,y,w,h); } //}}} //{{{ getScreenBounds() method /** * Returns the bounds of the (virtual) screen that the window should be in * @param window The bounds of the window to get the screen for */ public static Rectangle getScreenBounds(Rectangle window) { GraphicsDevice[] gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); Set<GraphicsConfiguration> intersects = new HashSet<GraphicsConfiguration>(); // Get available screens // O(n^3), this is nasty, but since we aren't dealling with // many items it should be fine for (GraphicsDevice aGd : gd) { GraphicsConfiguration gc = aGd.getDefaultConfiguration(); // Don't add duplicates if (window.intersects(gc.getBounds())) { if (!intersects.contains(gc)) intersects.add(gc); } } GraphicsConfiguration choice = null; if (!intersects.isEmpty()) { // Pick screen with largest intersection for (GraphicsConfiguration gcc : intersects) { if (choice == null) choice = gcc; else { Rectangle int1 = choice.getBounds().intersection(window); Rectangle int2 = gcc.getBounds().intersection(window); int area1 = int1.width * int1.height; int area2 = int2.width * int2.height; if (area2 > area1) choice = gcc; } } } else choice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); // Make adjustments for some OS's int screenX = choice.getBounds().x; int screenY = choice.getBounds().y; int screenW = choice.getBounds().width; int screenH = choice.getBounds().height; int x, y, w, h; if (isMacOS()) { x = screenX; y = screenY + 22; w = screenW; h = screenH - y - 4;//shadow size } else { x = screenX; y = screenY; w = screenW; h = screenH; } // Yay, we're finally there return new Rectangle(x,y,w,h); } //}}} //{{{ isDOSDerived() method /** * Returns if we're running Windows 95/98/ME/NT/2000/XP/Vista/Win7, or OS/2. * @deprecated use {@link #isWindows()} */ @Deprecated public static boolean isDOSDerived() { return isWindows() || isOS2(); } //}}} //{{{ isWindows() method /** * Returns if we're running Windows 95/98/ME/NT/2000/XP/Vista/Win7. */ public static boolean isWindows() { return os == WINDOWS_9x || os == WINDOWS_NT; } //}}} //{{{ isWindows9x() method /** * Returns if we're running Windows 95/98/ME. */ public static boolean isWindows9x() { return os == WINDOWS_9x; } //}}} //{{{ isWindowsNT() method /** * Returns if we're running Windows NT/2000/XP/Vista/Win7. */ public static boolean isWindowsNT() { return os == WINDOWS_NT; } //}}} //{{{ isOS2() method /** * Returns if we're running OS/2. */ public static boolean isOS2() { return os == OS2; } //}}} //{{{ isUnix() method /** * Returns if we're running Unix (this includes MacOS X). */ public static boolean isUnix() { return os == UNIX || os == MAC_OS_X; } //}}} //{{{ isMacOS() method /** * Returns if we're running MacOS X. */ public static boolean isMacOS() { return os == MAC_OS_X; } //}}} //{{{ isX11() method /** * Returns if this OS is likely to be using X11 as the graphics * system. * @since jEdit 4.2pre3 */ public static boolean isX11() { return os == UNIX; } //}}} //{{{ isVMS() method /** * Returns if we're running VMS. */ public static boolean isVMS() { return os == VMS; } //}}} //{{{ isMacOSLF() method /** * Returns if we're running MacOS X and using the native look and feel. */ public static boolean isMacOSLF() { return isMacOS() && UIManager.getLookAndFeel().isNativeLookAndFeel(); } //}}} //{{{ hasScreenMenuBar() method /** * Returns whether the screen menu bar on Mac OS X is in use. * @since jEdit 4.2pre1 */ public static boolean hasScreenMenuBar() { if(!isMacOS()) return false; else if(hasScreenMenuBar == -1) { String result = System.getProperty("apple.laf.useScreenMenuBar"); if (result == null) result = System.getProperty("com.apple.macos.useScreenMenuBar"); hasScreenMenuBar = "true".equals(result) ? 1 : 0; } return hasScreenMenuBar == 1; } //}}} //{{{ hasJava17() method /** * @deprecated - there is no point in checking for this * since we require Java 1.7. * Returns if Java 2 version 1.7 is in use. * @since jEdit 5.0pre1 */ @Deprecated public static boolean hasJava17() { return true; } //}}} //{{{ isCaseInsensitiveFS() method /** * @since jEdit 4.3pre2 */ public static boolean isCaseInsensitiveFS() { return isWindows() || isMacOS(); } //}}} //{{{ Private members private static final int UNIX = 0x31337; private static final int WINDOWS_9x = 0x640; private static final int WINDOWS_NT = 0x666; private static final int OS2 = 0xDEAD; private static final int MAC_OS_X = 0xABC; private static final int VMS = 0xDEAD2; private static final int UNKNOWN = 0xBAD; private static int os; private static int hasScreenMenuBar = -1; //{{{ Class initializer static { String osName = System.getProperty("os.name"); if(osName.contains("Windows 9") || osName.contains("Windows M")) { os = WINDOWS_9x; } else if(osName.contains("Windows")) { os = WINDOWS_NT; } else if(osName.contains("VMS")) { os = VMS; } else if(osName.contains("OS X")) { os = MAC_OS_X; } else if(File.separatorChar == '/') { os = UNIX; } else if(osName.contains("OS/2")) { os = OS2; } else { os = UNKNOWN; Log.log(Log.WARNING,OperatingSystem.class, "Unknown operating system: " + osName); } // for debugging, make jEdit think its using a different // version of Java than it really is. /* String javaVersion = System.getProperty("jedit.force.java.version"); if(javaVersion == null || javaVersion.isEmpty()) javaVersion = System.getProperty("java.version"); if(javaVersion == null || javaVersion.isEmpty()) javaVersion = System.getProperty("java.runtime.version"); */ // java17 = javaVersion.compareTo("1.7") >= 0; } //}}} //}}} }