Skip to content

Commit

Permalink
window-fading when entering fullscreen ...
Browse files Browse the repository at this point in the history
* releasing textures when fs-window is not needed anymore
* fix for osx 30fps problem with nvidia cards, at least partial
  • Loading branch information
kritzikratzi committed Feb 8, 2010
1 parent 290d246 commit c9d2e00
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 20 deletions.
71 changes: 60 additions & 11 deletions src/fullscreen/FullScreenFrame.java
@@ -1,9 +1,14 @@
package fullscreen;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.Rectangle;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
Expand All @@ -12,11 +17,14 @@
import java.lang.reflect.InvocationTargetException;

import javax.media.opengl.GLContext;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;

import processing.core.PApplet;
import processing.opengl.PGraphicsOpenGL;
import fullscreen.renderers.ClassicRenderer;
import fullscreen.renderers.GLRenderer;
import fullscreen.renderers.Renderer;

public class FullScreenFrame extends JFrame{
Expand Down Expand Up @@ -46,13 +54,15 @@ public FullScreenFrame( PApplet dad, int screenNr, int x, int y, int width, int
javax.media.opengl.GLContext context = ((PGraphicsOpenGL) dad.g).getContext();
// renderer = new fullscreen.renderers.GLRenderer( dad, context, x, y, width, height );
try {
renderer = (Component) Class.forName( "fullscreen.renderers.GLRenderer" ).
/*renderer = (Component) Class.forName( "fullscreen.renderers.GLRenderer" ).
getConstructor( PApplet.class, GLContext.class, Integer.class, Integer.class, Integer.class, Integer.class ).
newInstance( dad, context, x, y, width, height );
newInstance( dad, context, x, y, width, height );*/
renderer = new GLRenderer( dad, context, x, y, width, height );
}
catch (Exception e) {
System.err.println( "FullScreen API: Sorry, GLRenderer not fond. " );
System.err.println( "FullScreen API: Sorry, GLRenderer not found. " );
System.err.println( " I don't know what to say... bye!" );
e.printStackTrace();
System.exit( 1 );
}
}
Expand All @@ -61,20 +71,33 @@ public FullScreenFrame( PApplet dad, int screenNr, int x, int y, int width, int
}

getContentPane().add( renderer, BorderLayout.CENTER );
setupEvents();
// Fix for mac os:
// Add a 1-px border if using open gl
// TODO:
// with this fix in place it is possible to click at the
// lowest pixel-line to lose focus.
// need to figure out where the focus goes ...
if( System.getProperty( "os.name" ).contains( "Mac OS X" ) && FullScreenTools.isGL( dad ) ){
MacFixer fixer = new MacFixer();
getContentPane().add( fixer, BorderLayout.SOUTH );
setupKeyEvents( fixer );
}

setupKeyEvents( renderer );
setupMouseEvents( renderer );

GraphicsDevice device = FullScreenTools.getScreenDevice( screenNr );
setBounds( device.getDefaultConfiguration().getBounds() );
setExtendedState( MAXIMIZED_BOTH );
setTitle( dad.frame == null?"":dad.frame.getTitle() );
setUndecorated( true );
setVisible( false );
setVisible( false );
}


