001: /*
002: * @(#)QtGraphicsEnvironment.java 1.5 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package java.awt;
028:
029: import java.util.Locale;
030: import java.awt.image.BufferedImage;
031: import java.security.*;
032:
033: /**
034: * This is an implementation of a GraphicsEnvironment object Qtfor the
035: * default local GraphicsEnvironment used by the JavaSoft JDK in Qt
036: * environments.
037: *
038: * @see GraphicsDevice
039: * @see GraphicsConfiguration
040: * @version 10 Feb 1997
041: */
042:
043: class QtGraphicsEnvironment extends GraphicsEnvironment {
044:
045: QtGraphicsDevice defaultScreenDevice;
046:
047: private static native void init();
048:
049: private static native int initfb();
050:
051: private native void destroy();
052:
053: private static Thread eventThread;
054:
055: static native void QTprocessEvents();
056:
057: private native void QTexec();
058:
059: private native void QTshutdown();
060:
061: private boolean shutdown = false; // is qt shutdown ?
062:
063: QtGraphicsEnvironment() {
064:
065: java.security.AccessController
066: .doPrivileged(new sun.security.action.LoadLibraryAction(
067: "qtawt"));
068:
069: Runtime.getRuntime().addShutdownHook(createShutdownHook());
070:
071: init();
072:
073: eventThread = createEventThread();
074: eventThread.setPriority(Thread.NORM_PRIORITY + 1);
075: eventThread.start();
076:
077: // initfb() creates the QApplication and the QWidget that backs
078: // the screen and must be done within the Qt event thread. so
079: // we wait till the graphics device is created (See eventThread.run())
080:
081: synchronized (this ) {
082: while (this .defaultScreenDevice == null) {
083: try {
084: this .wait();
085: } catch (Exception ex) {
086: }
087: }
088: }
089: }
090:
091: public synchronized GraphicsDevice[] getScreenDevices() {
092: return new GraphicsDevice[] { defaultScreenDevice };
093: }
094:
095: /**
096: * Returns the default screen graphics device.
097: */
098:
099: public GraphicsDevice getDefaultScreenDevice() {
100: return defaultScreenDevice;
101: }
102:
103: public String[] getAvailableFontFamilyNames() {
104: return QtFontMetrics.getFontList();
105: }
106:
107: public String[] getAvailableFontFamilyNames(Locale l) {
108: return QtFontMetrics.getFontList();
109: }
110:
111: void setWindow(QtGraphicsDevice device, Window window) {
112:
113: pSetWindow(device.psd, window);
114: }
115:
116: private native void pSetWindow(int psd, Window window);
117:
118: /**
119: * Returns a <code>Graphics2D</code> object for rendering into the
120: * specified {@link BufferedImage}.
121: * @param img the specified <code>BufferedImage</code>
122: * @return a <code>Graphics2D</code> to be used for rendering into
123: * the specified <code>BufferedImage</code>.
124: */
125: public Graphics2D createGraphics(BufferedImage img) {
126: return img.createGraphics();
127: }
128:
129: Thread createEventThread() {
130: Thread thread = new Thread("AWT-Qt-EventThread") {
131: public void run() {
132: // create the graphics device. initfb() creates the
133: // QApplication
134: QtGraphicsEnvironment.this .defaultScreenDevice = new QtGraphicsDevice(
135: QtGraphicsEnvironment.this , initfb());
136:
137: // notify that the graphics device has been created.
138: synchronized (QtGraphicsEnvironment.this ) {
139: QtGraphicsEnvironment.this .notifyAll();
140: }
141:
142: // start the event loop
143: while (true) {
144: QtGraphicsEnvironment.this .QTexec();
145: if (QtGraphicsEnvironment.this .shutdown) {
146: break;
147: }
148: }
149: }
150: };
151:
152: return thread;
153: }
154:
155: Thread createShutdownHook() {
156: Thread thread = new Thread("AWT-Qt-ShutdownThread") {
157: public void run() {
158: QtGraphicsEnvironment.this .shutdown = true;
159: QtGraphicsEnvironment.this .QTshutdown();
160: QtGraphicsEnvironment.this .destroy();
161: }
162: };
163: return thread;
164: }
165:
166: // The following two methods support the old qtpoll threads
167: //
168: // Thread createEventThread() {
169: // return new Thread("AWT-Qt-EventThread") {
170: // public void run() {
171: // while(!isInterrupted()) {
172: // try { Thread.sleep(60); }
173: // catch (InterruptedException e) { }
174: // synchronized(QtGraphics.MONSTERLOCK) {
175: // QTprocessEvents();
176: // }
177: // }
178: // }
179: // };
180: // }
181:
182: // Thread createShutdownHook() {
183: // return new Thread("AWT-Qt-ShutdownThread") {
184: // public void run() {
185: // eventThread.interrupt();
186: // QtGraphicsEnvironment.this.destroy();
187: // }
188: // };
189: // }
190:
191: /*
192: protected void finalize() throws Throwable
193: {
194: destroy();
195: super.finalize();
196: }
197: */
198: }
|