diff --git a/core/todo.txt b/core/todo.txt
index 777cec43e..ba301aff6 100644
--- a/core/todo.txt
+++ b/core/todo.txt
@@ -26,6 +26,8 @@ X backspace key is identified as delete in OpenGL renderers
X https://github.com/processing/processing/issues/3338
X set icon for OpenGL windows
X https://github.com/processing/processing/issues/3348
+X key problem with DELETE, BACKSPACE and CMD in P3D / P2D
+X https://github.com/processing/processing/issues/3352
_ save() and saveFrame() with OPENGL renderer fails
_ https://github.com/processing/processing/issues/3334
@@ -36,7 +38,12 @@ _ size() inside settings() is left alone and can do whatever it wants
_ comments are being removed before size() is getting checked
_ probably remove anything inside settings() as well?
_ fullScreen() method
-_ sort out display stuff
+_ take display into account for fullScreen()
+_ noSmooth()
+_ can only be called inside setup(), show warning elsewhere
+_ is lifted out of setup() and into settings()
+_ goes before the first beginDraw() with createGraphics()
+_ sort out display stuff (bug in the numbering in 3.0a9)
_ Text looks blurry in GL Retina (andres)
_ https://github.com/processing/processing/issues/2739
_ check retina with PGraphicsRetina2D
diff --git a/java/src/processing/mode/java/Debugger.java b/java/src/processing/mode/java/Debugger.java
index bb7c1be72..7c7307839 100644
--- a/java/src/processing/mode/java/Debugger.java
+++ b/java/src/processing/mode/java/Debugger.java
@@ -199,7 +199,8 @@ public class Debugger implements VMEventListener {
log(Level.INFO, "building sketch: {0}", sketch.getName());
//LineMapping.addLineNumbers(sketch); // annotate
- mainClassName = build.build(false);
+// mainClassName = build.build(false);
+ mainClassName = build.build(true);
//LineMapping.removeLineNumbers(sketch); // annotate
log(Level.INFO, "class: {0}", mainClassName);
diff --git a/java/src/processing/mode/java/JavaBuild.java b/java/src/processing/mode/java/JavaBuild.java
index d37a3db92..c6ad74259 100644
--- a/java/src/processing/mode/java/JavaBuild.java
+++ b/java/src/processing/mode/java/JavaBuild.java
@@ -251,6 +251,10 @@ public class JavaBuild {
//String[] sizeParts =
SizeInfo sizeInfo =
preprocessor.initSketchSize(sketch.getMainProgram(), sizeWarning);
+ if (sizeInfo == null) {
+ // An error occurred while trying to pull out the size, so exit here
+ return null;
+ }
//System.out.format("size() is '%s'%n", info[0]);
// Remove the size() statement (will be added back by writeFooter())
@@ -748,344 +752,6 @@ public class JavaBuild {
}
- /*
- protected boolean exportApplet() throws SketchException, IOException {
- return exportApplet(new File(sketch.getFolder(), "applet"));
- }
- */
-
-
- /**
- * Handle export to applet.
- */
- /*
- public boolean exportApplet(File appletFolder) throws SketchException, IOException {
- mode.prepareExportFolder(appletFolder);
-
- srcFolder = sketch.makeTempFolder();
- binFolder = sketch.makeTempFolder();
- String foundName = build(srcFolder, binFolder, true);
-
- // (already reported) error during export, exit this function
- if (foundName == null) return false;
-
- // If name != exportSketchName, then that's weirdness
- // BUG unfortunately, that can also be a bug in the preproc :(
- if (!sketch.getName().equals(foundName)) {
- Base.showWarning("Error during export",
- "Sketch name is " + sketch.getName() + " but the\n" +
- "name found in the code was " + foundName + ".", null);
- return false;
- }
-
- String[] sizeInfo =
- PdePreprocessor.parseSketchSize(sketch.getMainProgram(), false);
- int sketchWidth = PApplet.DEFAULT_WIDTH;
- int sketchHeight = PApplet.DEFAULT_HEIGHT;
- boolean openglApplet = false;
- boolean foundSize = false;
- if (sizeInfo != null) {
- try {
- if (sizeInfo[1] != null && sizeInfo[2] != null) {
- sketchWidth = Integer.parseInt(sizeInfo[1]);
- sketchHeight = Integer.parseInt(sizeInfo[2]);
- foundSize = true;
- }
- } catch (Exception e) {
- e.printStackTrace();
- // parsing errors, whatever; ignored
- }
-
- String sketchRenderer = sizeInfo[3];
- if (sketchRenderer != null) {
- if (sketchRenderer.equals("P2D") ||
- sketchRenderer.equals("P3D") ||
- sketchRenderer.equals("OPENGL")) {
- openglApplet = true;
- }
- }
- }
- if (!foundSize) {
- final String message =
- "The size of this applet could not automatically be\n" +
- "determined from your code. You'll have to edit the\n" +
- "HTML file to set the size of the applet.\n" +
- "Use only numeric values (not variables) for the size()\n" +
- "command. See the size() reference for an explanation.";
- Base.showWarning("Could not find applet size", message, null);
- }
-
-// // If the renderer is set to the built-in OpenGL library,
-// // then it's definitely an OpenGL applet.
-// if (sketchRenderer.equals("P3D") || sketchRenderer.equals("OPENGL")) {
-// openglApplet = true;
-// }
-
-
-// int wide = PApplet.DEFAULT_WIDTH;
-// int high = PApplet.DEFAULT_HEIGHT;
-// String renderer = "";
-//
-// String scrubbed = PdePreprocessor.scrubComments(sketch.getCode(0).getProgram());
-// String[] matches = PApplet.match(scrubbed, PdePreprocessor.SIZE_REGEX);
-//
-// if (matches != null) {
-// try {
-// wide = Integer.parseInt(matches[1]);
-// high = Integer.parseInt(matches[2]);
-//
-// // Adding back the trim() for 0136 to handle Bug #769
-// if (matches.length == 4) renderer = matches[3].trim();
-// // Actually, matches.length should always be 4...
-//
-// } catch (NumberFormatException e) {
-// // found a reference to size, but it didn't
-// // seem to contain numbers
-// final String message =
-// "The size of this applet could not automatically be\n" +
-// "determined from your code. You'll have to edit the\n" +
-// "HTML file to set the size of the applet.\n" +
-// "Use only numeric values (not variables) for the size()\n" +
-// "command. See the size() reference for an explanation.";
-//
-// Base.showWarning("Could not find applet size", message, null);
-// }
-// } // else no size() command found
-
- // Grab the Javadoc-style description from the main code.
- String description = "";
- // If there are multiple closings, need to catch the first,
- // which is what the (.*?) will do for us.
- // http://code.google.com/p/processing/issues/detail?id=877
- String[] javadoc = PApplet.match(sketch.getCode(0).getProgram(), "/\\*{2,}(.*?)\\*+/");
- if (javadoc != null) {
- StringBuffer dbuffer = new StringBuffer();
- String found = javadoc[1];
- String[] pieces = PApplet.split(found, '\n');
- for (String line : pieces) {
- // if this line starts with * characters, remove 'em
- String[] m = PApplet.match(line, "^\\s*\\*+(.*)");
- dbuffer.append(m != null ? m[1] : line);
- // insert the new line into the html to help w/ line breaks
- dbuffer.append('\n');
- }
- description = dbuffer.toString();
- }
-
- // Add links to all the code
- StringBuffer sources = new StringBuffer();
- //for (int i = 0; i < codeCount; i++) {
- for (SketchCode code : sketch.getCode()) {
- sources.append("" +
- code.getPrettyName() + " ");
- }
-
- // Copy the source files to the target, since we like
- // to encourage people to share their code
-// for (int i = 0; i < codeCount; i++) {
- for (SketchCode code : sketch.getCode()) {
- try {
- File exportedSource = new File(appletFolder, code.getFileName());
- //Base.copyFile(code[i].getFile(), exportedSource);
- code.copyTo(exportedSource);
-
- } catch (IOException e) {
- e.printStackTrace(); // ho hum, just move on...
- }
- }
- // move the .java file from the preproc there too
- String preprocFilename = sketch.getName() + ".java";
- File preprocFile = new File(srcFolder, preprocFilename);
- if (preprocFile.exists()) {
- preprocFile.renameTo(new File(appletFolder, preprocFilename));
- } else {
- System.err.println("Could not copy source file: " + preprocFile.getAbsolutePath());
- }
-
- // Use separate .jar files whenever a library or code folder is in use.
- boolean separateJar =
- Preferences.getBoolean("export.applet.separate_jar_files") ||
- sketch.hasCodeFolder() ||
- javaLibraryPath.length() != 0;
-
- File skeletonFolder = mode.getContentFile("applet");
-
- // Copy the loading gif to the applet
- String LOADING_IMAGE = "loading.gif";
- // Check if the user already has their own loader image
- File loadingImage = new File(sketch.getFolder(), LOADING_IMAGE);
- if (!loadingImage.exists()) {
-// File skeletonFolder = new File(Base.getContentFile("lib"), "export");
- loadingImage = new File(skeletonFolder, LOADING_IMAGE);
- }
- Base.copyFile(loadingImage, new File(appletFolder, LOADING_IMAGE));
-
- // not a good idea after all
-// File deployFile = new File(skeletonFolder, "deployJava.js");
-// Base.copyFile(deployFile, new File(appletFolder, "deployJava.js"));
-
- // Create new .jar file
- FileOutputStream zipOutputFile =
- new FileOutputStream(new File(appletFolder, sketch.getName() + ".jar"));
- ZipOutputStream zos = new ZipOutputStream(zipOutputFile);
-// ZipEntry entry;
-
- StringBuffer archives = new StringBuffer();
- archives.append(sketch.getName() + ".jar");
-
- // Add the manifest file
- addManifest(zos);
-
-// File openglLibraryFolder =
-// new File(editor.getMode().getLibrariesFolder(), "opengl/library");
-// String openglLibraryPath = openglLibraryFolder.getAbsolutePath();
-// boolean openglApplet = false;
-
- HashMap zipFileContents = new HashMap();
-
- // add contents of 'library' folders
- for (Library library : importedLibraries) {
-// if (library.getPath().equals(openglLibraryPath)) {
- if (library.getName().equals("OpenGL")) {
- openglApplet = true;
- }
- for (File exportFile : library.getAppletExports()) {
- String exportName = exportFile.getName();
- if (!exportFile.exists()) {
- System.err.println("File " + exportFile.getAbsolutePath() + " does not exist");
-
- } else if (exportFile.isDirectory()) {
- System.out.println("Ignoring sub-folder \"" + exportFile.getAbsolutePath() + "\"");
-
- } else if (exportName.toLowerCase().endsWith(".zip") ||
- exportName.toLowerCase().endsWith(".jar")) {
- if (separateJar) {
- Base.copyFile(exportFile, new File(appletFolder, exportName));
- archives.append("," + exportName);
- } else {
- String path = exportFile.getAbsolutePath();
- packClassPathIntoZipFile(path, zos, zipFileContents);
- }
-
- } else { // just copy the file over.. prolly a .dll or something
- Base.copyFile(exportFile, new File(appletFolder, exportName));
- }
- }
- }
-
- // Copy core.jar, or add its contents to the output .jar file
- File bagelJar = Base.isMacOS() ?
- Base.getContentFile("core.jar") :
- Base.getContentFile("lib/core.jar");
- if (separateJar) {
- Base.copyFile(bagelJar, new File(appletFolder, "core.jar"));
- archives.append(",core.jar");
- } else {
- String bagelJarPath = bagelJar.getAbsolutePath();
- packClassPathIntoZipFile(bagelJarPath, zos, zipFileContents);
- }
-
- if (sketch.hasCodeFolder()) {
- File[] codeJarFiles = sketch.getCodeFolder().listFiles(new FilenameFilter() {
- public boolean accept(File dir, String name) {
- if (name.charAt(0) == '.') return false;
- if (name.toLowerCase().endsWith(".jar")) return true;
- if (name.toLowerCase().endsWith(".zip")) return true;
- return false;
- }
- });
- for (File exportFile : codeJarFiles) {
- String name = exportFile.getName();
- Base.copyFile(exportFile, new File(appletFolder, name));
- archives.append("," + name);
- }
- }
-
- // Add the data folder to the output .jar file
- addDataFolder(zos);
-
- // add the project's .class files to the jar
- // just grabs everything from the build directory
- // since there may be some inner classes
- // (add any .class files from the applet dir, then delete them)
- // TODO this needs to be recursive (for packages)
- addClasses(zos, binFolder);
-
- // close up the jar file
- zos.flush();
- zos.close();
-
- //
-
- // convert the applet template
- // @@sketch@@, @@width@@, @@height@@, @@archive@@, @@source@@
- // and now @@description@@
-
- File htmlOutputFile = new File(appletFolder, "index.html");
- // UTF-8 fixes http://dev.processing.org/bugs/show_bug.cgi?id=474
- PrintWriter htmlWriter = PApplet.createWriter(htmlOutputFile);
-
- InputStream is = null;
- // if there is an applet.html file in the sketch folder, use that
- File customHtml = new File(sketch.getFolder(), "applet.html");
- if (customHtml.exists()) {
- is = new FileInputStream(customHtml);
- }
-// for (File libraryFolder : importedLibraries) {
-// System.out.println(libraryFolder + " " + libraryFolder.getAbsolutePath());
-// }
- if (is == null) {
- if (openglApplet) {
- is = mode.getContentStream("applet/template-opengl.html");
- } else {
- is = mode.getContentStream("applet/template.html");
- }
- }
- BufferedReader reader = PApplet.createReader(is);
-
- String line = null;
- while ((line = reader.readLine()) != null) {
- if (line.indexOf("@@") != -1) {
- StringBuffer sb = new StringBuffer(line);
- int index = 0;
- while ((index = sb.indexOf("@@sketch@@")) != -1) {
- sb.replace(index, index + "@@sketch@@".length(),
- sketch.getName());
- }
- while ((index = sb.indexOf("@@source@@")) != -1) {
- sb.replace(index, index + "@@source@@".length(),
- sources.toString());
- }
- while ((index = sb.indexOf("@@archive@@")) != -1) {
- sb.replace(index, index + "@@archive@@".length(),
- archives.toString());
- }
- while ((index = sb.indexOf("@@width@@")) != -1) {
- sb.replace(index, index + "@@width@@".length(),
- String.valueOf(sketchWidth));
- }
- while ((index = sb.indexOf("@@height@@")) != -1) {
- sb.replace(index, index + "@@height@@".length(),
- String.valueOf(sketchHeight));
- }
- while ((index = sb.indexOf("@@description@@")) != -1) {
- sb.replace(index, index + "@@description@@".length(),
- description);
- }
- line = sb.toString();
- }
- htmlWriter.println(line);
- }
-
- reader.close();
- htmlWriter.flush();
- htmlWriter.close();
-
- return true;
- }
- */
-
-
/**
* Export to application via GUI.
*/
diff --git a/java/src/processing/mode/java/JavaMode.java b/java/src/processing/mode/java/JavaMode.java
index 9933cfcba..3a9f75e54 100644
--- a/java/src/processing/mode/java/JavaMode.java
+++ b/java/src/processing/mode/java/JavaMode.java
@@ -50,7 +50,7 @@ public class JavaMode extends Mode {
loadPreferences();
loadIcons();
}
-
+
/**
* Needed by code completion panel. See {@link processing.mode.java.pdex.CompletionPanel}
*/
@@ -148,7 +148,8 @@ public class JavaMode extends Mode {
public Runner handleLaunch(Sketch sketch, RunnerListener listener,
final boolean present) throws SketchException {
JavaBuild build = new JavaBuild(sketch);
- String appletClassName = build.build(false);
+// String appletClassName = build.build(false);
+ String appletClassName = build.build(true);
if (appletClassName != null) {
final Runner runtime = new Runner(build, listener);
new Thread(new Runnable() {
@@ -177,7 +178,8 @@ public class JavaMode extends Mode {
// first try to build the unmodified code
JavaBuild build = new JavaBuild(sketch);
- String appletClassName = build.build(false);
+// String appletClassName = build.build(false);
+ String appletClassName = build.build(true);
if (appletClassName == null) {
// unmodified build failed, so fail
return null;
@@ -331,7 +333,7 @@ public class JavaMode extends Mode {
static public final String prefImportSuggestEnabled = "pdex.importSuggestEnabled";
static volatile public boolean enableTweak = false;
-
+
static public ImageIcon classIcon;
static public ImageIcon fieldIcon;
static public ImageIcon methodIcon;
diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java
index e4651e34c..ae5e59d4a 100644
--- a/java/src/processing/mode/java/preproc/PdePreprocessor.java
+++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java
@@ -167,9 +167,10 @@ public class PdePreprocessor {
"(?:^|\\s|;)size\\s*\\(([^\\)]+)\\)\\s*\\;";
static private final String FULL_SCREEN_CONTENTS_REGEX =
"(?:^|\\s|;)fullScreen\\s*\\(([^\\)]+)\\)\\s*\\;";
- /** Test whether there's a void somewhere (the program has functions). */
- static private final String VOID_REGEX =
- "(?:^|\\s|;)void\\s";
+// /** Test whether there's a void somewhere (the program has functions). */
+// static private final String VOID_REGEX =
+// "(?:^|\\s|;)void\\s";
+ /** Used to grab the start of setup() so we can mine it for size() */
static private final String VOID_SETUP_REGEX =
"(?:^|\\s|;)void\\ssetup\\s*\\(";