private void setupEvents(){
private void setupMouseEvents( Component component ){
// Forward all sorts of events...
renderer.addMouseMotionListener( new MouseMotionListener(){
component.addMouseMotionListener( new MouseMotionListener(){
@Override
public void mouseDragged( MouseEvent e ) {
if( ( e = duplicate( e ) ) != null ) dad.mouseDragged( e );
Expand All @@ -86,7 +109,7 @@ public void mouseMoved( MouseEvent e ){
}
} );

renderer.addMouseListener( new MouseListener(){
component.addMouseListener( new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
if( ( e = duplicate( e ) ) != null ) dad.mouseClicked( e );
Expand All @@ -112,8 +135,11 @@ public void mouseReleased(MouseEvent e) {
if( ( e = duplicate( e ) ) != null ) dad.mouseReleased( e );
}
});

renderer.addKeyListener( new KeyListener(){
}


private void setupKeyEvents( Component component ){
component.addKeyListener( new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
dad.keyPressed( e );
Expand All @@ -131,7 +157,6 @@ public void keyTyped(KeyEvent e) {
});
}


/**
* Duplicates a mouse event, but only if necessary!
* @return
Expand Down Expand Up @@ -172,5 +197,29 @@ public void dispose() {

super.dispose();
}


private class MacFixer extends JComponent{
@Override
public void paint(Graphics g) {
g.setColor( Color.black );
g.fillRect( 0, 0, getWidth(), getHeight() );
}

@Override
public Dimension getPreferredSize(){
return new Dimension( 200, 1 );
}

@Override
public Dimension getMinimumSize() {
return new Dimension( 200, 1 );
}

@Override
public Dimension getMaximumSize() {
return new Dimension( Integer.MAX_VALUE, 1 );
}
}
}

65 changes: 57 additions & 8 deletions src/fullscreen/SoftFullScreen.java
Expand Up @@ -27,6 +27,8 @@

import javax.swing.JFrame;

import com.sun.awt.AWTUtilities;

import processing.core.PApplet;
import processing.core.PConstants;

Expand Down Expand Up @@ -61,6 +63,11 @@ public class SoftFullScreen extends FullScreenBase{
private boolean isFullScreen = false;
Vector<FullScreenFrame> frames = new Vector<FullScreenFrame>();

// Can we already switch back?
private boolean canSwitch = true;
private float originalAlpha;
private float fullscreenAlpha;

/**
* Creates a new softfullscreen object.
*
Expand Down Expand Up @@ -168,28 +175,31 @@ else if( fullScreen ){
}

for( JFrame frame : frames ){
AWTUtilities.setWindowOpacity( frame, 0 );
frame.setVisible( true );
frame.requestFocus();
}

//GLDrawableHelper.reAllocate( this );
//GLTextureUpdateHelper.update( this );
fullscreenAlpha = 1;
originalAlpha = 0;

notifySketch( dad );
isFullScreen = true;
return;
}
else{
System.err.println( "FullScreen API: Fullscreen mode not available" );
System.err.println( "FullScreen API: Fullscreen mode not available" );
return;
}
}
else{
// remove applet from fsFrame and attach to processing frame
for( JFrame frame : frames ){
frame.setVisible( false );
}
//for( JFrame frame : frames ){
// frame.setVisible( false );
//}

AWTUtilities.setWindowOpacity( dad.frame, 0 );
dad.frame.setVisible( true );
dad.requestFocus();

Expand All @@ -201,12 +211,51 @@ else if( fullScreen ){

//GLDrawableHelper.reAllocate( this );
//GLTextureUpdateHelper.update( this );
fullscreenAlpha = 0;
originalAlpha = 1;

notifySketch( dad );
isFullScreen = false;

return;
}

canSwitch = false;
new Thread(){
public void run(){
float origA = 1-originalAlpha;
float fullA = 1-fullscreenAlpha;

while( Math.abs( origA - originalAlpha ) > 0.02 ){
origA += ( originalAlpha - origA )/5f;
fullA += ( fullscreenAlpha - fullA )/5f;
AWTUtilities.setWindowOpacity( dad.frame, origA );
for( JFrame frame : frames ){
AWTUtilities.setWindowOpacity( frame, fullA );
}

try{
Thread.sleep( 20 );
}
catch( InterruptedException e ){
e.printStackTrace();
break;
}
}

AWTUtilities.setWindowOpacity( dad.frame, originalAlpha);
for( JFrame frame : frames ){
AWTUtilities.setWindowOpacity( frame, fullscreenAlpha );
}

//if( originalAlpha == 0 ) dad.frame.setVisible( false );
if( fullscreenAlpha == 0 ){
for( JFrame frame : frames ){
frame.setVisible( false );
}
}

canSwitch = true;
}
}.start();
}


Expand Down Expand Up @@ -235,7 +284,7 @@ public DelayedModeChange( boolean state ){
public void post(){
skippedFrames ++;

if( skippedFrames >= 2 ){
if( skippedFrames >= 2 && canSwitch ){
setFullScreenImpl( state );
dad.unregisterPost( this );
}
Expand Down
6 changes: 5 additions & 1 deletion src/fullscreen/renderers/GLRenderer.java
Expand Up @@ -148,6 +148,10 @@ public Rectangle sketchBoundaries(){

@Override
public void die() {
dad.unregisterPost( this );
dad.unregisterPost( this );
if( texID != 0 ){
detainContext( getContext() );
g.gl.glDeleteTextures( 1, new int[]{ texID }, 0 );
}
}
}

0 comments on commit c9d2e00

Please sign in to comment.