/*
* @(#)QtGraphicsEnvironment.java 1.5 06/10/10
*
* Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* 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 version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*/
package java.awt;
import java.util.Locale;
import java.awt.image.BufferedImage;
import java.security.*;
/**
* This is an implementation of a GraphicsEnvironment object Qtfor the
* default local GraphicsEnvironment used by the JavaSoft JDK in Qt
* environments.
*
* @see GraphicsDevice
* @see GraphicsConfiguration
* @version 10 Feb 1997
*/
class QtGraphicsEnvironment extends GraphicsEnvironment {
QtGraphicsDevice defaultScreenDevice;
private static native void init();
private static native int initfb();
private native void destroy();
private static Thread eventThread;
static native void QTprocessEvents();
private native void QTexec();
private native void QTshutdown();
private boolean shutdown = false; // is qt shutdown ?
QtGraphicsEnvironment() {
java.security.AccessController.doPrivileged(
new sun.security.action.LoadLibraryAction("qtawt"));
Runtime.getRuntime().addShutdownHook(createShutdownHook());
init();
eventThread = createEventThread();
eventThread.setPriority(Thread.NORM_PRIORITY+1);
eventThread.start();
// initfb() creates the QApplication and the QWidget that backs
// the screen and must be done within the Qt event thread. so
// we wait till the graphics device is created (See eventThread.run())
synchronized (this) {
while ( this.defaultScreenDevice == null ) {
try { this.wait() ; }
catch ( Exception ex ) {}
}
}
}
public synchronized GraphicsDevice[] getScreenDevices() {
return new GraphicsDevice[] {defaultScreenDevice};
}
/**
* Returns the default screen graphics device.
*/
public GraphicsDevice getDefaultScreenDevice() {
return defaultScreenDevice;
}
public String[] getAvailableFontFamilyNames() {
return QtFontMetrics.getFontList();
}
public String[] getAvailableFontFamilyNames(Locale l) {
return QtFontMetrics.getFontList();
}
void setWindow(QtGraphicsDevice device, Window window) {
pSetWindow(device.psd, window);
}
private native void pSetWindow(int psd, Window window);
/**
* Returns a <code>Graphics2D</code> object for rendering into the
* specified {@link BufferedImage}.
* @param img the specified <code>BufferedImage</code>
* @return a <code>Graphics2D</code> to be used for rendering into
* the specified <code>BufferedImage</code>.
*/
public Graphics2D createGraphics(BufferedImage img){
return img.createGraphics();
}
Thread createEventThread() {
Thread thread =
new Thread("AWT-Qt-EventThread") {
public void run() {
// create the graphics device. initfb() creates the
// QApplication
QtGraphicsEnvironment.this.defaultScreenDevice =
new QtGraphicsDevice(QtGraphicsEnvironment.this, initfb());
// notify that the graphics device has been created.
synchronized (QtGraphicsEnvironment.this) {
QtGraphicsEnvironment.this.notifyAll();
}
// start the event loop
while(true) {
QtGraphicsEnvironment.this.QTexec();
if ( QtGraphicsEnvironment.this.shutdown ) {
break;
}
}
}
};
return thread;
}
Thread createShutdownHook() {
Thread thread =
new Thread("AWT-Qt-ShutdownThread") {
public void run() {
QtGraphicsEnvironment.this.shutdown = true;
QtGraphicsEnvironment.this.QTshutdown();
QtGraphicsEnvironment.this.destroy();
}
};
return thread;
}
// The following two methods support the old qtpoll threads
//
// Thread createEventThread() {
// return new Thread("AWT-Qt-EventThread") {
// public void run() {
// while(!isInterrupted()) {
// try { Thread.sleep(60); }
// catch (InterruptedException e) { }
// synchronized(QtGraphics.MONSTERLOCK) {
// QTprocessEvents();
// }
// }
// }
// };
// }
// Thread createShutdownHook() {
// return new Thread("AWT-Qt-ShutdownThread") {
// public void run() {
// eventThread.interrupt();
// QtGraphicsEnvironment.this.destroy();
// }
// };
// }
/*
protected void finalize() throws Throwable
{
destroy();
super.finalize();
}
*/
}