mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			363 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Java
		
	
	
	
/* GdkScreenGraphicsDevice.java -- information about a screen device
 | 
						|
   Copyright (C) 2004, 2005, 2006  Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath 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, or (at your option)
 | 
						|
any later version.
 | 
						|
 | 
						|
GNU Classpath 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 GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
 | 
						|
package gnu.java.awt.peer.gtk;
 | 
						|
 | 
						|
import java.awt.DisplayMode;
 | 
						|
import java.awt.Frame;
 | 
						|
import java.awt.GraphicsConfiguration;
 | 
						|
import java.awt.GraphicsDevice;
 | 
						|
import java.awt.Rectangle;
 | 
						|
import java.awt.Window;
 | 
						|
import java.util.ArrayList;
 | 
						|
 | 
						|
import gnu.classpath.Configuration;
 | 
						|
import gnu.classpath.Pointer;
 | 
						|
 | 
						|
class GdkScreenGraphicsDevice extends GraphicsDevice
 | 
						|
{
 | 
						|
  private final int native_state = GtkGenericPeer.getUniqueInteger ();
 | 
						|
 | 
						|
  private Window fullscreenWindow;
 | 
						|
 | 
						|
  private boolean oldWindowDecorationState;
 | 
						|
 | 
						|
  private Rectangle oldWindowBounds;
 | 
						|
 | 
						|
  private Rectangle bounds;
 | 
						|
 | 
						|
  private GdkGraphicsConfiguration[] configurations;
 | 
						|
 | 
						|
  /** The <code>GdkGraphicsEnvironment</code> instance that created this
 | 
						|
   * <code>GdkScreenGraphicsDevice</code>. This is only needed for native
 | 
						|
   * methods which need to access the 'native_state' field storing a pointer
 | 
						|
   * to a GdkDisplay object.
 | 
						|
   */
 | 
						|
  GdkGraphicsEnvironment env;
 | 
						|
 | 
						|
  /** An identifier that is created by Gdk
 | 
						|
   */
 | 
						|
  String idString;
 | 
						|
 | 
						|
  /** The display modes supported by this <code>GdkScreenGraphicsDevice</code>.
 | 
						|
   * If the array is <code>null</code> <code>nativeGetDisplayModes</code> has
 | 
						|
   * to be called.
 | 
						|
   */
 | 
						|
  X11DisplayMode[] displayModes;
 | 
						|
 | 
						|
  /** The non-changeable display mode of this <code>GdkScreenGraphicsDevice
 | 
						|
   * </code>. This field gets initialized by the {@link #init()} method. If it
 | 
						|
   * is still <code>null</code> afterwards, the XRandR extension is available
 | 
						|
   * and display mode changes are possible. If it is non-null XRandR is not
 | 
						|
   * available, no display mode changes are possible and no other native
 | 
						|
   * method must be called.
 | 
						|
   */
 | 
						|
  DisplayMode fixedDisplayMode;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The pointer to the native screen resource.
 | 
						|
   *
 | 
						|
   * This field is manipulated by native code. Don't change or remove
 | 
						|
   * without adjusting the native code.
 | 
						|
   */
 | 
						|
  private Pointer screen;
 | 
						|
 | 
						|
  static
 | 
						|
  {
 | 
						|
    if (true) // GCJ LOCAL
 | 
						|
      {
 | 
						|
        System.loadLibrary("gtkpeer");
 | 
						|
      }
 | 
						|
 | 
						|
    GtkToolkit.initializeGlobalIDs();
 | 
						|
    initIDs();
 | 
						|
  }
 | 
						|
 | 
						|
  static native void initIDs();
 | 
						|
 | 
						|
  GdkScreenGraphicsDevice (GdkGraphicsEnvironment e)
 | 
						|
  {
 | 
						|
    super();
 | 
						|
    env = e;
 | 
						|
 | 
						|
    configurations = new GdkGraphicsConfiguration[1];
 | 
						|
    configurations[0] = new GdkGraphicsConfiguration(this);
 | 
						|
  }
 | 
						|
 | 
						|
  /** This method is called from the native side immediately after
 | 
						|
   * the constructor is run.
 | 
						|
   */
 | 
						|
  void init()
 | 
						|
  {
 | 
						|
    fixedDisplayMode = nativeGetFixedDisplayMode(env);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Depending on the availability of the XRandR extension the method returns
 | 
						|
   * the screens' non-changeable display mode or null, meaning that XRandR can
 | 
						|
   * handle display mode changes.
 | 
						|
   */
 | 
						|
  native DisplayMode nativeGetFixedDisplayMode(GdkGraphicsEnvironment env);
 | 
						|
 | 
						|
  public int getType ()
 | 
						|
  {
 | 
						|
    // Gdk manages only raster screens.
 | 
						|
    return GraphicsDevice.TYPE_RASTER_SCREEN;
 | 
						|
  }
 | 
						|
 | 
						|
  public String getIDstring ()
 | 
						|
  {
 | 
						|
    if (idString == null)
 | 
						|
      idString = nativeGetIDString();
 | 
						|
 | 
						|
    return idString;
 | 
						|
  }
 | 
						|
 | 
						|
  private native String nativeGetIDString();
 | 
						|
 | 
						|
  public GraphicsConfiguration[] getConfigurations ()
 | 
						|
  {
 | 
						|
    return (GraphicsConfiguration[]) configurations.clone();
 | 
						|
  }
 | 
						|
 | 
						|
  public GraphicsConfiguration getDefaultConfiguration ()
 | 
						|
  {
 | 
						|
    return configurations[0];
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the current display mode of this device, or null if unknown.
 | 
						|
   *
 | 
						|
   * @return the current display mode
 | 
						|
   * @see #setDisplayMode(DisplayMode)
 | 
						|
   * @see #getDisplayModes()
 | 
						|
   * @since 1.4
 | 
						|
   */
 | 
						|
  public DisplayMode getDisplayMode()
 | 
						|
  {
 | 
						|
    if (fixedDisplayMode != null)
 | 
						|
      return fixedDisplayMode;
 | 
						|
 | 
						|
    synchronized (this)
 | 
						|
      {
 | 
						|
        if (displayModes == null)
 | 
						|
          displayModes = nativeGetDisplayModes(env);
 | 
						|
      }
 | 
						|
 | 
						|
    int index = nativeGetDisplayModeIndex(env);
 | 
						|
    int rate = nativeGetDisplayModeRate(env);
 | 
						|
 | 
						|
    return new DisplayMode(displayModes[index].width,
 | 
						|
                           displayModes[index].height,
 | 
						|
                           DisplayMode.BIT_DEPTH_MULTI,
 | 
						|
                           rate);
 | 
						|
  }
 | 
						|
 | 
						|
  native int nativeGetDisplayModeIndex(GdkGraphicsEnvironment env);
 | 
						|
 | 
						|
  native int nativeGetDisplayModeRate(GdkGraphicsEnvironment env);
 | 
						|
 | 
						|
  public DisplayMode[] getDisplayModes()
 | 
						|
  {
 | 
						|
    if (fixedDisplayMode != null)
 | 
						|
      return new DisplayMode[] { fixedDisplayMode };
 | 
						|
 | 
						|
    synchronized (this)
 | 
						|
      {
 | 
						|
        if (displayModes == null)
 | 
						|
          displayModes = nativeGetDisplayModes(env);
 | 
						|
      }
 | 
						|
 | 
						|
    ArrayList<DisplayMode> list = new ArrayList<DisplayMode>();
 | 
						|
    for(int i=0;i<displayModes.length;i++)
 | 
						|
      for(int j=0;j<displayModes[i].rates.length;j++)
 | 
						|
        list.add(new DisplayMode(displayModes[i].width,
 | 
						|
                                 displayModes[i].height,
 | 
						|
                                 DisplayMode.BIT_DEPTH_MULTI,
 | 
						|
                                 displayModes[i].rates[j]));
 | 
						|
 | 
						|
    return list.toArray(new DisplayMode[list.size()]);
 | 
						|
  }
 | 
						|
 | 
						|
  native X11DisplayMode[] nativeGetDisplayModes(GdkGraphicsEnvironment env);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Real fullscreen exclusive mode is not supported.
 | 
						|
   *
 | 
						|
   * @return <code>false</code>
 | 
						|
   * @since 1.4
 | 
						|
   */
 | 
						|
  public boolean isFullScreenSupported()
 | 
						|
  {
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  public boolean isDisplayChangeSupported()
 | 
						|
  {
 | 
						|
    return fixedDisplayMode == null;
 | 
						|
  }
 | 
						|
 | 
						|
  public void setDisplayMode(DisplayMode dm)
 | 
						|
  {
 | 
						|
    if (fixedDisplayMode != null)
 | 
						|
      throw new UnsupportedOperationException("Cannnot change display mode.");
 | 
						|
 | 
						|
    if (dm == null)
 | 
						|
      throw new IllegalArgumentException("DisplayMode must not be null.");
 | 
						|
 | 
						|
    synchronized (this)
 | 
						|
      {
 | 
						|
        if (displayModes == null)
 | 
						|
          displayModes = nativeGetDisplayModes(env);
 | 
						|
      }
 | 
						|
 | 
						|
    for (int i=0; i<displayModes.length; i++)
 | 
						|
      if (displayModes[i].width == dm.getWidth()
 | 
						|
          && displayModes[i].height == dm.getHeight())
 | 
						|
        {
 | 
						|
          synchronized (this)
 | 
						|
          {
 | 
						|
            nativeSetDisplayMode(env,
 | 
						|
                                 i,
 | 
						|
                                 (short) dm.getRefreshRate());
 | 
						|
 | 
						|
            bounds = null;
 | 
						|
          }
 | 
						|
 | 
						|
          return;
 | 
						|
        }
 | 
						|
 | 
						|
    throw new IllegalArgumentException("Mode not supported by this device.");
 | 
						|
  }
 | 
						|
 | 
						|
  native void nativeSetDisplayMode(GdkGraphicsEnvironment env,
 | 
						|
                                int index, short rate);
 | 
						|
 | 
						|
  /** A class that simply encapsulates the X11 display mode data.
 | 
						|
   */
 | 
						|
  static class X11DisplayMode
 | 
						|
  {
 | 
						|
    short[] rates;
 | 
						|
    int width;
 | 
						|
    int height;
 | 
						|
 | 
						|
    X11DisplayMode(int width, int height, short[] rates)
 | 
						|
    {
 | 
						|
      this.width = width;
 | 
						|
      this.height = height;
 | 
						|
      this.rates = rates;
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  public void setFullScreenWindow(Window w)
 | 
						|
  {
 | 
						|
    // Bring old fullscreen window back into its original state.
 | 
						|
    if (fullscreenWindow != null && w != fullscreenWindow)
 | 
						|
      {
 | 
						|
        if (fullscreenWindow instanceof Frame)
 | 
						|
          {
 | 
						|
            // Decoration state can only be switched when the peer is
 | 
						|
            // non-existent. That means we have to dispose the
 | 
						|
            // Frame.
 | 
						|
            Frame f = (Frame) fullscreenWindow;
 | 
						|
            if (oldWindowDecorationState != f.isUndecorated())
 | 
						|
              {
 | 
						|
                f.dispose();
 | 
						|
                f.setUndecorated(oldWindowDecorationState);
 | 
						|
              }
 | 
						|
          }
 | 
						|
 | 
						|
        fullscreenWindow.setBounds(oldWindowBounds);
 | 
						|
 | 
						|
        if (!fullscreenWindow.isVisible())
 | 
						|
          fullscreenWindow.setVisible(true);
 | 
						|
      }
 | 
						|
 | 
						|
    // If applicable remove decoration, then maximize the window and
 | 
						|
    // bring it to the foreground.
 | 
						|
    if (w != null)
 | 
						|
      {
 | 
						|
        if (w instanceof Frame)
 | 
						|
          {
 | 
						|
            Frame f = (Frame) w;
 | 
						|
            oldWindowDecorationState = f.isUndecorated();
 | 
						|
            if (!oldWindowDecorationState)
 | 
						|
              {
 | 
						|
                f.dispose();
 | 
						|
                f.setUndecorated(true);
 | 
						|
              }
 | 
						|
          }
 | 
						|
 | 
						|
        oldWindowBounds = w.getBounds();
 | 
						|
 | 
						|
        DisplayMode dm = getDisplayMode();
 | 
						|
 | 
						|
        w.setBounds(0, 0, dm.getWidth(), dm.getHeight());
 | 
						|
 | 
						|
        if (!w.isVisible())
 | 
						|
          w.setVisible(true);
 | 
						|
 | 
						|
        w.requestFocus();
 | 
						|
        w.toFront();
 | 
						|
 | 
						|
      }
 | 
						|
 | 
						|
    fullscreenWindow = w;
 | 
						|
  }
 | 
						|
 | 
						|
  public Window getFullScreenWindow()
 | 
						|
  {
 | 
						|
   return fullscreenWindow;
 | 
						|
  }
 | 
						|
 | 
						|
  Rectangle getBounds()
 | 
						|
  {
 | 
						|
   synchronized(this)
 | 
						|
     {
 | 
						|
       if (bounds == null)
 | 
						|
         bounds = nativeGetBounds();
 | 
						|
     }
 | 
						|
 | 
						|
   return bounds;
 | 
						|
  }
 | 
						|
 | 
						|
  native Rectangle nativeGetBounds();
 | 
						|
 | 
						|
}
 |