Hi,

I'm committing the attached patch that implements a primitive fullscreen
support on a peer independent level. Actually it does only resize and
relocate the fullscreen window. Peers that implement a real
(accelerated) fullscreen mode would override the setFullScreenWindow(),
getFullScreenWindow() and isFullScreenSupported() methods.

I wonder about the default of isFullScreenSupported in
java.awt.GraphicsDevice returning true. Does that make sense? Should it
be the other way, defaulting to false and requiring Devices that support
fullscreen to override it to return true?

2005-04-05  Roman Kennke  <[EMAIL PROTECTED]>

        * gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java
        (getDisplayMode): Added. Returns the current display mode.
        (isFullScreenSupported): Added.
        * java/awt/GraphicsDevice.java
        (setFullScreenWindow): Implemented a primitive fullscreen mode.
        This resizes and relocates the fullscreen window so that it uses
        the whole screen. This is not a fully accelerated fullscreen
        exclusive mode.

Best regards,
/Roman

? java/util/LocaleData.java
? lib/classes.locale
? scripts/classpath.spec
Index: gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java,v
retrieving revision 1.3
diff -u -r1.3 GdkScreenGraphicsDevice.java
--- gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java	16 Feb 2005 13:59:03 -0000	1.3
+++ gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java	5 Apr 2005 14:08:09 -0000
@@ -38,6 +38,8 @@
 
 package gnu.java.awt.peer.gtk;
 
+import java.awt.Dimension;
+import java.awt.DisplayMode;
 import java.awt.GraphicsConfiguration;
 import java.awt.GraphicsDevice;
 
@@ -79,4 +81,35 @@
     // FIXME: query X for default configuration
     return new GdkGraphicsConfiguration(this);
   }
+
+
+  /**
+   * 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()
+  {
+    // determine display mode
+    Dimension dim = getToolkit().getScreenSize();
+    DisplayMode mode = new DisplayMode(dim.width, dim.height, 0,
+				       DisplayMode.REFRESH_RATE_UNKNOWN);
+    return mode;
+  }
+
+  /**
+   * This device does not yet support fullscreen exclusive mode, so this
+   * returns <code>false</code>.
+   *
+   * @return <code>false</code>
+   * @since 1.4
+   */
+  public boolean isFullScreenSupported()
+  {
+    return false;
+  }
+
 }
Index: java/awt/GraphicsDevice.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/GraphicsDevice.java,v
retrieving revision 1.2
diff -u -r1.2 GraphicsDevice.java
--- java/awt/GraphicsDevice.java	16 Feb 2005 10:39:26 -0000	1.2
+++ java/awt/GraphicsDevice.java	5 Apr 2005 14:08:12 -0000
@@ -64,6 +64,12 @@
   /** The current full-screen window, or null if there is none. */
   private Window full_screen;
 
+  /**
+   * The bounds of the fullscreen window before it has been switched to full
+   * screen.
+   */
+  private Rectangle fullScreenOldBounds;
+
   /** The current display mode, or null if unknown. */
   private DisplayMode mode;
 
@@ -151,9 +157,9 @@
    * </ul><br>
    * If <code>isFullScreenSupported()</code> returns false, full-screen
    * exclusive mode is simulated by resizing the window to the size of the
-   * screen and positioning it at (0,0).
-   *
-   * XXX Not yet implemented in Classpath.
+   * screen and positioning it at (0,0). This is also what this method does.
+   * If a device supports real fullscreen mode then it should override this
+   * method as well as #isFullScreenSupported and #getFullScreenWindow.
    *
    * @param w the window to toggle
    * @see #isFullScreenSupported()
@@ -164,11 +170,24 @@
    */
   public synchronized void setFullScreenWindow(Window w)
   {
+    // Restore the previous window to normal mode and release the reference.
     if (full_screen != null)
-      ; // XXX Restore the previous window to normal mode.
-    full_screen = w;
-    // XXX If w != null, make it full-screen.
-    throw new Error("not implemented");
+      {
+	full_screen.setBounds(fullScreenOldBounds);
+      }
+
+    full_screen = null;
+
+    // If w != null, make it full-screen.
+    if (w != null)
+      {
+	fullScreenOldBounds = w.getBounds();
+	full_screen = w;
+	DisplayMode dMode = getDisplayMode();
+	full_screen.setBounds(0, 0, dMode.getWidth(), dMode.getHeight());
+	full_screen.requestFocus();
+	full_screen.setLocationRelativeTo(null);
+      }
   }
 
   /**
_______________________________________________
Classpath-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to