From 176554545f88725a8dba5fdaa95ff1f1e48cdef5 Mon Sep 17 00:00:00 2001 From: trembovetski Date: Fri, 14 Aug 2009 18:04:15 -0700 Subject: newt: added expose/paint event notification needed for passive rendering. Currently only implemented on Windows. --- .../classes/com/sun/javafx/newt/PaintEvent.java | 74 ++++++++++++++++++++++ .../classes/com/sun/javafx/newt/PaintListener.java | 42 ++++++++++++ src/newt/classes/com/sun/javafx/newt/Window.java | 42 ++++++++++++ src/newt/native/WindowsWindow.c | 20 +++++- 4 files changed, 177 insertions(+), 1 deletion(-) create mode 100755 src/newt/classes/com/sun/javafx/newt/PaintEvent.java create mode 100755 src/newt/classes/com/sun/javafx/newt/PaintListener.java (limited to 'src') diff --git a/src/newt/classes/com/sun/javafx/newt/PaintEvent.java b/src/newt/classes/com/sun/javafx/newt/PaintEvent.java new file mode 100755 index 000000000..b27b969da --- /dev/null +++ b/src/newt/classes/com/sun/javafx/newt/PaintEvent.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2009 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + */ + +package com.sun.javafx.newt; + +/** + * + * @author tdv + */ +public class PaintEvent extends Event { + + // bounds of the damage region + private int x, y, width, height; + public PaintEvent(int eventType, Window source, + long when, int x, int y, int w, int h) + { + super(true, eventType, source, when); + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + + public int getHeight() { + return height; + } + + public int getWidth() { + return width; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public String toString() { + return "ExposeEvent[modifiers: x="+x+" y="+y+" w="+width+" h="+height +"]"; + } + +} diff --git a/src/newt/classes/com/sun/javafx/newt/PaintListener.java b/src/newt/classes/com/sun/javafx/newt/PaintListener.java new file mode 100755 index 000000000..fab5fa35c --- /dev/null +++ b/src/newt/classes/com/sun/javafx/newt/PaintListener.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2009 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + */ + +package com.sun.javafx.newt; + +/** + * + * @author tdv + */ +public interface PaintListener { + public void exposed(PaintEvent e); +} diff --git a/src/newt/classes/com/sun/javafx/newt/Window.java b/src/newt/classes/com/sun/javafx/newt/Window.java index e2903bd62..8970298d6 100755 --- a/src/newt/classes/com/sun/javafx/newt/Window.java +++ b/src/newt/classes/com/sun/javafx/newt/Window.java @@ -651,4 +651,46 @@ public abstract class Window implements NativeWindow } } } + + + // + // WindowListener Support + // + + private ArrayList paintListeners = new ArrayList(); + + public void addPaintListener(PaintListener l) { + if(l == null) { + return; + } + synchronized(paintListeners) { + ArrayList newPaintListeners = (ArrayList) paintListeners.clone(); + newPaintListeners.add(l); + paintListeners = newPaintListeners; + } + } + + public void removePaintListener(PaintListener l) { + if (l == null) { + return; + } + synchronized(paintListeners) { + ArrayList newPaintListeners = (ArrayList) paintListeners.clone(); + newPaintListeners.remove(l); + paintListeners = newPaintListeners; + } + } + + protected void sendPaintEvent(int eventType, int x, int y, int w, int h) { + PaintEvent e = + new PaintEvent(eventType, this, System.currentTimeMillis(), x, y, w, h); + ArrayList listeners = null; + synchronized(paintListeners) { + listeners = paintListeners; + } + for(Iterator i = listeners.iterator(); i.hasNext(); ) { + PaintListener l = (PaintListener) i.next(); + l.exposed(e); + } + } } diff --git a/src/newt/native/WindowsWindow.c b/src/newt/native/WindowsWindow.c index 67fbd3f07..5bd929ef7 100755 --- a/src/newt/native/WindowsWindow.c +++ b/src/newt/native/WindowsWindow.c @@ -103,6 +103,7 @@ static jmethodID windowDestroyNotifyID = NULL; static jmethodID windowDestroyedID = NULL; static jmethodID sendMouseEventID = NULL; static jmethodID sendKeyEventID = NULL; +static jmethodID sendPaintEventID = NULL; typedef struct { JNIEnv* jenv; @@ -761,6 +762,20 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message, useDefWindowProc = 1; break; + case WM_PAINT: { + RECT r; + if (GetUpdateRect(wnd, &r, FALSE)) { + if ((r.right-r.left) > 0 && (r.bottom-r.top) > 0) { + (*env)->CallVoidMethod(env, window, sendPaintEventID, + 0, r.left, r.top, r.right-r.left, r.bottom-r.top); + } + ValidateRect(wnd, &r); + useDefWindowProc = 0; + } else { + useDefWindowProc = 1; + } + break; + } case WM_ERASEBKGND: // ignore erase background useDefWindowProc = 0; @@ -902,13 +917,16 @@ JNIEXPORT jboolean JNICALL Java_com_sun_javafx_newt_windows_WindowsWindow_initID windowDestroyedID = (*env)->GetMethodID(env, clazz, "windowDestroyed", "()V"); sendMouseEventID = (*env)->GetMethodID(env, clazz, "sendMouseEvent", "(IIIIII)V"); sendKeyEventID = (*env)->GetMethodID(env, clazz, "sendKeyEvent", "(IIIC)V"); + sendPaintEventID = (*env)->GetMethodID(env, clazz, "sendPaintEvent", "(IIIII)V"); if (sizeChangedID == NULL || positionChangedID == NULL || focusChangedID == NULL || windowDestroyNotifyID == NULL || windowDestroyedID == NULL || sendMouseEventID == NULL || - sendKeyEventID == NULL) { + sendPaintEventID == NULL || + sendKeyEventID == NULL) + { return JNI_FALSE; } BuildDynamicKeyMapTable(); -- cgit v1.2.3