From 84e5ca16e6497affd0a9602a5d93487c3f933e2c Mon Sep 17 00:00:00 2001 From: Akarshit Wal Date: Thu, 1 Oct 2015 22:29:10 +0530 Subject: [PATCH 001/172] Core libraries added to the count of updates --- app/src/processing/app/contrib/ContributionListing.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/processing/app/contrib/ContributionListing.java b/app/src/processing/app/contrib/ContributionListing.java index cf35ff628c..bd3460d645 100644 --- a/app/src/processing/app/contrib/ContributionListing.java +++ b/app/src/processing/app/contrib/ContributionListing.java @@ -580,6 +580,11 @@ public int countUpdates(Base base) { count++; } } + for (Library lib : base.getActiveEditor().getMode().coreLibraries) { + if (hasUpdates(lib)) { + count++; + } + } for (ToolContribution tc : base.getToolContribs()) { if (hasUpdates(tc)) { count++; From 0eb5ba518ac40343a68cef09a13ecf9c9e5ce0fe Mon Sep 17 00:00:00 2001 From: Jeremy Laviole Date: Tue, 24 Nov 2015 17:55:40 +0100 Subject: [PATCH 002/172] Support of embedded images in SVGs, linked images are supported but should not be avoided if possible. Support of Text in SVGs (partial). Multiline text are also displayed. Text limitations : Inline styles are not supported. Not all fonts are supported (depending on your OS). Tested only on Inkscape SVGs. --- core/src/processing/core/PShape.java | 111 +++++++++++-- core/src/processing/core/PShapeSVG.java | 199 +++++++++++++++++++++++- 2 files changed, 291 insertions(+), 19 deletions(-) diff --git a/core/src/processing/core/PShape.java b/core/src/processing/core/PShape.java index 44ff15115c..03de66203f 100644 --- a/core/src/processing/core/PShape.java +++ b/core/src/processing/core/PShape.java @@ -22,8 +22,23 @@ package processing.core; +import java.awt.Image; +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; +import java.util.Base64.Decoder; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.nio.charset.StandardCharsets; +import javax.swing.ImageIcon; +import javax.xml.bind.DatatypeConverter; + + import processing.core.PApplet; @@ -106,6 +121,7 @@ public class PShape implements PConstants { /** Texture or image data associated with this shape. */ protected PImage image; + protected String imagePath = null; public static final String OUTSIDE_BEGIN_END_ERROR = "%1$s can only be called between beginShape() and endShape()"; @@ -1645,6 +1661,10 @@ protected void drawPrimitive(PGraphics g) { params[6], params[7]); } else if (kind == RECT) { + + if (imagePath != null){ + loadImage(g); + } if (image != null) { int oldMode = g.imageMode; g.imageMode(CORNER); @@ -1879,6 +1899,63 @@ protected void drawPath(PGraphics g) { g.endShape(close ? CLOSE : OPEN); } + private void loadImage(PGraphics g){ + + if(this.imagePath.startsWith("data:image")){ + loadBase64Image(); + } + + if(this.imagePath.startsWith("file://")){ + loadFileSystemImage(g); + } + this.imagePath = null; + } + + private void loadFileSystemImage(PGraphics g){ + imagePath = imagePath.substring(7); + PImage loadedImage = g.parent.loadImage(imagePath); + if(loadedImage == null){ + System.err.println("Error loading image file: " + imagePath); + }else{ + setTexture(loadedImage); + } + } + + private void loadBase64Image(){ + String[] parts = this.imagePath.split(";base64,"); + String extension = parts[0].substring(11); + String encodedData = parts[1]; + + byte[] decodedBytes = DatatypeConverter.parseBase64Binary(encodedData); + + if(decodedBytes == null){ + System.err.println("Decode Error on image: " + imagePath.substring(0, 20)); + return; + } + + Image awtImage = new ImageIcon(decodedBytes).getImage(); + + if (awtImage instanceof BufferedImage) { + BufferedImage buffImage = (BufferedImage) awtImage; + int space = buffImage.getColorModel().getColorSpace().getType(); + if (space == ColorSpace.TYPE_CMYK) { + return; + } + } + + PImage loadedImage = new PImage(awtImage); + if (loadedImage.width == -1) { + // error... + } + + // if it's a .gif image, test to see if it has transparency + if (extension.equals("gif") || extension.equals("png") || + extension.equals("unknown")) { + loadedImage.checkAlpha(); + } + + setTexture(loadedImage); + } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -2387,14 +2464,14 @@ public void setFill(boolean fill) { /** * ( begin auto-generated from PShape_setFill.xml ) * - * The setFill() method defines the fill color of a PShape. - * This method is used after shapes are created or when a shape is defined explicitly - * (e.g. createShape(RECT, 20, 20, 80, 80)) as shown in the above example. - * When a shape is created with beginShape() and endShape(), its - * attributes may be changed with fill() and stroke() within - * beginShape() and endShape(). However, after the shape is - * created, only the setFill() method can define a new fill value for - * the PShape. + * The setFill() method defines the fill color of a PShape. + * This method is used after shapes are created or when a shape is defined explicitly + * (e.g. createShape(RECT, 20, 20, 80, 80)) as shown in the above example. + * When a shape is created with beginShape() and endShape(), its + * attributes may be changed with fill() and stroke() within + * beginShape() and endShape(). However, after the shape is + * created, only the setFill() method can define a new fill value for + * the PShape. * * ( end auto-generated ) * @@ -2543,14 +2620,14 @@ public void setStroke(boolean stroke) { /** * ( begin auto-generated from PShape_setStroke.xml ) * - * The setStroke() method defines the outline color of a PShape. - * This method is used after shapes are created or when a shape is defined - * explicitly (e.g. createShape(RECT, 20, 20, 80, 80)) as shown in - * the above example. When a shape is created with beginShape() and - * endShape(), its attributes may be changed with fill() and - * stroke() within beginShape() and endShape(). - * However, after the shape is created, only the setStroke() method - * can define a new stroke value for the PShape. + * The setStroke() method defines the outline color of a PShape. + * This method is used after shapes are created or when a shape is defined + * explicitly (e.g. createShape(RECT, 20, 20, 80, 80)) as shown in + * the above example. When a shape is created with beginShape() and + * endShape(), its attributes may be changed with fill() and + * stroke() within beginShape() and endShape(). + * However, after the shape is created, only the setStroke() method + * can define a new stroke value for the PShape. * * ( end auto-generated ) * @@ -3442,4 +3519,4 @@ protected void colorCalcARGB(int argb, float alpha) { calcAlpha = (calcAi != 255); } -} \ No newline at end of file +} diff --git a/core/src/processing/core/PShapeSVG.java b/core/src/processing/core/PShapeSVG.java index bf5cdc2f1f..adc1763bb0 100644 --- a/core/src/processing/core/PShapeSVG.java +++ b/core/src/processing/core/PShapeSVG.java @@ -24,6 +24,9 @@ package processing.core; +import static java.awt.Font.BOLD; +import static java.awt.Font.ITALIC; +import static java.awt.Font.PLAIN; import processing.data.*; // TODO replace these with PMatrix2D @@ -329,6 +332,10 @@ protected PShape parseChild(XML elem) { } else if (name.equals("rect")) { shape = createShape(this, elem, true); shape.parseRect(); + + } else if (name.equals("image")) { + shape = createShape(this, elem, true); + shape.parseImage(); } else if (name.equals("polygon")) { shape = createShape(this, elem, true); @@ -358,8 +365,10 @@ protected PShape parseChild(XML elem) { // return new FontGlyph(this, elem); } else if (name.equals("text")) { // || name.equals("font")) { - PGraphics.showWarning("Text and fonts in SVG files are " + - "not currently supported, convert text to outlines instead."); + return new Text(this, elem); + + } else if (name.equals("tspan")) { + return new LineOfText(this, elem); } else if (name.equals("filter")) { PGraphics.showWarning("Filters are not supported."); @@ -439,8 +448,23 @@ protected void parseRect() { getFloatWithUnit(element, "height", svgHeight) }; } + + + protected void parseImage() { + kind = RECT; + textureMode = NORMAL; + family = PRIMITIVE; + params = new float[] { + getFloatWithUnit(element, "x", svgWidth), + getFloatWithUnit(element, "y", svgHeight), + getFloatWithUnit(element, "width", svgWidth), + getFloatWithUnit(element, "height", svgHeight) + }; + this.imagePath = element.getString("xlink:href"); + } + /** * Parse a polyline or polygon from an SVG file. * Syntax defined at http://www.w3.org/TR/SVG/shapes.html#PointsBNF @@ -1557,8 +1581,179 @@ public RadialGradient(PShapeSVG parent, XML properties) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + public static float TEXT_QUALITY = 1; + protected PFont parseFont(XML properties) { + +// FontFace fontFace = new FontFace(this, properties); + String fontFamily = null; + float size = 10; + int weight = PLAIN; // 0 + int italic = 0; + + if (properties.hasAttribute("style")) { + String styleText = properties.getString("style"); + String[] styleTokens = PApplet.splitTokens(styleText, ";"); + + //PApplet.println(styleTokens); + for (int i = 0; i < styleTokens.length; i++) { + + String[] tokens = PApplet.splitTokens(styleTokens[i], ":"); + //PApplet.println(tokens); + + tokens[0] = PApplet.trim(tokens[0]); + + if (tokens[0].equals("font-style")) { + // PApplet.println("font-style: " + tokens[1]); + if (tokens[1].contains("italic")) { + italic = ITALIC; + } + } else if (tokens[0].equals("font-variant")) { + // PApplet.println("font-variant: " + tokens[1]); + // setFillOpacity(tokens[1]); + + } else if (tokens[0].equals("font-weight")) { + // PApplet.println("font-weight: " + tokens[1]); + + if (tokens[1].contains("bold")) { + weight = BOLD; + // PApplet.println("Bold weight ! "); + } + + + } else if (tokens[0].equals("font-stretch")) { + // not supported. + + } else if (tokens[0].equals("font-size")) { + // PApplet.println("font-size: " + tokens[1]); + size = Float.parseFloat(tokens[1].split("px")[0]); + // PApplet.println("font-size-parsed: " + size); + } else if (tokens[0].equals("line-height")) { + // not supported + + } else if (tokens[0].equals("font-family")) { + // PApplet.println("Font-family: " + tokens[1]); + fontFamily = tokens[1]; + + } else if (tokens[0].equals("text-align")) { + // not supported + + } else if (tokens[0].equals("letter-spacing")) { + // not supported + + } else if (tokens[0].equals("word-spacing")) { + // not supported + + } else if (tokens[0].equals("writing-mode")) { + // not supported + + } else if (tokens[0].equals("text-anchor")) { + // not supported + + } else { + // Other attributes are not yet implemented + } + } + } + if (fontFamily == null) { + return null; + } + size = size * TEXT_QUALITY; + + return createFont(fontFamily, weight | italic, size, true); + } + + protected PFont createFont(String name, int weight, float size, boolean smooth) { + +// System.out.println("Try to create a font of " + name + " family, " + weight); + java.awt.Font baseFont = new java.awt.Font(name, weight, (int) size); // PFont.findFont(name);ç + +// System.out.println("Resulting family : " + baseFont.getFamily() + " " + baseFont.getStyle()); + PFont outputPFont = new PFont(baseFont.deriveFont(size), smooth, null); + +// System.out.println("Resulting PFont family : " + outputPFont.getName()); + return outputPFont; + } + + public static class Text extends PShapeSVG { + + protected PFont font; + + public Text(PShapeSVG parent, XML properties) { + super(parent, properties, true); + + // get location + float x = Float.parseFloat(properties.getString("x")); + float y = Float.parseFloat(properties.getString("y")); + + if (matrix == null) { + matrix = new PMatrix2D(); + } + matrix.translate(x, y); + + family = GROUP; + + font = parseFont(properties); + } + +// @Override +// public void drawImpl(PGraphics g){ +// } + } + + public static class LineOfText extends PShapeSVG { + String textToDisplay; + PFont font; + + public LineOfText(PShapeSVG parent, XML properties) { + + // TODO: child should ideally be parsed too... + // for inline content. + super(parent, properties, false); + +// // get location + float x = Float.parseFloat(properties.getString("x")); + float y = Float.parseFloat(properties.getString("y")); + + float parentX = Float.parseFloat(parent.element.getString("x")); + float parentY = Float.parseFloat(parent.element.getString("y")); + + if (matrix == null) matrix = new PMatrix2D(); + matrix.translate(x - parentX, (y - parentY) / 2f); + + // get the first properties + parseColors(properties); + font = parseFont(properties); + + // It is a line.. + boolean isALine = properties.getString("role") == "line"; + // NO inline content yet. + if (this.childCount > 0) { + } + + String text = properties.getContent(); + textToDisplay = text; + } + + @Override + public void drawImpl(PGraphics g) { + if (font == null) { + font = ((Text) parent).font; + if (font == null) { + return; + } + } + + pre(g); + g.textFont(font, font.size / TEXT_QUALITY); + g.text(textToDisplay, 0, 0); + post(g); + } + + } + public static class Font extends PShapeSVG { public FontFace face; From d0e016bea63c19d7acbfc7dc1168cffc8508d7cd Mon Sep 17 00:00:00 2001 From: George Bateman Date: Wed, 7 Jun 2017 15:37:32 +0100 Subject: [PATCH 003/172] Add console hiding button Also made the existing copy-message button consistent. --- app/src/processing/app/ui/Editor.java | 11 ++ app/src/processing/app/ui/EditorStatus.java | 113 +++++++++++++++----- 2 files changed, 96 insertions(+), 28 deletions(-) diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index be85d5b5bb..36949fbbd8 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -320,6 +320,17 @@ public BasicSplitPaneDivider createDefaultDivider() { status = new EditorStatus(this, Editor.this); return status; } + + + @Override + public void finishDraggingTo(int location) { + super.finishDraggingTo(location); + // JSplitPane issue: if you only make the lower component visible at + // the last minute, its minmum size is ignored. + if (location > splitPane.getMaximumDividerLocation()) { + splitPane.setDividerLocation(splitPane.getMaximumDividerLocation()); + } + } }); box.add(splitPane); diff --git a/app/src/processing/app/ui/EditorStatus.java b/app/src/processing/app/ui/EditorStatus.java index 963867c287..c4db92bae2 100644 --- a/app/src/processing/app/ui/EditorStatus.java +++ b/app/src/processing/app/ui/EditorStatus.java @@ -79,20 +79,22 @@ public class EditorStatus extends BasicSplitPaneDivider { //JPanel { String url; int rightEdge; int mouseX; - boolean urlRollover; + int rolloverState; + static final int ROLLOVER_NONE = 0; + static final int ROLLOVER_URL = 1; + static final int ROLLOVER_COLLAPSE = 2; + static final int ROLLOVER_EMOJI = 3; Font font; FontMetrics metrics; int ascent; // used to draw the clipboard icon - static final int EMOJI_OFFSET = 27; Font emojiFont; - int emojiLeft; - boolean emojiRollover; Image offscreen; int sizeW, sizeH; + boolean collapseState = false; int response; @@ -115,10 +117,10 @@ public void mouseEntered(MouseEvent e) { @Override public void mousePressed(MouseEvent e) { - if (urlRollover) { + if (rolloverState == ROLLOVER_URL) { Platform.openURL(url); - } else if (emojiRollover) { + } else if (rolloverState == ROLLOVER_EMOJI) { if (e.isShiftDown()) { // open the text in a browser window as a search final String fmt = Preferences.get("search.format"); @@ -131,17 +133,28 @@ public void mousePressed(MouseEvent e) { System.out.println("Copied to the clipboard. " + "Use shift-click to search the web instead."); } + + } else if (rolloverState == ROLLOVER_COLLAPSE) { + collapse(!collapseState); } } @Override public void mouseExited(MouseEvent e) { + mouseX = -100; updateMouse(); } }); addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + // BasicSplitPaneUI.startDragging gets called even when you click but + // don't drag, so we can't expand the console whenever that gets called + // or the button wouldn't work. + collapse(false); + } @Override public void mouseMoved(MouseEvent e) { @@ -152,13 +165,26 @@ public void mouseMoved(MouseEvent e) { } + void collapse(boolean doCollapse) { + if (collapseState == doCollapse) return; + collapseState = doCollapse; + editor.footer.setVisible(!doCollapse); + splitPane.resetToPreferredSizes(); + } + + void updateMouse() { - if (urlRollover) { - setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } else if (emojiRollover) { + switch (rolloverState) { + case ROLLOVER_EMOJI: + case ROLLOVER_URL: setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } else { + break; + case ROLLOVER_COLLAPSE: + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + break; + case ROLLOVER_NONE: setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); + break; } repaint(); } @@ -282,8 +308,8 @@ public void stopIndeterminate() { } + //public void paintComponent(Graphics screen) { public void paint(Graphics screen) { -// public void paint(Graphics screen) { Dimension size = getSize(); if ((size.width != sizeW) || (size.height != sizeH)) { // component has been resized @@ -308,21 +334,31 @@ public void paint(Graphics screen) { g.drawImage(bgImage[mode], 0, 0, sizeW, sizeH, this); - g.setColor(fgColor[mode]); + // What's the mouse over? + if (sizeW - sizeH < mouseX && mouseX < sizeW) { + rolloverState = ROLLOVER_COLLAPSE; + } else if (message != null && !message.isEmpty()) { + if (sizeW - 2*sizeH < mouseX) { + rolloverState = ROLLOVER_EMOJI; + } else if (url != null && mouseX > LEFT_MARGIN && + // calculate right edge of the text for rollovers (otherwise the pane + // cannot be resized up or down whenever a URL is being displayed) + mouseX < (LEFT_MARGIN + g.getFontMetrics().stringWidth(message))) { + rolloverState = ROLLOVER_URL; + } else { + rolloverState = ROLLOVER_NONE; + } + } else { + rolloverState = ROLLOVER_NONE; + } + // https://github.com/processing/processing/issues/3265 if (message != null) { // needs to be set each time on osx g.setFont(font); - // calculate right edge of the text for rollovers (otherwise the pane - // cannot be resized up or down whenever a URL is being displayed) - rightEdge = LEFT_MARGIN + g.getFontMetrics().stringWidth(message); // set the highlight color on rollover so that the user's not surprised // to see the web browser open when they click - urlRollover = (url != null) && - (mouseX > LEFT_MARGIN && mouseX < rightEdge); - if (urlRollover) { - g.setColor(urlColor); - } + g.setColor((rolloverState == ROLLOVER_URL) ? urlColor : fgColor[mode]); g.drawString(message, LEFT_MARGIN, (sizeH + ascent) / 2); } @@ -330,9 +366,9 @@ public void paint(Graphics screen) { //int x = cancelButton.getX(); //int w = cancelButton.getWidth(); int w = Toolkit.getButtonWidth(); - int x = getWidth() - RIGHT_MARGIN - w; - int y = getHeight() / 3; - int h = getHeight() / 3; + int x = getWidth() - Math.max(RIGHT_MARGIN, (int)(sizeH*1.2)) - w; + int y = sizeH / 3; + int h = sizeH / 3; g.setColor(new Color(0x80000000, true)); g.drawRect(x, y, w, h); for (int i = 0; i < 10; i++) { @@ -341,20 +377,41 @@ public void paint(Graphics screen) { } } else if (!message.isEmpty()) { - g.setColor(Color.WHITE); g.setFont(emojiFont); // actual Clipboard character not available [fry 180326] //g.drawString("\uD83D\uDCCB", sizeW - LEFT_MARGIN, (sizeH + ascent) / 2); - // other apps seem to use this one as a hack - emojiLeft = sizeW - Toolkit.zoom(EMOJI_OFFSET); - g.drawString("\u2398", emojiLeft, (sizeH + ascent) / 2); - emojiRollover = mouseX > emojiLeft - 4; + // other apps seem to use this one as a hack: ⎘ + drawButton(g, "\u2398", 1, rolloverState == ROLLOVER_EMOJI); + g.setFont(font); } + // draw collapse/expand button + drawButton(g, collapseState ? "▲" : "▼", 0, rolloverState == ROLLOVER_COLLAPSE); + screen.drawImage(offscreen, 0, 0, sizeW, sizeH, null); } + private final Color whitishTint = new Color(0x40eeeeee, true); + /** + * @param pos A zero-based index with 0 on the right. + */ + private void drawButton(Graphics g, String symbol, int pos, boolean highlight) { + int left = sizeW - (pos + 1) * sizeH; + g.setColor(bgColor[mode]); // Overlap very long errors. + g.fillRect(left, 0, sizeH, sizeH); + if (highlight) { + g.setColor(whitishTint); + g.fillRect(left, 0, sizeH, sizeH); + g.setColor(urlColor); + } else { + g.setColor(fgColor[mode]); + } + g.drawString(symbol, + left + (sizeH - g.getFontMetrics().stringWidth(symbol))/2, + (sizeH + ascent) / 2); + } + public Dimension getPreferredSize() { return getMinimumSize(); } From ec8de86dbf7a62d857f9ef4211dc325267218bee Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Tue, 24 Apr 2018 11:31:27 +0200 Subject: [PATCH 004/172] Change Editor status message only from EDT This adapter invokes all status changes on the EDT instead of worker thread of the Runner. Modifying AWT components from the worker threads may introduce strange bugs and in this case caused UI changes to run out of order, hiding runtime exceptions under problems displayed when cursor moves to the offending line. --- .../app/RunnerListenerEdtAdapter.java | 48 +++++++++++++++++++ java/src/processing/mode/java/Debugger.java | 3 +- java/src/processing/mode/java/JavaEditor.java | 5 +- 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 app/src/processing/app/RunnerListenerEdtAdapter.java diff --git a/app/src/processing/app/RunnerListenerEdtAdapter.java b/app/src/processing/app/RunnerListenerEdtAdapter.java new file mode 100644 index 0000000000..a436eefbca --- /dev/null +++ b/app/src/processing/app/RunnerListenerEdtAdapter.java @@ -0,0 +1,48 @@ +package processing.app; + +import java.awt.EventQueue; + +public class RunnerListenerEdtAdapter implements RunnerListener { + + private RunnerListener wrapped; + + public RunnerListenerEdtAdapter(RunnerListener wrapped) { + this.wrapped = wrapped; + } + + @Override + public void statusError(String message) { + EventQueue.invokeLater(() -> wrapped.statusError(message)); + } + + @Override + public void statusError(Exception exception) { + EventQueue.invokeLater(() -> wrapped.statusError(exception)); + } + + @Override + public void statusNotice(String message) { + EventQueue.invokeLater(() -> wrapped.statusNotice(message)); + } + + @Override + public void startIndeterminate() { + EventQueue.invokeLater(() -> wrapped.startIndeterminate()); + } + + @Override + public void stopIndeterminate() { + EventQueue.invokeLater(() -> wrapped.stopIndeterminate()); + } + + @Override + public void statusHalt() { + EventQueue.invokeLater(() -> wrapped.statusHalt()); + } + + @Override + public boolean isHalted() { + return wrapped.isHalted(); + } +} + diff --git a/java/src/processing/mode/java/Debugger.java b/java/src/processing/mode/java/Debugger.java index ac6835b21e..3fcb069d5d 100644 --- a/java/src/processing/mode/java/Debugger.java +++ b/java/src/processing/mode/java/Debugger.java @@ -39,6 +39,7 @@ import javax.swing.tree.DefaultMutableTreeNode; import processing.app.Messages; +import processing.app.RunnerListenerEdtAdapter; import processing.app.Sketch; import processing.app.SketchCode; import processing.mode.java.debug.*; @@ -201,7 +202,7 @@ public synchronized void startDebug() { //lineMap = LineMapping.generateMapping(srcPath + File.separator + mainClassName + ".java"); log("launching debuggee runtime"); - runtime = new Runner(build, editor); + runtime = new Runner(build, new RunnerListenerEdtAdapter(editor)); VirtualMachine vm = runtime.debug(null); // non-blocking if (vm == null) { loge("error 37: launch failed", null); diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 10c825027f..c95c9094fb 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -1093,10 +1093,11 @@ protected void handleLaunch(boolean present, boolean tweak) { synchronized (runtimeLock) { if (runtimeLaunchRequested) { runtimeLaunchRequested = false; + RunnerListener listener = new RunnerListenerEdtAdapter(JavaEditor.this); if (!tweak) { - runtime = jmode.handleLaunch(sketch, JavaEditor.this, present); + runtime = jmode.handleLaunch(sketch, listener, present); } else { - runtime = jmode.handleTweak(sketch, JavaEditor.this); + runtime = jmode.handleTweak(sketch, listener); } } } From eb9002568922893c6423b15cdc48f301b7248dfc Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Tue, 24 Apr 2018 11:35:14 +0200 Subject: [PATCH 005/172] Print exception message to the console when stack trace is disabled Make sure something is always printed to the console when sketch crashes with exception. Message in the status bar might disappear after moving the cursor. --- app/src/processing/app/SketchException.java | 5 +++++ app/src/processing/app/ui/Editor.java | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/app/src/processing/app/SketchException.java b/app/src/processing/app/SketchException.java index ccf8b924e6..4a32d2e79d 100644 --- a/app/src/processing/app/SketchException.java +++ b/app/src/processing/app/SketchException.java @@ -130,6 +130,11 @@ public void hideStackTrace() { } + public boolean isStackTraceEnabled() { + return showStackTrace; + } + + /** * Nix the java.lang crap out of an exception message * because it scares the children. diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index be85d5b5bb..33513e1de2 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -2900,6 +2900,17 @@ public void statusError(Exception e) { if (e instanceof SketchException) { SketchException re = (SketchException) e; + + // Make sure something is printed into the console + // Status bar is volatile + if (!re.isStackTraceEnabled()) { + System.err.println(re.getMessage()); + } + + // Move the cursor to the line before updating the status bar, otherwise + // status message might get hidden by a potential message caused by moving + // the cursor to a line with warning in it + if (re.hasCodeIndex()) { sketch.setCurrentCode(re.getCodeIndex()); } From 67f805a5decbe354210174e1eb90965f100f9033 Mon Sep 17 00:00:00 2001 From: Floris Date: Fri, 3 Aug 2018 12:20:49 +0200 Subject: [PATCH 006/172] Add a warning to findFont() when a font isn't found (and the default font is used). --- core/src/processing/core/PFont.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/processing/core/PFont.java b/core/src/processing/core/PFont.java index 632cd7ec03..b4b9a0fe69 100644 --- a/core/src/processing/core/PFont.java +++ b/core/src/processing/core/PFont.java @@ -145,6 +145,12 @@ public class PFont implements PConstants { /** True if already tried to find the native AWT version of this font. */ protected boolean fontSearched; + /** + * The name of the font that is used as default when a font isn't found. + * See {@link #findFont(String)} and {@link #loadFonts()} for more info. + */ + static protected String defaultFontName; + /** * Array of the native system fonts. Used to lookup native fonts by their * PostScript name. This is a workaround for a several year old Apple Java @@ -901,6 +907,7 @@ static public void loadFonts() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); fonts = ge.getAllFonts(); + defaultFontName = new Font("",Font.PLAIN,1).getFontName(); if (PApplet.platform == PConstants.MACOSX) { fontDifferent = new HashMap(); for (Font font : fonts) { @@ -917,6 +924,10 @@ static public void loadFonts() { * Starting with Java 1.5, Apple broke the ability to specify most fonts. * This bug was filed years ago as #4769141 at bugreporter.apple.com. More: * Bug 407. + *
+ * This function displays a warning when the font isn't found and the default font is + * used. + * See: issue #5481 */ static public Font findFont(String name) { loadFonts(); @@ -931,7 +942,14 @@ static public Font findFont(String name) { // } // } } - return new Font(name, Font.PLAIN, 1); + Font font = new Font(name, Font.PLAIN, 1); + if(!defaultFontName.equals(name) && font.getFontName().equals(defaultFontName)) { + System.err.println("Warning: font \"" + name + + "\" is missing or inaccessible on this system. Default font \"" + + defaultFontName + "\" is used."); + + } + return font; } From b6d516d95deaf219babc73dc675ad8289853d2f6 Mon Sep 17 00:00:00 2001 From: Sigmund Hansen Date: Tue, 25 Sep 2018 00:23:58 +0200 Subject: [PATCH 007/172] Some refactoring and linting. --- app/src/processing/app/contrib/ListPanel.java | 378 ++++++++---------- .../app/contrib/UpdateListPanel.java | 35 +- 2 files changed, 171 insertions(+), 242 deletions(-) diff --git a/app/src/processing/app/contrib/ListPanel.java b/app/src/processing/app/contrib/ListPanel.java index d9b36ce122..2acb690b24 100644 --- a/app/src/processing/app/contrib/ListPanel.java +++ b/app/src/processing/app/contrib/ListPanel.java @@ -45,8 +45,8 @@ public class ListPanel extends JPanel implements Scrollable, ContributionListing.ChangeListener { ContributionTab contributionTab; - TreeMap panelByContribution = new TreeMap(ContributionListing.COMPARATOR); - Set visibleContributions = new TreeSet(ContributionListing.COMPARATOR); + TreeMap panelByContribution = new TreeMap<>(ContributionListing.COMPARATOR); + Set visibleContributions = new TreeSet<>(ContributionListing.COMPARATOR); private DetailPanel selectedPanel; protected Contribution.Filter filter; @@ -135,48 +135,11 @@ public void valueChanged(ListSelectionEvent event) { } }); - TableRowSorter sorter = new TableRowSorter(table.getModel()); + TableRowSorter sorter = new TableRowSorter<>(table.getModel()); table.setRowSorter(sorter); sorter.setComparator(1, ContributionListing.COMPARATOR); - sorter.setComparator(2, new Comparator() { - - @Override - public int compare(Contribution o1, Contribution o2) { - return getAuthorNameWithoutMarkup(o1.getAuthorList()) - .compareTo(getAuthorNameWithoutMarkup(o2.getAuthorList())); - } - }); - sorter.setComparator(0, new Comparator() { - - @Override - public int compare(Contribution o1, Contribution o2) { - int pos1 = 0; - if (o1.isInstalled()) { - pos1 = 1; - if (contribListing.hasUpdates(o1)) { - pos1 = 2; - } - if (!o1.isCompatible(Base.getRevision())) { - pos1 = 3; - } - } else { - pos1 = 4; - } - int pos2 = 0; - if (o2.isInstalled()) { - pos2 = 1; - if (contribListing.hasUpdates(o2)) { - pos2 = 2; - } - if (!o2.isCompatible(Base.getRevision())) { - pos2 = 3; - } - } else { - pos2 = 4; - } - return pos1 - pos2; - } - }); + sorter.setComparator(2, Comparator.comparing(o -> getAuthorNameWithoutMarkup(((Contribution) o).getAuthorList()))); + sorter.setComparator(0, Comparator.comparingInt(o -> getContributionStatusRank((Contribution) o))); table.getTableHeader().setDefaultRenderer(new ContribHeaderRenderer()); GroupLayout layout = new GroupLayout(this); @@ -187,6 +150,19 @@ public int compare(Contribution o1, Contribution o2) { table.setVisible(true); } + private int getContributionStatusRank(Contribution c) { + int pos = 4; + if (c.isInstalled()) { + pos = 1; + if (contribListing.hasUpdates(c)) { + pos = 2; + } + if (!c.isCompatible(Base.getRevision())) { + pos = 3; + } + } + return pos; + } class ContribHeaderRenderer extends DefaultTableCellRenderer { @@ -264,16 +240,11 @@ protected Icon getSortIcon(JTable table, int column) { * @return the SortKey, or null if the column is unsorted */ protected SortKey getSortKey(JTable table, int column) { - RowSorter rowSorter = table.getRowSorter(); - if (rowSorter == null) { - return null; - } + return Optional.ofNullable(table.getRowSorter()) + .map(RowSorter::getSortKeys) + .map(columns -> columns.isEmpty() ? null : columns.get(0)) + .orElse(null); - List sortedColumns = rowSorter.getSortKeys(); - if (sortedColumns.size() > 0) { - return (SortKey) sortedColumns.get(0); - } - return null; } } @@ -298,96 +269,90 @@ public Component getTableCellRendererComponent(JTable table, Object value, // TODO this is now working, but the underlying issue is not fixed return label; } + if (isSelected) { + label.setBackground(new Color(0xe0fffd)); + } if (column == 0) { - Icon icon = null; - label.setFont(ManagerFrame.NORMAL_PLAIN); - if (contribution.isInstalled()) { - icon = upToDateIcon; - if (contribListing.hasUpdates(contribution)) { - icon = updateAvailableIcon; - } - if (!contribution.isCompatible(Base.getRevision())) { - icon = incompatibleIcon; - } - } - if ((panelByContribution.get(contribution)).updateInProgress || - (panelByContribution.get(contribution)).installInProgress) { - // Display "Loading icon" if download/install in progress - label.setIcon(downloadingIcon); - } else { - label.setIcon(icon); - } - label.setHorizontalAlignment(SwingConstants.CENTER); - if (isSelected) { - label.setBackground(new Color(0xe0fffd)); - } - label.setOpaque(true); -// return table.getDefaultRenderer(Icon.class).getTableCellRendererComponent(table, icon, isSelected, false, row, column); - + configureStatusColumnLabel(label, contribution); } else if (column == 1) { - // Generating ellipses based on fontMetrics - final Font boldFont = ManagerFrame.NORMAL_BOLD; - String fontFace = ""; - FontMetrics fontMetrics = table.getFontMetrics(boldFont); //table.getFont()); - int colSize = table.getColumnModel().getColumn(1).getWidth(); - String sentence = contribution.getSentence(); - //int currentWidth = table.getFontMetrics(table.getFont().deriveFont(Font.BOLD)).stringWidth(contribution.getName() + " | "); - int currentWidth = table.getFontMetrics(boldFont).stringWidth(contribution.getName() + " | "); - int ellipsesWidth = fontMetrics.stringWidth("..."); - //String name = "" + contribution.getName(); - String name = "" + fontFace + contribution.getName(); - if (sentence == null) { - label.setText(name + ""); - } else { - sentence = " | " + sentence; - currentWidth += ellipsesWidth; - int i = 0; - for (i = 0; i < sentence.length(); i++) { - currentWidth += fontMetrics.charWidth(sentence.charAt(i)); - if (currentWidth >= colSize) { - break; - } - } - // Adding ellipses only if text doesn't fits into the column - if(i != sentence.length()){ - label.setText(name + sentence.substring(0, i) + "..."); - }else { - label.setText(name + sentence + ""); - } - } - if (!contribution.isCompatible(Base.getRevision())) { - label.setForeground(Color.LIGHT_GRAY); - } - if (table.isRowSelected(row)) { - label.setBackground(new Color(0xe0fffd)); - } - label.setFont(ManagerFrame.NORMAL_PLAIN); - label.setOpaque(true); + configureNameColumnLabel(table, label, contribution); } else { - if (contribution.isSpecial()) { - label = new JLabel(foundationIcon); + configureAuthorsColumnLabel(label, contribution); + } + + if(!contribution.isCompatible(Base.getRevision())){ + label.setForeground(Color.LIGHT_GRAY); + } + label.setOpaque(true); + return label; + } + + private void configureStatusColumnLabel(JLabel label, Contribution contribution) { + Icon icon = null; + label.setFont(ManagerFrame.NORMAL_PLAIN); + if ((panelByContribution.get(contribution)).updateInProgress || + (panelByContribution.get(contribution)).installInProgress) { + // Display "Loading icon" if download/install in progress + icon = downloadingIcon; + } else if (contribution.isInstalled()) { + if (!contribution.isCompatible(Base.getRevision())) { + icon = incompatibleIcon; + } else if (contribListing.hasUpdates(contribution)) { + icon = updateAvailableIcon; } else { - label = new JLabel(); + icon = upToDateIcon; } - String authorList = contribution.getAuthorList(); - String name = getAuthorNameWithoutMarkup(authorList); - label.setText(name); - label.setHorizontalAlignment(SwingConstants.LEFT); - if(!contribution.isCompatible(Base.getRevision())){ - label.setForeground(Color.LIGHT_GRAY); - }else{ - label.setForeground(Color.BLACK); + } + + label.setIcon(icon); + label.setHorizontalAlignment(SwingConstants.CENTER); + } + + private void configureNameColumnLabel(JTable table, JLabel label, Contribution contribution) { + // Generating ellipses based on fontMetrics + final Font boldFont = ManagerFrame.NORMAL_BOLD; + FontMetrics fontMetrics = table.getFontMetrics(boldFont); //table.getFont()); + int colSize = table.getColumnModel().getColumn(1).getWidth(); + int currentWidth = fontMetrics.stringWidth(contribution.getName() + " | ..."); + String sentence = contribution.getSentence(); + StringBuilder text = new StringBuilder("") + .append(contribution.getName()); + + if (sentence == null) { + text.append(""); + } else { + int i = 0; + for (i = 0; i < sentence.length(); i++) { + currentWidth += fontMetrics.charWidth(sentence.charAt(i)); + if (currentWidth >= colSize) { + break; + } } - if (table.isRowSelected(row)) { - label.setBackground(new Color(0xe0fffd)); + text.append(" | ").append(sentence, 0, i); + // Adding ellipses only if text doesn't fits into the column + if(i != sentence.length()) { + text.append("..."); } - label.setFont(ManagerFrame.NORMAL_BOLD); - label.setOpaque(true); } - return label; + text.append(""); + label.setText(text.toString()); + label.setFont(ManagerFrame.NORMAL_PLAIN); } - } + private void configureAuthorsColumnLabel(JLabel label, Contribution contribution) { + if (contribution.isSpecial()) { + label.setIcon(foundationIcon); + } + String authorList = contribution.getAuthorList(); + String name = getAuthorNameWithoutMarkup(authorList); + label.setText(name); + label.setHorizontalAlignment(SwingConstants.LEFT); + label.setForeground(Color.BLACK); + label.setFont(ManagerFrame.NORMAL_BOLD); + } + } static private class ContribTableModel extends DefaultTableModel { @Override @@ -401,21 +366,20 @@ public Class getColumnClass(int columnIndex) { } } - String getAuthorNameWithoutMarkup(String authorList) { StringBuilder name = new StringBuilder(""); if (authorList != null) { + int parentheses = 0; for (int i = 0; i < authorList.length(); i++) { if (authorList.charAt(i) == '[' || authorList.charAt(i) == ']') { continue; } if (authorList.charAt(i) == '(') { - i++; - while (authorList.charAt(i) != ')') { - i++; - } - } else { + parentheses++; + } else if (authorList.charAt(i) == ')') { + parentheses--; + } else if (parentheses == 0) { name.append(authorList.charAt(i)); } } @@ -441,17 +405,15 @@ void updatePanelOrdering(Set contributionsSet) { // Thread: EDT public void contributionAdded(final Contribution contribution) { - if (filter.matches(contribution)) { - if (!panelByContribution.containsKey(contribution)) { - DetailPanel newPanel = - new DetailPanel(ListPanel.this); - panelByContribution.put(contribution, newPanel); - visibleContributions.add(contribution); - newPanel.setContribution(contribution); - add(newPanel); - updatePanelOrdering(visibleContributions); - updateColors(); // XXX this is the place - } + if (filter.matches(contribution) && !panelByContribution.containsKey(contribution)) { + DetailPanel newPanel = + new DetailPanel(ListPanel.this); + panelByContribution.put(contribution, newPanel); + visibleContributions.add(contribution); + newPanel.setContribution(contribution); + add(newPanel); + updatePanelOrdering(visibleContributions); + updateColors(); // XXX this is the place } } @@ -497,14 +459,12 @@ public void contributionChanged(final Contribution oldContrib, public void filterLibraries(List filteredContributions) { visibleContributions.clear(); for (Contribution contribution : panelByContribution.keySet()) { - if (contribution.getType() == contributionTab.contribType) { + if (contribution.getType() == contributionTab.contribType + && filteredContributions.contains(contribution) + && panelByContribution.keySet().contains(contribution)) { // contains() uses equals() and there can be multiple instances, // so Contribution.equals() has to be overridden - if (filteredContributions.contains(contribution)) { - if (panelByContribution.keySet().contains(contribution)) { - visibleContributions.add(contribution); - } - } + visibleContributions.add(contribution); } } // TODO: Make the following loop work for optimization @@ -554,38 +514,35 @@ protected void updateColors() { int count = 0; for (Entry entry : panelByContribution.entrySet()) { DetailPanel panel = entry.getValue(); - - if (panel.isVisible() && panel.isSelected()) { - panel.setBackground(UIManager.getColor("List.selectionBackground")); - panel.setForeground(UIManager.getColor("List.selectionForeground")); - panel.setBorder(UIManager.getBorder("List.focusCellHighlightBorder")); - count++; - - } else { - Border border = null; - if (panel.isVisible()) { - if (Platform.isMacOS()) { - if (count % 2 == 1) { - border = UIManager.getBorder("List.oddRowBackgroundPainter"); - } else { - border = UIManager.getBorder("List.evenRowBackgroundPainter"); - } - } else { - if (count % 2 == 1) { - panel.setBackground(new Color(219, 224, 229)); - } else { - panel.setBackground(new Color(241, 241, 241)); - } - } - count++; + Border border = BorderFactory.createEmptyBorder(1, 1, 1, 1); + + if (panel.isVisible()) { + boolean oddRow = count % 2 == 1; + Color bgColor = null; + Color fgColor = UIManager.getColor("List.foreground"); + + if (panel.isSelected()) { + bgColor = UIManager.getColor("List.selectionBackground"); + fgColor = UIManager.getColor("List.selectionForeground"); + border = UIManager.getBorder("List.focusCellHighlightBorder"); + } else if (Platform.isMacOS()) { + border = oddRow + ? UIManager.getBorder("List.oddRowBackgroundPainter") + : UIManager.getBorder("List.evenRowBackgroundPainter"); + } else { + bgColor = oddRow + ? new Color(219, 224, 229) + : new Color(241, 241, 241); } - if (border == null) { - border = BorderFactory.createEmptyBorder(1, 1, 1, 1); + panel.setForeground(fgColor); + if (bgColor != null) { + panel.setBackground(bgColor); } - panel.setBorder(border); - panel.setForeground(UIManager.getColor("List.foreground")); + count++; } + + panel.setBorder(border); } } @@ -623,39 +580,38 @@ public int getScrollableBlockIncrement(Rectangle visibleRect, */ @Override public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { - if (orientation == SwingConstants.VERTICAL) { - int lastHeight = 0, height = 0; - int bottomOfScrollArea = visibleRect.y + visibleRect.height; - - for (Component c : getComponents()) { - if (c.isVisible()) { - if (c instanceof DetailPanel) { - Dimension d = c.getPreferredSize(); - - int nextHeight = height + d.height; - - if (direction > 0) { - // scrolling down - if (nextHeight > bottomOfScrollArea) { - return nextHeight - bottomOfScrollArea; - } - } else { - // scrolling up - if (nextHeight > visibleRect.y) { - if (visibleRect.y != height) { - return visibleRect.y - height; - } else { - return visibleRect.y - lastHeight; - } - } - } + if (orientation != SwingConstants.VERTICAL) { + return 0; + } + int lastHeight = 0; + int height = 0; + int bottomOfScrollArea = visibleRect.y + visibleRect.height; - lastHeight = height; - height = nextHeight; - } + for (Component c : getComponents()) { + if (!(c.isVisible() && c instanceof DetailPanel)) { + continue; + } + Dimension d = c.getPreferredSize(); + + int nextHeight = height + d.height; + + if (direction > 0) { + // scrolling down + if (nextHeight > bottomOfScrollArea) { + return nextHeight - bottomOfScrollArea; + } + } else if (nextHeight > visibleRect.y) { + if (visibleRect.y != height) { + return visibleRect.y - height; + } else { + return visibleRect.y - lastHeight; } } + + lastHeight = height; + height = nextHeight; } + return 0; } diff --git a/app/src/processing/app/contrib/UpdateListPanel.java b/app/src/processing/app/contrib/UpdateListPanel.java index 11b23bfd67..7399278524 100644 --- a/app/src/processing/app/contrib/UpdateListPanel.java +++ b/app/src/processing/app/contrib/UpdateListPanel.java @@ -29,7 +29,7 @@ public class UpdateListPanel extends ListPanel { ContributionType.TOOL.getPluralTitle(), ContributionType.EXAMPLES.getPluralTitle(), }; - Set sectionNames = new HashSet(Arrays.asList(PLURAL_TYPES)); + Set sectionNames = new HashSet<>(Arrays.asList(PLURAL_TYPES)); public UpdateListPanel(ContributionTab contributionTab, Contribution.Filter filter) { @@ -134,18 +134,8 @@ public Component getTableCellRendererComponent(JTable table, setLayout(layout); table.setVisible(true); - panelByContribution = new TreeMap(new Comparator() { - @Override - public int compare(Contribution o1, Contribution o2) { - int diff = - ContributionManager.getTypeIndex(o1.getType()) - - ContributionManager.getTypeIndex(o2.getType()); - if (diff == 0) { - diff = o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); - } - return diff; - } - }); + panelByContribution = new TreeMap<>(Comparator.comparingInt(c -> ContributionManager.getTypeIndex(((Contribution) c).getType())) + .thenComparing(c -> ((Contribution) c).getName().toLowerCase())); } // Thread: EDT @@ -163,24 +153,7 @@ void updatePanelOrdering(Set contributionsSet) { null, currentType.getPluralTitle(), null, null, null }); } - //TODO Make this into a function - StringBuilder name = new StringBuilder(""); - String authorList = entry.getAuthorList(); - if (authorList != null) { - for (int i = 0; i < authorList.length(); i++) { - if (authorList.charAt(i) == '[' || authorList.charAt(i) == ']') { - continue; - } - if (authorList.charAt(i) == '(') { - i++; - while (authorList.charAt(i) != ')') { - i++; - } - } else { - name.append(authorList.charAt(i)); - } - } - } + String name = getAuthorNameWithoutMarkup(entry.getAuthorList()); Icon icon = null; if (entry.isInstalled()) { icon = upToDateIcon; From e54325a0ade7a821e36202c5ae647c2f1b2ba055 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sun, 7 Oct 2018 21:55:14 +0200 Subject: [PATCH 008/172] Make sure Ctrl+Left Mouse on MacOS is consistent Make sure PRESS, DRAG and RELEASE report the same mouse button on MacOS. - If CTRL was pressed during Left PRESS, report Right Button until the button is released, regardless of whether CTRL is still down. - If CTRL was not pressed during Left PRESS, report Left Button until the button is released, regardless of CTRL state. Fixes #5672 --- core/src/processing/awt/PSurfaceAWT.java | 19 ++++++++++++--- core/src/processing/javafx/PSurfaceFX.java | 25 ++++++++++++++++---- core/src/processing/opengl/PSurfaceJOGL.java | 21 +++++++++++++--- 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/core/src/processing/awt/PSurfaceAWT.java b/core/src/processing/awt/PSurfaceAWT.java index 4cf50e87fd..2c56d25468 100644 --- a/core/src/processing/awt/PSurfaceAWT.java +++ b/core/src/processing/awt/PSurfaceAWT.java @@ -1231,6 +1231,14 @@ public void componentResized(ComponentEvent e) { */ + // MACOSX: CTRL + Left Mouse is converted to Right Mouse. This boolean keeps + // track of whether the conversion happened on PRESS, because we should report + // the same button during DRAG and on RELEASE, even though CTRL might have + // been released already. Otherwise the events are inconsistent, e.g. + // Left Pressed - Left Drag - CTRL Pressed - Right Drag - Right Released. + // See: https://github.com/processing/processing/issues/5672 + private boolean macosxLeftButtonWithCtrlPressed; + /** * Figure out how to process a mouse event. When loop() has been * called, the events will be queued up until drawing is complete. @@ -1319,11 +1327,16 @@ protected void nativeMouseEvent(java.awt.event.MouseEvent nativeEvent) { // If running on Mac OS, allow ctrl-click as right mouse. Prior to 0215, // this used isPopupTrigger() on the native event, but that doesn't work // for mouseClicked and mouseReleased (or others). - if (PApplet.platform == PConstants.MACOSX) { - //if (nativeEvent.isPopupTrigger()) { - if ((modifiers & InputEvent.CTRL_MASK) != 0) { + if (/*PApplet.platform == PConstants.MACOSX &&*/ peButton == PConstants.LEFT) { + if (peAction == MouseEvent.PRESS && (modifiers & InputEvent.CTRL_MASK) != 0) { + macosxLeftButtonWithCtrlPressed = true; + } + if (macosxLeftButtonWithCtrlPressed) { peButton = PConstants.RIGHT; } + if (peAction == MouseEvent.RELEASE) { + macosxLeftButtonWithCtrlPressed = false; + } } sketch.postEvent(new MouseEvent(nativeEvent, nativeEvent.getWhen(), diff --git a/core/src/processing/javafx/PSurfaceFX.java b/core/src/processing/javafx/PSurfaceFX.java index e9f8243d78..acd80abf5e 100644 --- a/core/src/processing/javafx/PSurfaceFX.java +++ b/core/src/processing/javafx/PSurfaceFX.java @@ -27,6 +27,7 @@ import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; +import java.awt.event.InputEvent; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; @@ -823,6 +824,16 @@ public void focusLost(FocusEvent e) { mouseMap.put(MouseEvent.MOUSE_EXITED, processing.event.MouseEvent.EXIT); } + + // MACOSX: CTRL + Left Mouse is converted to Right Mouse. This boolean keeps + // track of whether the conversion happened on PRESS, because we should report + // the same button during DRAG and on RELEASE, even though CTRL might have + // been released already. Otherwise the events are inconsistent, e.g. + // Left Pressed - Left Drag - CTRL Pressed - Right Drag - Right Released. + // See: https://github.com/processing/processing/issues/5672 + private boolean macosxLeftButtonWithCtrlPressed; + + protected void fxMouseEvent(MouseEvent fxEvent) { // the 'amount' is the number of button clicks for a click event, // or the number of steps/clicks on the wheel for a mouse wheel event. @@ -862,10 +873,16 @@ protected void fxMouseEvent(MouseEvent fxEvent) { // If running on Mac OS, allow ctrl-click as right mouse. // Verified to be necessary with Java 8u45. - if (PApplet.platform == PConstants.MACOSX && - fxEvent.isControlDown() && - button == PConstants.LEFT) { - button = PConstants.RIGHT; + if (PApplet.platform == PConstants.MACOSX && button == PConstants.LEFT) { + if (action == processing.event.MouseEvent.PRESS && fxEvent.isControlDown()) { + macosxLeftButtonWithCtrlPressed = true; + } + if (macosxLeftButtonWithCtrlPressed) { + button = PConstants.RIGHT; + } + if (action == processing.event.MouseEvent.RELEASE) { + macosxLeftButtonWithCtrlPressed = false; + } } //long when = nativeEvent.getWhen(); // from AWT diff --git a/core/src/processing/opengl/PSurfaceJOGL.java b/core/src/processing/opengl/PSurfaceJOGL.java index 17d2d916eb..1526047d00 100644 --- a/core/src/processing/opengl/PSurfaceJOGL.java +++ b/core/src/processing/opengl/PSurfaceJOGL.java @@ -1011,6 +1011,15 @@ public void keyTyped(com.jogamp.newt.event.KeyEvent e) { } + // MACOSX: CTRL + Left Mouse is converted to Right Mouse. This boolean keeps + // track of whether the conversion happened on PRESS, because we should report + // the same button during DRAG and on RELEASE, even though CTRL might have + // been released already. Otherwise the events are inconsistent, e.g. + // Left Pressed - Left Drag - CTRL Pressed - Right Drag - Right Released. + // See: https://github.com/processing/processing/issues/5672 + private boolean macosxLeftButtonWithCtrlPressed; + + protected void nativeMouseEvent(com.jogamp.newt.event.MouseEvent nativeEvent, int peAction) { int modifiers = nativeEvent.getModifiers(); @@ -1033,11 +1042,17 @@ protected void nativeMouseEvent(com.jogamp.newt.event.MouseEvent nativeEvent, break; } - if (PApplet.platform == PConstants.MACOSX) { - //if (nativeEvent.isPopupTrigger()) { - if ((modifiers & InputEvent.CTRL_MASK) != 0) { + // If running on Mac OS, allow ctrl-click as right mouse. + if (PApplet.platform == PConstants.MACOSX && peButton == PConstants.LEFT) { + if (peAction == MouseEvent.PRESS && (modifiers & InputEvent.CTRL_MASK) != 0) { + macosxLeftButtonWithCtrlPressed = true; + } + if (macosxLeftButtonWithCtrlPressed) { peButton = PConstants.RIGHT; } + if (peAction == MouseEvent.RELEASE) { + macosxLeftButtonWithCtrlPressed = false; + } } int peCount = 0; From f0a308ce4348015ca4922a880abf85b0d13c578b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= Date: Sun, 7 Oct 2018 23:06:14 +0300 Subject: [PATCH 009/172] Minor changes for russian translation --- build/shared/lib/languages/PDE_ru.properties | 78 ++++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/build/shared/lib/languages/PDE_ru.properties b/build/shared/lib/languages/PDE_ru.properties index 1c8c0f80df..4fdfc6bd33 100644 --- a/build/shared/lib/languages/PDE_ru.properties +++ b/build/shared/lib/languages/PDE_ru.properties @@ -59,8 +59,8 @@ menu.library.add_library = Добавить библиотеку... menu.library.contributed = Вклад сообщества menu.library.no_core_libraries = отсутствуют основные библиотеки # --- -menu.sketch = Эскиз -menu.sketch.show_sketch_folder = Показать папку с эскизами +menu.sketch = Набросок +menu.sketch.show_sketch_folder = Показать папку с набросками menu.sketch.add_file = Добавить файл... # | File | Edit | Sketch | Debug | Tools | Help | @@ -90,7 +90,7 @@ menu.debug.continue = Продолжить #menu.debug.variable_inspector = Инспектор переменных menu.debug.show_variables = Показать переменные menu.debug.hide_variables = Спрятать переменные -#menu.debug.show_sketch_outline = Показать рамку эскиза +#menu.debug.show_sketch_outline = Показать рамку наброска #menu.debug.show_tabs_list = Показать список вкладок # | File | Edit | Sketch | Debug | Tools | Help | @@ -98,7 +98,7 @@ menu.debug.hide_variables = Спрятать переменные menu.tools = Инструменты menu.tools.color_selector = Выбрать цвет... menu.tools.create_font = Создать шрифты... -menu.tools.archive_sketch = Архивировать эскиз +menu.tools.archive_sketch = Архивировать набросок menu.tools.fix_the_serial_lbrary = Исправить библиотеку Serial menu.tools.install_processing_java = Установить "processing-java" menu.tools.add_tool = Добавить инструмент... @@ -169,7 +169,7 @@ preferences.console_font_size = Размер шрифта консоли preferences.zoom = Масштабирование интерфейса preferences.zoom.auto = По умолчанию preferences.background_color = Цвет фона в режиме презентации -preferences.background_color.tip = Выбрать фоновый цвет для режима презентации.
Режим презентации используется для полноэкранного просмотра
из меню эскиз. +preferences.background_color.tip = Выбрать фоновый цвет для режима презентации.
Режим презентации используется для полноэкранного просмотра
из меню набросок. preferences.use_smooth_text = Рисовать сглаженный текст в окне редактора preferences.enable_complex_text_input = Включить расширенное редактирование текста preferences.enable_complex_text_input_example = напр. японский @@ -179,11 +179,11 @@ preferences.code_completion = Автодополнение кода preferences.trigger_with = Запуск с помощью preferences.cmd_space = Пробел preferences.suggest_imports = Предлагать импорт -preferences.increase_max_memory = Увеличить лимит памяти для эскиза +preferences.increase_max_memory = Увеличить лимит памяти для наброска preferences.delete_previous_folder_on_export = Удалять предыдущую папку при экспорте preferences.check_for_updates_on_startup = Разрешать проверку обновлений (см. ЧаВо для получения информации о используемых данных) -preferences.run_sketches_on_display = Запускать эскиз на мониторе -preferences.run_sketches_on_display.tip = Задаёт монитор, на котором будут запускаться эскизы.
Обычно, если окно перемещается, то оно будет перезапущено
на том месте, тем не менее при запуске в полноэкранном режиме
всегда используется выбранный монитор. +preferences.run_sketches_on_display = Запускать набросок на мониторе +preferences.run_sketches_on_display.tip = Задаёт монитор, на котором будут запускаться наброски.
Обычно, если окно перемещается, то оно будет перезапущено
на том месте, тем не менее при запуске в полноэкранном режиме
всегда используется выбранный монитор. preferences.automatically_associate_pde_files = Автоматически ассоциировать файлы .pde с Processing preferences.launch_programs_in = Запускать программы в preferences.launch_programs_in.mode = Режим @@ -226,7 +226,7 @@ export.code_signing = Цифровая подпись export.messages.is_read_only = Скетч доступен только для чтения export.messages.is_read_only.description = Некоторые файлы помечены "только для чтения".\nНужно сперва сохранить их в другом месте\nа затем попробовать заново. export.messages.cannot_export = Экспорт невозможен -export.messages.cannot_export.description = Нельзя экспортировать несохранённый эскиз. +export.messages.cannot_export.description = Нельзя экспортировать несохранённый набросок. # Find (Frame) find = Поиск @@ -249,7 +249,7 @@ file = Выбрать # Create Font (Frame) create_font = Создать шрифт -create_font.label = Этот инструмент предназначен для создания пользовательских шрифтов.\nВыберите шрифт, его размер и нажмите "ОК", для создания шрифта.\nОн будет сохранён в папке с эскизом. +create_font.label = Этот инструмент предназначен для создания пользовательских шрифтов.\nВыберите шрифт, его размер и нажмите "ОК", для создания шрифта.\nОн будет сохранён в папке с наброском. create_font.size = Размер create_font.smooth = Сглаживание create_font.characters = Символы... @@ -268,9 +268,9 @@ archive_sketch = Архивировать скетч в... # Tweak Mode tweak_mode = Режим редактирования -tweak_mode.save_before_tweak = Сохраните эскиз перед переходом в режим редактирования. +tweak_mode.save_before_tweak = Сохраните набросок перед переходом в режим редактирования. tweak_mode.keep_changes.line1 = Сохранить изменения? -tweak_mode.keep_changes.line2 = Вы изменили настройки эскиза. Желаете сохранить? +tweak_mode.keep_changes.line2 = Вы изменили настройки наброска. Желаете сохранить? # DebugTray debugger.name = Имя @@ -311,7 +311,7 @@ editor.header.delete = Удалить editor.header.previous_tab = Предыдущая вкладка editor.header.next_tab = Следующая вкладка editor.header.delete.warning.title = Да, нет. -editor.header.delete.warning.text = Нельзя удалить основную вкладку открытого эскиза. +editor.header.delete.warning.text = Нельзя удалить основную вкладку открытого наброска. # PopUp menu editor.popup.jump_to_declaration = Перейти к определению @@ -325,7 +325,7 @@ editor.tab.rename = Новое имя editor.tab.rename.description = Новое имя файла # Sketch -editor.sketch.rename.description = Имя нового эскиза +editor.sketch.rename.description = Имя нового наброска editor.status.autoformat.no_changes = Автоформатирования не требуется. editor.status.autoformat.finished = Автоформатирование завершено. @@ -375,7 +375,7 @@ editor.status.type_mismatch = Несовпадение типов "%s" и "%s" editor.status.unused_variable = Локальная переменная "%s" нигде не используется editor.status.uninitialized_variable = Локальная переменная "%s" не инициализирована editor.status.no_effect_assignment = Присвоение переменной "%s" не имеет эффекта -editor.status.hiding_enclosing_type = Класс "%s" не может иметь имя эскиза +editor.status.hiding_enclosing_type = Класс "%s" не может иметь имя наброска # Footer buttons editor.footer.errors = Ошибки @@ -385,14 +385,14 @@ editor.footer.errors.line = Строка editor.footer.console = Консоль # New handler -new.messages.is_read_only = Эскиз только для чтения +new.messages.is_read_only = Набросок только для чтения new.messages.is_read_only.description = Некоторые файлы помечены "только для чтения".\nСохраните их в другом месте и попробуйте снова. # Rename handler -rename.messages.is_untitled = Эскиз без названия -rename.messages.is_untitled.description = Сперва сохраните эскиз, перед\n тем как его переименовывать -rename.messages.is_modified = Сохраните эскиз, перед его переименованием. -rename.messages.is_read_only = Эскиз только для чтения +rename.messages.is_untitled = Набросок без названия +rename.messages.is_untitled.description = Сперва сохраните набросок, перед\n тем как его переименовывать +rename.messages.is_modified = Сохраните набросок, перед его переименованием. +rename.messages.is_read_only = Набросок только для чтения rename.messages.is_read_only.description = Некоторые файлы помечены "только для чтения".\nСохраните их в другом месте и попробуйте снова. # Naming handler @@ -403,37 +403,37 @@ name.messages.main_java_extension.description = Первая вкладка не name.messages.new_sketch_exists = Переименование невозможно name.messages.new_sketch_exists.description = Файл "%s" уже существует в\n"%s" name.messages.new_folder_exists = Переименование невозможно -name.messages.new_folder_exists.description = Эскиз(или папка) "%s" уже существует. +name.messages.new_folder_exists.description = Набросок(или папка) "%s" уже существует. name.messages.error = Ошибка -name.messages.no_rename_folder.description = Не удалось переименовать папку эскиза. +name.messages.no_rename_folder.description = Не удалось переименовать папку наброска. name.messages.no_rename_file.description = Не удалось переименовать "%s" на "%s" name.messages.no_create_file.description = Не удалось создать файл "%s"\nв "%s" # Delete handler delete.messages.cannot_delete = Нельзя удалить -delete.messages.cannot_delete.description = Нельзя удалить несохранённый эскиз. +delete.messages.cannot_delete.description = Нельзя удалить несохранённый набросок. delete.messages.cannot_delete.file = Не удалось delete.messages.cannot_delete.file.description = Не получилось удалить -delete.messages.is_read_only = Эскиз открыт "только для чтения" +delete.messages.is_read_only = Набросок открыт "только для чтения" delete.messages.is_read_only.description = Некоторые файлы помечены "только для чтения".\nСохраните их в другом месте и попробуйте снова. # Save handler -save_file.messages.is_read_only = Эскиз только для чтения +save_file.messages.is_read_only = Набросок только для чтения save_file.messages.is_read_only.description = Некоторые файлы помечены "только для чтения".\nСохраните их в другом месте и попробуйте снова. -save_file.messages.sketch_exists = Эскиз уже существует -save_file.messages.sketch_exists.description = Эскиз с очищенным именем\n“%s” уже существует. +save_file.messages.sketch_exists = Набросок уже существует +save_file.messages.sketch_exists.description = Набросок с очищенным именем\n“%s” уже существует. save_file.messages.tab_exists = Не удалось сохранить -save_file.messages.tab_exists.description = Нельзя сохранить эскиз "%s"\n. Вкладка с таким именем уже открыта +save_file.messages.tab_exists.description = Нельзя сохранить набросок "%s"\n. Вкладка с таким именем уже открыта save_file.messages.recursive_save = Сохранение в стиле Боргеса -save_file.messages.recursive_save.description = Нельзя сохранить эскиз в папку внутри\nсамого себя. Будет циклическая зависимость. +save_file.messages.recursive_save.description = Нельзя сохранить набросок в папку внутри\nсамого себя. Будет циклическая зависимость. # Add handler -add_file.messages.is_read_only = Эскиз "только для чтения" +add_file.messages.is_read_only = Набросок "только для чтения" add_file.messages.is_read_only.description = Некоторые файлы помечены "только для чтения".\nСохраните их в другом месте и попробуйте снова. add_file.messages.confirm_replace = Заменить существующюю версию %s? add_file.messages.error_adding = Ошибка при добавлении файла add_file.messages.cannot_delete.description = Не получилось удалить существующий файл '%s'. -add_file.messages.cannot_add.description = Не удалось добавить '%s' в эскиз. +add_file.messages.cannot_add.description = Не удалось добавить '%s' в набросок. add_file.messages.same_file = Меня не обдуришь add_file.messages.same_file.description = Этот файл уже был скопирован в то место\nкуда вы пытаетесь его скопировать.\nНичего не будет сделано. @@ -442,23 +442,23 @@ temp_dir.messages.bad_build_folder = Плохая папка сборки temp_dir.messages.bad_build_folder.description = Не удалось найти место для сборки. # Ensure Existance -ensure_exist.messages.missing_sketch = Эскиз не найден -ensure_exist.messages.missing_sketch.description = Папка с эскизом не найдена.\nПопробуем сохранить заново, некоторые\nизменения возможно будут утрачены. -ensure_exist.messages.unrecoverable = Не удалось востановить эскиз -ensure_exist.messages.unrecoverable.description = Не удалось повторно сохранить эскиз. У вас могут возникнуть трудности,\nпри редактировании в внешнем текстовом редакторе. +ensure_exist.messages.missing_sketch = Набросок не найден +ensure_exist.messages.missing_sketch.description = Папка с наброском не найдена.\nПопробуем сохранить заново, некоторые\nизменения возможно будут утрачены. +ensure_exist.messages.unrecoverable = Не удалось востановить набросок +ensure_exist.messages.unrecoverable.description = Не удалось повторно сохранить набросок. У вас могут возникнуть трудности,\nпри редактировании в внешнем текстовом редакторе. # Check name -check_name.messages.is_name_modified = Имя эскиза было изменено. Имена эскизов могут состоять\nтолько из ASCII-символов и цифр (но не могут начинаться с цифры).\nТакже имя не должно быть больше 64-ёх +check_name.messages.is_name_modified = Имя наброска было изменено. Имена набросков могут состоять\nтолько из ASCII-символов и цифр (но не могут начинаться с цифры).\nТакже имя не должно быть больше 64-ёх # External changes detector change_detect.reload.title=Вкладка изменена вне приложения change_detect.reload.question="%s" изменена другим приложением. -change_detect.reload.comment=Оставить или перезагрузить изменения?\nВ любом случае файл будет сохранён в папке с эскизом. +change_detect.reload.comment=Оставить или перезагрузить изменения?\nВ любом случае файл будет сохранён в папке с наброском. change_detect.button.keep=Оставить change_detect.button.load_new=Перезагрузить change_detect.delete.title=Вкладка удалена вне программы change_detect.delete.question="%s" пропала из папки с работами. -change_detect.delete.comment=Хотите пересохранить или удалить эскиз? +change_detect.delete.comment=Хотите пересохранить или удалить набросок? change_detect.button.discard=Удалить change_detect.button.resave=Пересохранить @@ -569,7 +569,7 @@ color_chooser.select = Выбрать movie_maker = Генератор видео movie_maker.title = Генератор QuickTime -movie_maker.blurb = Этот инструмент делает QuickTime видео из последовательности изображений.

Для недопущения появления артефактов от пересжатеия изобажений в видео
используйте TIFF, TGA (из Processing) или PNG форматы.

Изображения TIFF и TGA обработаются быстрее, но получившееся видео будет занимать больше места на диске:
saveFrame("frames/####.tif");
saveFrame("frames/####.tga");

PNG изображения меньше, но эскиз будет работать медленно:
saveFrame("frames/####.png");

Код на основе QuickTime Movie Maker 1.5.1 2011-01-17.
Copyright © 2010-2011 Werner Randelshofer. Все права защищены.
+movie_maker.blurb = Этот инструмент делает QuickTime видео из последовательности изображений.

Для недопущения появления артефактов от пересжатеия изобажений в видео
используйте TIFF, TGA (из Processing) или PNG форматы.

Изображения TIFF и TGA обработаются быстрее, но получившееся видео будет занимать больше места на диске:
saveFrame("frames/####.tif");
saveFrame("frames/####.tga");

PNG изображения меньше, но набросок будет работать медленно:
saveFrame("frames/####.png");

Код на основе QuickTime Movie Maker 1.5.1 2011-01-17.
Copyright © 2010-2011 Werner Randelshofer. Все права защищены.
movie_maker.image_folder_help_label = Перетяните папку с изображениями в поле ниже: movie_maker.choose_button = Выбрать... movie_maker.select_image_folder = Выбрать папку с изображениями... From 2d2b4779013045512cb469e615b0dc376672292a Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Tue, 9 Oct 2018 09:19:36 +0200 Subject: [PATCH 010/172] Move Ctrl+Left Mouse code from surfaces to PApplet --- core/src/processing/awt/PSurfaceAWT.java | 23 ---------------- core/src/processing/core/PApplet.java | 29 +++++++++++++++++++- core/src/processing/javafx/PSurfaceFX.java | 25 ----------------- core/src/processing/opengl/PSurfaceJOGL.java | 22 --------------- 4 files changed, 28 insertions(+), 71 deletions(-) diff --git a/core/src/processing/awt/PSurfaceAWT.java b/core/src/processing/awt/PSurfaceAWT.java index 2c56d25468..71a59e87f5 100644 --- a/core/src/processing/awt/PSurfaceAWT.java +++ b/core/src/processing/awt/PSurfaceAWT.java @@ -1231,14 +1231,6 @@ public void componentResized(ComponentEvent e) { */ - // MACOSX: CTRL + Left Mouse is converted to Right Mouse. This boolean keeps - // track of whether the conversion happened on PRESS, because we should report - // the same button during DRAG and on RELEASE, even though CTRL might have - // been released already. Otherwise the events are inconsistent, e.g. - // Left Pressed - Left Drag - CTRL Pressed - Right Drag - Right Released. - // See: https://github.com/processing/processing/issues/5672 - private boolean macosxLeftButtonWithCtrlPressed; - /** * Figure out how to process a mouse event. When loop() has been * called, the events will be queued up until drawing is complete. @@ -1324,21 +1316,6 @@ protected void nativeMouseEvent(java.awt.event.MouseEvent nativeEvent) { peButton = PConstants.RIGHT; } - // If running on Mac OS, allow ctrl-click as right mouse. Prior to 0215, - // this used isPopupTrigger() on the native event, but that doesn't work - // for mouseClicked and mouseReleased (or others). - if (/*PApplet.platform == PConstants.MACOSX &&*/ peButton == PConstants.LEFT) { - if (peAction == MouseEvent.PRESS && (modifiers & InputEvent.CTRL_MASK) != 0) { - macosxLeftButtonWithCtrlPressed = true; - } - if (macosxLeftButtonWithCtrlPressed) { - peButton = PConstants.RIGHT; - } - if (peAction == MouseEvent.RELEASE) { - macosxLeftButtonWithCtrlPressed = false; - } - } - sketch.postEvent(new MouseEvent(nativeEvent, nativeEvent.getWhen(), peAction, peModifiers, nativeEvent.getX() / windowScaleFactor, diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 457b50ea4b..85f0fb81ad 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -561,6 +561,14 @@ public class PApplet implements PConstants { */ public boolean mousePressed; + // MACOSX: CTRL + Left Mouse is converted to Right Mouse. This boolean keeps + // track of whether the conversion happened on PRESS, because we should report + // the same button during DRAG and on RELEASE, even though CTRL might have + // been released already. Otherwise the events are inconsistent, e.g. + // Left Pressed - Left Drag - CTRL Pressed - Right Drag - Right Released. + // See: https://github.com/processing/processing/issues/5672 + private boolean macosxLeftButtonWithCtrlPressed; + /** @deprecated Use a mouse event handler that passes an event instead. */ @Deprecated @@ -2650,8 +2658,27 @@ protected void handleMouseEvent(MouseEvent event) { mouseY = event.getY(); } + int button = event.getButton(); + + // If running on Mac OS, allow ctrl-click as right mouse. + if (PApplet.platform == PConstants.MACOSX && event.getButton() == PConstants.LEFT) { + if (action == MouseEvent.PRESS && event.isControlDown()) { + macosxLeftButtonWithCtrlPressed = true; + } + if (macosxLeftButtonWithCtrlPressed) { + button = PConstants.RIGHT; + event = new MouseEvent(event.getNative(), event.getMillis(), + event.getAction(), event.getModifiers(), + event.getX(), event.getY(), + button, event.getCount()); + } + if (button == MouseEvent.RELEASE) { + macosxLeftButtonWithCtrlPressed = false; + } + } + // Get the (already processed) button code - mouseButton = event.getButton(); + mouseButton = button; /* // Compatibility for older code (these have AWT object params, not P5) diff --git a/core/src/processing/javafx/PSurfaceFX.java b/core/src/processing/javafx/PSurfaceFX.java index acd80abf5e..4061f36fca 100644 --- a/core/src/processing/javafx/PSurfaceFX.java +++ b/core/src/processing/javafx/PSurfaceFX.java @@ -27,7 +27,6 @@ import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; -import java.awt.event.InputEvent; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; @@ -824,16 +823,6 @@ public void focusLost(FocusEvent e) { mouseMap.put(MouseEvent.MOUSE_EXITED, processing.event.MouseEvent.EXIT); } - - // MACOSX: CTRL + Left Mouse is converted to Right Mouse. This boolean keeps - // track of whether the conversion happened on PRESS, because we should report - // the same button during DRAG and on RELEASE, even though CTRL might have - // been released already. Otherwise the events are inconsistent, e.g. - // Left Pressed - Left Drag - CTRL Pressed - Right Drag - Right Released. - // See: https://github.com/processing/processing/issues/5672 - private boolean macosxLeftButtonWithCtrlPressed; - - protected void fxMouseEvent(MouseEvent fxEvent) { // the 'amount' is the number of button clicks for a click event, // or the number of steps/clicks on the wheel for a mouse wheel event. @@ -871,20 +860,6 @@ protected void fxMouseEvent(MouseEvent fxEvent) { break; } - // If running on Mac OS, allow ctrl-click as right mouse. - // Verified to be necessary with Java 8u45. - if (PApplet.platform == PConstants.MACOSX && button == PConstants.LEFT) { - if (action == processing.event.MouseEvent.PRESS && fxEvent.isControlDown()) { - macosxLeftButtonWithCtrlPressed = true; - } - if (macosxLeftButtonWithCtrlPressed) { - button = PConstants.RIGHT; - } - if (action == processing.event.MouseEvent.RELEASE) { - macosxLeftButtonWithCtrlPressed = false; - } - } - //long when = nativeEvent.getWhen(); // from AWT long when = System.currentTimeMillis(); int x = (int) fxEvent.getX(); // getSceneX()? diff --git a/core/src/processing/opengl/PSurfaceJOGL.java b/core/src/processing/opengl/PSurfaceJOGL.java index 1526047d00..a9de3f0b82 100644 --- a/core/src/processing/opengl/PSurfaceJOGL.java +++ b/core/src/processing/opengl/PSurfaceJOGL.java @@ -1011,15 +1011,6 @@ public void keyTyped(com.jogamp.newt.event.KeyEvent e) { } - // MACOSX: CTRL + Left Mouse is converted to Right Mouse. This boolean keeps - // track of whether the conversion happened on PRESS, because we should report - // the same button during DRAG and on RELEASE, even though CTRL might have - // been released already. Otherwise the events are inconsistent, e.g. - // Left Pressed - Left Drag - CTRL Pressed - Right Drag - Right Released. - // See: https://github.com/processing/processing/issues/5672 - private boolean macosxLeftButtonWithCtrlPressed; - - protected void nativeMouseEvent(com.jogamp.newt.event.MouseEvent nativeEvent, int peAction) { int modifiers = nativeEvent.getModifiers(); @@ -1042,19 +1033,6 @@ protected void nativeMouseEvent(com.jogamp.newt.event.MouseEvent nativeEvent, break; } - // If running on Mac OS, allow ctrl-click as right mouse. - if (PApplet.platform == PConstants.MACOSX && peButton == PConstants.LEFT) { - if (peAction == MouseEvent.PRESS && (modifiers & InputEvent.CTRL_MASK) != 0) { - macosxLeftButtonWithCtrlPressed = true; - } - if (macosxLeftButtonWithCtrlPressed) { - peButton = PConstants.RIGHT; - } - if (peAction == MouseEvent.RELEASE) { - macosxLeftButtonWithCtrlPressed = false; - } - } - int peCount = 0; if (peAction == MouseEvent.WHEEL) { // Invert wheel rotation count so it matches JAVA2D's From 08efe06a42f04d95a5ed4061b70c8852c6a8aced Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Wed, 1 Aug 2018 18:00:28 -0700 Subject: [PATCH 011/172] appdata: add content_rating OARS tag --- build/linux/appdata.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/linux/appdata.xml b/build/linux/appdata.xml index f0fc87f9cd..fce08bd52a 100644 --- a/build/linux/appdata.xml +++ b/build/linux/appdata.xml @@ -28,6 +28,8 @@ + + http://www.processing.org/ https://processing.org/reference/ https://github.com/processing/processing/issues?q=is%3Aopen From 40dfe6a751f9fc7e4158f25272d3a423cb3d561c Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Wed, 1 Aug 2018 18:00:39 -0700 Subject: [PATCH 012/172] appdata: add releases tag --- build/linux/appdata.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build/linux/appdata.xml b/build/linux/appdata.xml index fce08bd52a..be293a642f 100644 --- a/build/linux/appdata.xml +++ b/build/linux/appdata.xml @@ -30,6 +30,13 @@ + + + + + + + http://www.processing.org/ https://processing.org/reference/ https://github.com/processing/processing/issues?q=is%3Aopen From f58f3abb1273cbc8530e0fc3bdf2b1d94e64688c Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Fri, 19 Oct 2018 14:14:31 -0700 Subject: [PATCH 013/172] appdata: clean up license tags It does not make sense for the metadata license to be GPLv3 (see [1]), so make it CC0-1.0. On the other hand, the project is GPL-2.0, so add the appropriate tag. [1] https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-metadata_license --- build/linux/appdata.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/linux/appdata.xml b/build/linux/appdata.xml index be293a642f..612d40d0e7 100644 --- a/build/linux/appdata.xml +++ b/build/linux/appdata.xml @@ -2,7 +2,8 @@ org.processing.processingide.desktop - GPLv3 + CC0-1.0 + GPL-2.0 Processing Foundation Processing IDE From e6d8d27b82ffe0d21c4001580c357f314416c2b1 Mon Sep 17 00:00:00 2001 From: Martin Prout Date: Sun, 21 Oct 2018 07:18:50 +0100 Subject: [PATCH 014/172] Update PApplet.java @Deprecated missing --- core/src/processing/core/PApplet.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 457b50ea4b..9ecb02d2e1 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -8263,6 +8263,7 @@ static public void arrayCopy(Object src, Object dst) { /** * @deprecated Use arrayCopy() instead. */ + @Deprecated static public void arraycopy(Object src, int srcPosition, Object dst, int dstPosition, int length) { @@ -8272,6 +8273,7 @@ static public void arraycopy(Object src, int srcPosition, /** * @deprecated Use arrayCopy() instead. */ + @Deprecated static public void arraycopy(Object src, Object dst, int length) { System.arraycopy(src, 0, dst, 0, length); } @@ -8279,6 +8281,7 @@ static public void arraycopy(Object src, Object dst, int length) { /** * @deprecated Use arrayCopy() instead. */ + @Deprecated static public void arraycopy(Object src, Object dst) { System.arraycopy(src, 0, dst, 0, Array.getLength(src)); } From 869c2327851a115f3cc2f8f1efbb527801879980 Mon Sep 17 00:00:00 2001 From: Sigmund Hansen Date: Mon, 29 Oct 2018 00:15:12 +0100 Subject: [PATCH 015/172] Fixes other panels except the update panel of #5524. --- .../app/contrib/ContributionListing.java | 59 +----- .../app/contrib/ContributionTab.java | 21 +- app/src/processing/app/contrib/ListPanel.java | 127 ++++++------ .../app/contrib/UpdateListPanel.java | 184 +----------------- 4 files changed, 78 insertions(+), 313 deletions(-) diff --git a/app/src/processing/app/contrib/ContributionListing.java b/app/src/processing/app/contrib/ContributionListing.java index e5fe94273c..a4dbf813b4 100644 --- a/app/src/processing/app/contrib/ContributionListing.java +++ b/app/src/processing/app/contrib/ContributionListing.java @@ -53,18 +53,18 @@ public class ContributionListing { Map librariesByImportHeader; // TODO: Every contribution is getting added twice // and nothing is replaced ever. - List allContributions; + Set allContributions; boolean listDownloaded; boolean listDownloadFailed; ReentrantLock downloadingListingLock; private ContributionListing() { - listeners = new ArrayList(); - advertisedContributions = new ArrayList(); - librariesByCategory = new HashMap>(); - librariesByImportHeader = new HashMap(); - allContributions = new ArrayList(); + listeners = new ArrayList<>(); + advertisedContributions = new ArrayList<>(); + librariesByCategory = new HashMap<>(); + librariesByImportHeader = new HashMap<>(); + allContributions = new LinkedHashSet<>(); downloadingListingLock = new ReentrantLock(); //listingFile = Base.getSettingsFile("contributions.txt"); @@ -96,7 +96,6 @@ private void setAdvertisedList(File file) { for (Contribution contribution : advertisedContributions) { addContribution(contribution); } - Collections.sort(allContributions, COMPARATOR); } @@ -139,11 +138,8 @@ protected void replaceContribution(Contribution oldLib, Contribution newLib) { } } - for (int i = 0; i < allContributions.size(); i++) { - if (allContributions.get(i) == oldLib) { - allContributions.set(i, newLib); - } - } + allContributions.remove(oldLib); + allContributions.add(newLib); notifyChange(oldLib, newLib); } @@ -169,7 +165,6 @@ private void addContribution(Contribution contribution) { } allContributions.add(contribution); notifyAdd(contribution); - Collections.sort(allContributions, COMPARATOR); } } @@ -234,43 +229,7 @@ protected Set getCategories(Contribution.Filter filter) { } -// public List getAllContributions() { -// return new ArrayList(allContributions); -// } - - -// public List getLibararies(String category) { -// ArrayList libinfos = -// new ArrayList(librariesByCategory.get(category)); -// Collections.sort(libinfos, nameComparator); -// return libinfos; -// } - - - protected List getFilteredLibraryList(String category, List filters) { - ArrayList filteredList = - new ArrayList(allContributions); - - Iterator it = filteredList.iterator(); - while (it.hasNext()) { - Contribution libInfo = it.next(); - //if (category != null && !category.equals(libInfo.getCategory())) { - if (category != null && !libInfo.hasCategory(category)) { - it.remove(); - } else { - for (String filter : filters) { - if (!matches(libInfo, filter)) { - it.remove(); - break; - } - } - } - } - return filteredList; - } - - - private boolean matches(Contribution contrib, String typed) { + public boolean matches(Contribution contrib, String typed) { int colon = typed.indexOf(":"); if (colon != -1) { String isText = typed.substring(0, colon); diff --git a/app/src/processing/app/contrib/ContributionTab.java b/app/src/processing/app/contrib/ContributionTab.java index 532d7f9ed9..d00277cb22 100644 --- a/app/src/processing/app/contrib/ContributionTab.java +++ b/app/src/processing/app/contrib/ContributionTab.java @@ -73,11 +73,7 @@ public ContributionTab(ManagerFrame dialog, ContributionType type) { this.contribDialog = dialog; this.contribType = type; - filter = new Contribution.Filter() { - public boolean matches(Contribution contrib) { - return contrib.getType() == contribType; - } - }; + filter = contrib -> contrib.getType() == contribType; contribListing = ContributionListing.getInstance(); statusPanel = new StatusPanel(this, 650); @@ -85,12 +81,6 @@ public boolean matches(Contribution contrib) { contribListing.addListener(contributionListPanel); } - -// public boolean hasUpdates(Base base) { -// return contribListing.hasUpdates(base); -// } - - public void showFrame(final Editor editor, boolean error, boolean loading) { this.editor = editor; @@ -277,9 +267,7 @@ protected void updateCategoryChooser() { protected void filterLibraries(String category, List filters) { - List filteredLibraries = - contribListing.getFilteredLibraryList(category, filters); - contributionListPanel.filterLibraries(filteredLibraries); + contributionListPanel.filterLibraries(category, filters); } @@ -449,11 +437,8 @@ protected void updateAll() { contributionListPanel.panelByContribution.values(); for (DetailPanel detailPanel : collection) { detailPanel.update(); - - // Refreshing the ContributionUpdateTab's status icons - contributionListPanel.updatePanelOrdering(contributionListPanel - .panelByContribution.keySet()); } + contributionListPanel.model.fireTableDataChanged(); } diff --git a/app/src/processing/app/contrib/ListPanel.java b/app/src/processing/app/contrib/ListPanel.java index 2acb690b24..c83fc4773d 100644 --- a/app/src/processing/app/contrib/ListPanel.java +++ b/app/src/processing/app/contrib/ListPanel.java @@ -46,13 +46,12 @@ public class ListPanel extends JPanel implements Scrollable, ContributionListing.ChangeListener { ContributionTab contributionTab; TreeMap panelByContribution = new TreeMap<>(ContributionListing.COMPARATOR); - Set visibleContributions = new TreeSet<>(ContributionListing.COMPARATOR); private DetailPanel selectedPanel; - protected Contribution.Filter filter; + protected ContributionRowFilter filter; protected ContributionListing contribListing = ContributionListing.getInstance(); protected JTable table; - DefaultTableModel model; + ContributionTableModel model; JScrollPane scrollPane; static Icon upToDateIcon; @@ -77,14 +76,15 @@ public ListPanel() { public ListPanel(final ContributionTab contributionTab, - Contribution.Filter filter) { + final Contribution.Filter filter) { + this(); this.contributionTab = contributionTab; - this.filter = filter; + this.filter = new ContributionRowFilter(filter); setLayout(new GridBagLayout()); setOpaque(true); setBackground(Color.WHITE); - model = new ContribTableModel(); + model = new ContributionTableModel(); table = new JTable(model) { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { @@ -99,8 +99,6 @@ public Component prepareRenderer(TableCellRenderer renderer, int row, int column }; // There is a space before Status - String[] colName = { " Status", "Name", "Author" }; - model.setColumnIdentifiers(colName); scrollPane = new JScrollPane(table); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setBorder(BorderFactory.createEmptyBorder()); @@ -135,8 +133,9 @@ public void valueChanged(ListSelectionEvent event) { } }); - TableRowSorter sorter = new TableRowSorter<>(table.getModel()); + TableRowSorter sorter = new TableRowSorter<>(model); table.setRowSorter(sorter); + sorter.setRowFilter(this.filter); sorter.setComparator(1, ContributionListing.COMPARATOR); sorter.setComparator(2, Comparator.comparing(o -> getAuthorNameWithoutMarkup(((Contribution) o).getAuthorList()))); sorter.setComparator(0, Comparator.comparingInt(o -> getContributionStatusRank((Contribution) o))); @@ -354,16 +353,62 @@ private void configureAuthorsColumnLabel(JLabel label, Contribution contribution } } - static private class ContribTableModel extends DefaultTableModel { + protected class ContributionTableModel extends AbstractTableModel { @Override - public boolean isCellEditable(int row, int column) { - return false; + public int getRowCount() { + return contribListing.allContributions.size(); + } + + @Override + public int getColumnCount() { + return 3; + } + + @Override + public String getColumnName(int column) { + switch (column) { + case 0: return " Status"; // Note the space + case 1: return "Name"; + case 2: return "Author"; + default: return ""; + } } @Override public Class getColumnClass(int columnIndex) { return Contribution.class; } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return contribListing.allContributions.stream().skip(rowIndex).findFirst().get(); + } + } + + protected class ContributionRowFilter extends RowFilter { + Contribution.Filter contributionFilter; + Optional categoryFilter = Optional.empty(); + List stringFilters = Collections.emptyList(); + + ContributionRowFilter(Contribution.Filter contributionFilter) { + this.contributionFilter = contributionFilter; + } + + public void setCategoryFilter(String categoryFilter) { + this.categoryFilter = Optional.ofNullable(categoryFilter); + } + + public void setStringFilters(List filters) { + this.stringFilters = filters; + } + + @Override + public boolean include(Entry entry) { + Contribution contribution = (Contribution) entry.getValue(0); + return contributionFilter.matches(contribution) + && categoryFilter.map(contribution::hasCategory).orElse(true) + && stringFilters.stream().allMatch(pattern -> contribListing.matches(contribution, pattern)); + } } String getAuthorNameWithoutMarkup(String authorList) { @@ -387,32 +432,15 @@ String getAuthorNameWithoutMarkup(String authorList) { return name.toString(); } - // Thread: EDT - void updatePanelOrdering(Set contributionsSet) { - model.getDataVector().removeAllElements(); - int rowCount = 0; - for (Contribution entry : contributionsSet) { - model.addRow(new Object[]{entry, entry, entry}); - if (selectedPanel != null && - entry.getName().equals(selectedPanel.getContrib().getName())) { - table.setRowSelectionInterval(rowCount, rowCount); - } - rowCount++; - } - model.fireTableDataChanged(); - } - - // Thread: EDT public void contributionAdded(final Contribution contribution) { - if (filter.matches(contribution) && !panelByContribution.containsKey(contribution)) { + if (!panelByContribution.containsKey(contribution)) { DetailPanel newPanel = new DetailPanel(ListPanel.this); panelByContribution.put(contribution, newPanel); - visibleContributions.add(contribution); newPanel.setContribution(contribution); add(newPanel); - updatePanelOrdering(visibleContributions); + model.fireTableDataChanged(); updateColors(); // XXX this is the place } } @@ -420,24 +448,20 @@ public void contributionAdded(final Contribution contribution) { // Thread: EDT public void contributionRemoved(final Contribution contribution) { - if (filter.matches(contribution)) { DetailPanel panel = panelByContribution.get(contribution); if (panel != null) { remove(panel); panelByContribution.remove(contribution); } - visibleContributions.remove(contribution); - updatePanelOrdering(visibleContributions); + model.fireTableDataChanged(); updateColors(); updateUI(); - } } // Thread: EDT public void contributionChanged(final Contribution oldContrib, final Contribution newContrib) { - if (filter.matches(oldContrib) || filter.matches(newContrib)) { DetailPanel panel = panelByContribution.get(oldContrib); if (panel == null) { contributionAdded(newContrib); @@ -445,37 +469,16 @@ public void contributionChanged(final Contribution oldContrib, panelByContribution.remove(oldContrib); panel.setContribution(newContrib); panelByContribution.put(newContrib, panel); + model.fireTableDataChanged(); } - if (visibleContributions.contains(oldContrib)) { - visibleContributions.remove(oldContrib); - visibleContributions.add(newContrib); - } - updatePanelOrdering(visibleContributions); - } } // Thread: EDT - public void filterLibraries(List filteredContributions) { - visibleContributions.clear(); - for (Contribution contribution : panelByContribution.keySet()) { - if (contribution.getType() == contributionTab.contribType - && filteredContributions.contains(contribution) - && panelByContribution.keySet().contains(contribution)) { - // contains() uses equals() and there can be multiple instances, - // so Contribution.equals() has to be overridden - visibleContributions.add(contribution); - } - } - // TODO: Make the following loop work for optimization -// for (Contribution contribution : filteredContributions) { -// if (contribution.getType() == contributionTab.contribType) { -// if(panelByContribution.keySet().contains(contribution)){ -// visibleContributions.add(contribution); -// } -// } -// } - updatePanelOrdering(visibleContributions); + public void filterLibraries(String category, List filters) { + filter.setCategoryFilter(category); + filter.setStringFilters(filters); + model.fireTableDataChanged(); } diff --git a/app/src/processing/app/contrib/UpdateListPanel.java b/app/src/processing/app/contrib/UpdateListPanel.java index 7399278524..60c7c36d0e 100644 --- a/app/src/processing/app/contrib/UpdateListPanel.java +++ b/app/src/processing/app/contrib/UpdateListPanel.java @@ -33,188 +33,6 @@ public class UpdateListPanel extends ListPanel { public UpdateListPanel(ContributionTab contributionTab, Contribution.Filter filter) { - this.contributionTab = contributionTab; - this.filter = filter; - - setOpaque(true); - setBackground(Color.WHITE); - - model = new DefaultTableModel() { - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - - @Override - public Class getColumnClass(int columnIndex) { - return (columnIndex == 0) ? Icon.class : String.class; - } - }; - - model.setColumnIdentifiers(new String[] { - "", "Name", "Author", "Installed", "Available" - }); - - table = new JTable(model) { - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { - Component c = super.prepareRenderer(renderer, row, column); - String title = (String) getValueAt(row, 1); - if (sectionNames.contains(title)) { - c.setBackground(SECTION_COLOR); - } else { - c.setBackground(Color.WHITE); - } - return c; - } - - @Override - public void changeSelection(int rowIndex, int columnIndex, - boolean toggle, boolean extend) { - String title = (String) getValueAt(rowIndex, 1); - // Disallow selection on the fake rows - if (!sectionNames.contains(title)) { - super.changeSelection(rowIndex, columnIndex, toggle, extend); - } - } - }; - - scrollPane = new JScrollPane(table); - scrollPane.setBorder(BorderFactory.createEmptyBorder()); - - table.setFillsViewportHeight(true); - table.setSelectionBackground(new Color(0xe0fffd)); - table.setSelectionForeground(table.getForeground()); - table.setFont(ManagerFrame.NORMAL_PLAIN); - table.setRowHeight(30); - table.setRowMargin(6); - table.getColumnModel().setColumnMargin(-1); - table.getColumnModel().getColumn(0).setMaxWidth(60); - table.setShowGrid(false); - table.setCellSelectionEnabled(false); - table.setRowSelectionAllowed(true); - table.setAutoCreateColumnsFromModel(true); - table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - table.setDefaultRenderer(String.class, new DefaultTableCellRenderer() { - @Override - public Component getTableCellRendererComponent(JTable table, - Object value, - boolean isSelected, - boolean hasFocus, - int row, int column) { - return super.getTableCellRendererComponent(table, value, isSelected, - false, row, column); - } - }); - - table.getTableHeader().setDefaultRenderer(new ContribHeaderRenderer()); /* { - @Override - public Component getTableCellRendererComponent(JTable table, - Object value, - boolean isSelected, - boolean hasFocus, int row, - int column) { - super.getTableCellRendererComponent(table, value, isSelected, - hasFocus, row, column); - JTableHeader tableHeader = table.getTableHeader(); - if (tableHeader != null) { - setForeground(tableHeader.getForeground()); - } - setIcon(getSortIcon(table, column)); - setBackground(new Color(0xebebeb)); - return this; - } - });*/ - - GroupLayout layout = new GroupLayout(this); - layout.setHorizontalGroup(layout.createParallelGroup().addComponent(scrollPane)); - layout.setVerticalGroup(layout.createSequentialGroup().addComponent(scrollPane)); - - setLayout(layout); - table.setVisible(true); - - panelByContribution = new TreeMap<>(Comparator.comparingInt(c -> ContributionManager.getTypeIndex(((Contribution) c).getType())) - .thenComparing(c -> ((Contribution) c).getName().toLowerCase())); - } - - // Thread: EDT - @Override - void updatePanelOrdering(Set contributionsSet) { - model.getDataVector().removeAllElements(); - ContributionType currentType = null; - - String fontFace = ""; - - for (Contribution entry : contributionsSet) { - if (entry.getType() != currentType) { - currentType = entry.getType(); - model.addRow(new Object[] { - null, currentType.getPluralTitle(), null, null, null - }); - } - String name = getAuthorNameWithoutMarkup(entry.getAuthorList()); - Icon icon = null; - if (entry.isInstalled()) { - icon = upToDateIcon; - if (contribListing.hasUpdates(entry)) { - icon = updateAvailableIcon; - } - if (!entry.isCompatible(Base.getRevision())) { - icon = incompatibleIcon; - } - } - if ((panelByContribution.get(entry)).updateInProgress || - (panelByContribution.get(entry)).installInProgress) { - // Display "Loading icon" if download/install in progress - icon = downloadingIcon; - } - model.addRow(new Object[] { - icon, - "" + fontFace + entry.getName() + "", - name, - entry.getBenignVersion(), - contributionTab.contribListing.getLatestPrettyVersion(entry) - }); - } - model.fireTableDataChanged(); - UpdateContributionTab tab = (UpdateContributionTab) contributionTab; - ((UpdateStatusPanel) tab.statusPanel).update(); - } - - - // Thread: EDT - @Override - public void contributionAdded(final Contribution contribution) { - if (filter.matches(contribution)) { - // TODO make this longer and more contorted [fry] - DetailPanel newPanel = - contributionTab.contribDialog.getTab(contribution.getType()).contributionListPanel.panelByContribution.get(contribution); - if (newPanel == null) { - newPanel = new DetailPanel(UpdateListPanel.this); - } - if (!panelByContribution.containsKey(contribution)) { - panelByContribution.put(contribution, newPanel); - } - visibleContributions.add(contribution); - newPanel.setContribution(contribution); - add(newPanel); - updatePanelOrdering(panelByContribution.keySet()); - updateColors(); // XXX this is the place - } - } - - // Thread: EDT - @Override - public void contributionChanged(final Contribution oldContrib, - final Contribution newContrib) { - DetailPanel panel = panelByContribution.get(oldContrib); - if (panel == null) { - contributionAdded(newContrib); - } else if (newContrib.isInstalled()) { - panelByContribution.remove(oldContrib); - visibleContributions.remove(oldContrib); - } - updatePanelOrdering(visibleContributions); + super(contributionTab, filter); } } From 1b3d72eb289d0f6eb2d20a1f8964dc35981f4572 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Wed, 7 Nov 2018 22:24:45 +0100 Subject: [PATCH 016/172] Stop frame rate counter from exaggerating Frame rate counter finally gets its ticket for speeding. Frame rate is now calculated by averaging frame times instead of averaging frame rates. Rationale is explained in the comment. --- core/src/processing/core/PApplet.java | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 457b50ea4b..7a4adf910d 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -705,7 +705,7 @@ public class PApplet implements PConstants { * @see PApplet#frameRate(float) * @see PApplet#frameCount */ - public float frameRate = 10; + public float frameRate = 60; protected boolean looping = true; @@ -2426,9 +2426,34 @@ public void handleDraw() { } else { // frameCount > 0, meaning an actual draw() // update the current frameRate - double rate = 1000000.0 / ((now - frameRateLastNanos) / 1000000.0); - float instantaneousRate = (float) (rate / 1000.0); - frameRate = (frameRate * 0.9f) + (instantaneousRate * 0.1f); + + // Calculate frameRate through average frame times, not average fps, e.g.: + // + // Alternating 2 ms and 20 ms frames (JavaFX or JOGL sometimes does this) + // is around 90.91 fps (two frames in 22 ms, one frame 11 ms). + // + // However, averaging fps gives us: (500 fps + 50 fps) / 2 = 275 fps. + // This is because we had 500 fps for 2 ms and 50 fps for 20 ms, but we + // counted them with equal weight. + // + // If we average frame times instead, we get the right result: + // (2 ms + 20 ms) / 2 = 11 ms per frame, which is 1000/11 = 90.91 fps. + // + // The counter below uses exponential moving average. To do the + // calculation, we first convert the accumulated frame rate to average + // frame time, then calculate the exponential moving average, and then + // convert the average frame time back to frame rate. + { + // Get the frame time of the last frame + double frameTimeSecs = (now - frameRateLastNanos) / 1e9; + // Convert average frames per second to average frame time + double avgFrameTimeSecs = 1.0 / (double) frameRate; + // Calculate exponential moving average of frame time + final double alpha = 0.05; + avgFrameTimeSecs = (1.0 - alpha) * avgFrameTimeSecs + alpha * frameTimeSecs; + // Convert frame time back to frames per second + frameRate = (float) (1.0 / avgFrameTimeSecs); + } if (frameCount != 0) { handleMethods("pre"); From d35243f2654a206673968559e2061be67c6dfdc6 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Wed, 7 Nov 2018 22:30:11 +0100 Subject: [PATCH 017/172] Fix buffer initialized with wrong number of components Poly vertex buffer was initialized with 3 components, but has 4. --- core/src/processing/opengl/PGraphicsOpenGL.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 6b0f42c635..719b482e97 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -1190,7 +1190,7 @@ protected void createPolyBuffers() { if (!polyBuffersCreated || polyBuffersContextIsOutdated()) { polyBuffersContext = pgl.getCurrentContext(); - bufPolyVertex = new VertexBuffer(this, PGL.ARRAY_BUFFER, 3, PGL.SIZEOF_FLOAT); + bufPolyVertex = new VertexBuffer(this, PGL.ARRAY_BUFFER, 4, PGL.SIZEOF_FLOAT); bufPolyColor = new VertexBuffer(this, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_INT); bufPolyNormal = new VertexBuffer(this, PGL.ARRAY_BUFFER, 3, PGL.SIZEOF_FLOAT); bufPolyTexcoord = new VertexBuffer(this, PGL.ARRAY_BUFFER, 2, PGL.SIZEOF_FLOAT); From 56df7026bd648d8b0f0993c7e74351fc193ea69d Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Wed, 7 Nov 2018 22:47:38 +0100 Subject: [PATCH 018/172] Recreate FBOs when offscreen PGraphicsOpenGL is resized Otherwise FBOs keep the old size and things understandably break. --- core/src/processing/opengl/PGraphicsOpenGL.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 6b0f42c635..30afe6d130 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6797,6 +6797,9 @@ protected void setGLSettings() { } else { // offscreen surfaces are transparent by default. background(0x00 << 24 | (backgroundColor & 0xFFFFFF)); + + // Recreate offscreen FBOs + restartPGL(); } // Sets the default projection and camera (initializes modelview). From 67453328bf189b3209557c49cf6d9ee1f7d4aaf8 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sat, 17 Nov 2018 15:11:06 +0100 Subject: [PATCH 019/172] Fix freeze when restarting sketch with variables in size While sketch is running, rewriting sketch size to variables and trying to restart the sketch by pressing the play button causes PDE to freeze. Fixed by moving AWT call to EDT. --- java/src/processing/mode/java/preproc/PdePreprocessor.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java index 432f5c4d4d..1b38e14311 100644 --- a/java/src/processing/mode/java/preproc/PdePreprocessor.java +++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java @@ -27,6 +27,7 @@ package processing.mode.java.preproc; +import java.awt.*; import java.io.*; import java.util.*; import java.util.regex.MatchResult; @@ -380,7 +381,9 @@ make sure that it uses numbers (or displayWidth/Height), copy into settings "The size of this sketch could not be determined from your code.\n" + "Use only numbers (not variables) for the size() command.\n" + "Read the size() reference for more details."; - Messages.showWarning("Could not find sketch size", message, null); + EventQueue.invokeLater(() -> { + Messages.showWarning("Could not find sketch size", message, null); + }); // new Exception().printStackTrace(System.out); // return null; throw new SketchException("Please fix the size() line to continue.", false); From 768c6710f8a4422c9e76a4af4bf57d24b54cc30b Mon Sep 17 00:00:00 2001 From: Sigmund Hansen Date: Sun, 30 Dec 2018 14:47:10 +0100 Subject: [PATCH 020/172] Fixes update panel in #5524. --- .../app/contrib/ContributionListing.java | 6 +- .../app/contrib/ContributionTab.java | 6 +- app/src/processing/app/contrib/ListPanel.java | 196 ++++++++++++++---- .../processing/app/contrib/ManagerFrame.java | 2 +- .../app/contrib/UpdateContributionTab.java | 23 +- .../app/contrib/UpdateListPanel.java | 72 ++++--- 6 files changed, 224 insertions(+), 81 deletions(-) diff --git a/app/src/processing/app/contrib/ContributionListing.java b/app/src/processing/app/contrib/ContributionListing.java index a4dbf813b4..c20b4dc407 100644 --- a/app/src/processing/app/contrib/ContributionListing.java +++ b/app/src/processing/app/contrib/ContributionListing.java @@ -560,11 +560,7 @@ public Map getLibrariesByImportHeader() { } - static public Comparator COMPARATOR = new Comparator() { - public int compare(Contribution o1, Contribution o2) { - return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); - } - }; + static public Comparator COMPARATOR = Comparator.comparing(o -> o.getName().toLowerCase()); public interface ChangeListener { diff --git a/app/src/processing/app/contrib/ContributionTab.java b/app/src/processing/app/contrib/ContributionTab.java index d00277cb22..9028e0644d 100644 --- a/app/src/processing/app/contrib/ContributionTab.java +++ b/app/src/processing/app/contrib/ContributionTab.java @@ -77,7 +77,7 @@ public ContributionTab(ManagerFrame dialog, ContributionType type) { contribListing = ContributionListing.getInstance(); statusPanel = new StatusPanel(this, 650); - contributionListPanel = new ListPanel(this, filter); + contributionListPanel = new ListPanel(this, filter, false); contribListing.addListener(contributionListPanel); } @@ -445,4 +445,8 @@ protected void updateAll() { protected boolean hasUpdates() { return contributionListPanel.getRowCount() > 0; } + + public boolean filterHasFocus() { + return filterField != null && filterField.hasFocus(); + } } diff --git a/app/src/processing/app/contrib/ListPanel.java b/app/src/processing/app/contrib/ListPanel.java index c83fc4773d..cf73db21d5 100644 --- a/app/src/processing/app/contrib/ListPanel.java +++ b/app/src/processing/app/contrib/ListPanel.java @@ -35,6 +35,7 @@ import processing.app.Base; import processing.app.Platform; import processing.app.ui.Toolkit; +import sun.swing.SwingUtilities2; // The "Scrollable" implementation and its methods here take care of preventing @@ -49,8 +50,8 @@ public class ListPanel extends JPanel private DetailPanel selectedPanel; protected ContributionRowFilter filter; - protected ContributionListing contribListing = ContributionListing.getInstance(); protected JTable table; + protected TableRowSorter sorter; ContributionTableModel model; JScrollPane scrollPane; @@ -62,7 +63,15 @@ public class ListPanel extends JPanel // Should this be in theme.txt? Of course! Is it? No. static final Color HEADER_BGCOLOR = new Color(0xffEBEBEB); + static final Color SECTION_COLOR = new Color(0xFFf8f8f8); + static final Color SELECTION_COLOR = new Color(0xffe0fffd); + static final SectionHeaderContribution[] sections = { + new SectionHeaderContribution(ContributionType.LIBRARY), + new SectionHeaderContribution(ContributionType.MODE), + new SectionHeaderContribution(ContributionType.TOOL), + new SectionHeaderContribution(ContributionType.EXAMPLES) + }; public ListPanel() { if (upToDateIcon == null) { @@ -76,7 +85,9 @@ public ListPanel() { public ListPanel(final ContributionTab contributionTab, - final Contribution.Filter filter) { + final Contribution.Filter filter, + final boolean enableSections, + final ContributionColumn... columns) { this(); this.contributionTab = contributionTab; this.filter = new ContributionRowFilter(filter); @@ -84,18 +95,29 @@ public ListPanel(final ContributionTab contributionTab, setLayout(new GridBagLayout()); setOpaque(true); setBackground(Color.WHITE); - model = new ContributionTableModel(); + model = new ContributionTableModel(columns); + model.enableSections(enableSections); table = new JTable(model) { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); - if (isRowSelected(row)) { - c.setBackground(new Color(0xe0fffd)); + Object rowValue = getValueAt(row, column); + if (rowValue instanceof SectionHeaderContribution) { + c.setBackground(SECTION_COLOR); + } else if (isRowSelected(row)) { + c.setBackground(SELECTION_COLOR); } else { c.setBackground(Color.white); } return c; } + + @Override + public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) { + if (!(getValueAt(rowIndex, columnIndex) instanceof SectionHeaderContribution)) { + super.changeSelection(rowIndex, columnIndex, toggle, extend); + } + } }; // There is a space before Status @@ -126,19 +148,22 @@ public void valueChanged(ListSelectionEvent event) { setSelectedPanel(panelByContribution.get(table.getValueAt(table .getSelectedRow(), 0))); // Preventing the focus to move out of filterField after typing every character - if (!contributionTab.filterField.hasFocus()) { + if (!contributionTab.filterHasFocus()) { table.requestFocusInWindow(); } } } }); - TableRowSorter sorter = new TableRowSorter<>(model); + sorter = new TableRowSorter<>(model); table.setRowSorter(sorter); sorter.setRowFilter(this.filter); - sorter.setComparator(1, ContributionListing.COMPARATOR); - sorter.setComparator(2, Comparator.comparing(o -> getAuthorNameWithoutMarkup(((Contribution) o).getAuthorList()))); - sorter.setComparator(0, Comparator.comparingInt(o -> getContributionStatusRank((Contribution) o))); + for (int i=0; i < model.getColumnCount(); i++) { + if (model.columns[i] == ContributionColumn.NAME) { + sorter.setSortKeys(Collections.singletonList(new SortKey(i, SortOrder.ASCENDING))); + } + sorter.setComparator(i, model.columns[i].getComparator()); + } table.getTableHeader().setDefaultRenderer(new ContribHeaderRenderer()); GroupLayout layout = new GroupLayout(this); @@ -149,11 +174,11 @@ public void valueChanged(ListSelectionEvent event) { table.setVisible(true); } - private int getContributionStatusRank(Contribution c) { + private static int getContributionStatusRank(Contribution c) { int pos = 4; if (c.isInstalled()) { pos = 1; - if (contribListing.hasUpdates(c)) { + if (ContributionListing.getInstance().hasUpdates(c)) { pos = 2; } if (!c.isCompatible(Base.getRevision())) { @@ -262,27 +287,41 @@ public Component getTableCellRendererComponent(JTable table, Object value, int column) { Contribution contribution = (Contribution) value; JLabel label = new JLabel(); + ContributionColumn col = model.columns[column]; if (value == null) { // Working on https://github.com/processing/processing/issues/3667 //System.err.println("null value seen in getTableCellRendererComponent()"); // TODO this is now working, but the underlying issue is not fixed return label; } - if (isSelected) { - label.setBackground(new Color(0xe0fffd)); + + label.setOpaque(true); + + if (value instanceof SectionHeaderContribution && col != ContributionColumn.NAME) { + return label; } - if (column == 0) { - configureStatusColumnLabel(label, contribution); - } else if (column == 1) { - configureNameColumnLabel(table, label, contribution); - } else { - configureAuthorsColumnLabel(label, contribution); + switch (col) { + case STATUS: + case STATUS_NO_HEADER: + configureStatusColumnLabel(label, contribution); + break; + case NAME: + configureNameColumnLabel(table, label, contribution); + break; + case AUTHOR: + configureAuthorsColumnLabel(label, contribution); + break; + case INSTALLED_VERSION: + label.setText(contribution.getBenignVersion()); + break; + case AVAILABLE_VERSION: + label.setText(ContributionListing.getInstance().getLatestPrettyVersion(contribution)); + break; } if(!contribution.isCompatible(Base.getRevision())){ label.setForeground(Color.LIGHT_GRAY); } - label.setOpaque(true); return label; } @@ -296,8 +335,11 @@ private void configureStatusColumnLabel(JLabel label, Contribution contribution) } else if (contribution.isInstalled()) { if (!contribution.isCompatible(Base.getRevision())) { icon = incompatibleIcon; - } else if (contribListing.hasUpdates(contribution)) { + } else if (ContributionListing.getInstance().hasUpdates(contribution)) { icon = updateAvailableIcon; + } else if (panelByContribution.get(contribution).installInProgress + || panelByContribution.get(contribution).updateInProgress) { + icon = downloadingIcon; } else { icon = upToDateIcon; } @@ -353,25 +395,64 @@ private void configureAuthorsColumnLabel(JLabel label, Contribution contribution } } + protected enum ContributionColumn { + STATUS(" Status"), + NAME("Name"), + AUTHOR("Author"), + INSTALLED_VERSION("Installed"), + AVAILABLE_VERSION("Available"), + STATUS_NO_HEADER(""); + + final String name; + + ContributionColumn(String name) { + this.name = name; + } + + Comparator getComparator() { + Comparator comparator = Comparator.comparing(Contribution::getType) + .thenComparingInt(contribution -> contribution instanceof SectionHeaderContribution ? 0 : 1); + switch (this) { + case STATUS: + case STATUS_NO_HEADER: + return comparator.thenComparingInt(ListPanel::getContributionStatusRank); + case AUTHOR: + return comparator.thenComparing(contribution -> getAuthorNameWithoutMarkup(contribution.getAuthorList())); + case NAME: + default: + return comparator.thenComparing(Contribution::getName); + } + } + } + protected class ContributionTableModel extends AbstractTableModel { + + ContributionColumn[] columns = { ContributionColumn.STATUS, ContributionColumn.NAME, ContributionColumn.AUTHOR }; + boolean sectionsEnabled; + + ContributionTableModel(ContributionColumn... columns) { + if (columns.length > 0) { + this.columns = columns; + } + } + @Override public int getRowCount() { - return contribListing.allContributions.size(); + return ContributionListing.getInstance().allContributions.size() + (sectionsEnabled ? 4 : 0); } @Override public int getColumnCount() { - return 3; + return columns.length; } @Override public String getColumnName(int column) { - switch (column) { - case 0: return " Status"; // Note the space - case 1: return "Name"; - case 2: return "Author"; - default: return ""; + if (column < 0 || column > columns.length) { + return ""; } + + return columns[column].name; } @Override @@ -381,7 +462,19 @@ public Class getColumnClass(int columnIndex) { @Override public Object getValueAt(int rowIndex, int columnIndex) { - return contribListing.allContributions.stream().skip(rowIndex).findFirst().get(); + if (rowIndex >= ContributionListing.getInstance().allContributions.size()) { + return sections[rowIndex - ContributionListing.getInstance().allContributions.size()]; + } + + return ContributionListing.getInstance().allContributions.stream().skip(rowIndex).findFirst().orElse(null); + } + + public void setColumns(ContributionColumn[] columns) { + this.columns = columns; + } + + public void enableSections(boolean enable) { + this.sectionsEnabled = enable; } } @@ -405,14 +498,46 @@ public void setStringFilters(List filters) { @Override public boolean include(Entry entry) { Contribution contribution = (Contribution) entry.getValue(0); + if (contribution instanceof SectionHeaderContribution) { + return includeSection((SectionHeaderContribution) contribution); + } + return includeContribution(contribution); + } + + private boolean includeContribution(Contribution contribution) { return contributionFilter.matches(contribution) && categoryFilter.map(contribution::hasCategory).orElse(true) - && stringFilters.stream().allMatch(pattern -> contribListing.matches(contribution, pattern)); + && stringFilters.stream().allMatch(pattern -> ContributionListing.getInstance().matches(contribution, pattern)); + } + + private boolean includeSection(SectionHeaderContribution section) { + return ContributionListing.getInstance().allContributions.stream() + .filter(contribution -> contribution.getType() == section.getType()) + .anyMatch(this::includeContribution); + } + } + + protected static class SectionHeaderContribution extends Contribution { + ContributionType type; + + SectionHeaderContribution(ContributionType type) { + this.type = type; + this.name = getTypeName(); + } + + @Override + public ContributionType getType() { + return type; + } + + @Override + public boolean isInstalled() { + return false; } } - String getAuthorNameWithoutMarkup(String authorList) { - StringBuilder name = new StringBuilder(""); + static String getAuthorNameWithoutMarkup(String authorList) { + StringBuilder name = new StringBuilder(); if (authorList != null) { int parentheses = 0; for (int i = 0; i < authorList.length(); i++) { @@ -436,7 +561,7 @@ String getAuthorNameWithoutMarkup(String authorList) { public void contributionAdded(final Contribution contribution) { if (!panelByContribution.containsKey(contribution)) { DetailPanel newPanel = - new DetailPanel(ListPanel.this); + new DetailPanel(this); panelByContribution.put(contribution, newPanel); newPanel.setContribution(contribution); add(newPanel); @@ -632,6 +757,7 @@ public boolean getScrollableTracksViewportWidth() { public int getRowCount() { - return panelByContribution.size(); + // This will count section headers, but it is only used to check if any rows are shown + return sorter.getViewRowCount(); } } diff --git a/app/src/processing/app/contrib/ManagerFrame.java b/app/src/processing/app/contrib/ManagerFrame.java index 85c36353ee..3e25531bf9 100644 --- a/app/src/processing/app/contrib/ManagerFrame.java +++ b/app/src/processing/app/contrib/ManagerFrame.java @@ -73,7 +73,7 @@ public ManagerFrame(Base base) { modesTab = new ContributionTab(this, ContributionType.MODE); toolsTab = new ContributionTab(this, ContributionType.TOOL); examplesTab = new ContributionTab(this, ContributionType.EXAMPLES); - updatesTab = new UpdateContributionTab(this, null); + updatesTab = new UpdateContributionTab(this); } diff --git a/app/src/processing/app/contrib/UpdateContributionTab.java b/app/src/processing/app/contrib/UpdateContributionTab.java index af4a8d2884..a3de07f389 100644 --- a/app/src/processing/app/contrib/UpdateContributionTab.java +++ b/app/src/processing/app/contrib/UpdateContributionTab.java @@ -11,18 +11,18 @@ public class UpdateContributionTab extends ContributionTab { - public UpdateContributionTab(ManagerFrame dialog, ContributionType type) { + public UpdateContributionTab(ManagerFrame dialog) { super(); this.contribDialog = dialog; - this.contribType = type; - - filter = new Contribution.Filter() { - public boolean matches(Contribution contrib) { - if (contrib instanceof LocalContribution) { - return ContributionListing.getInstance().hasUpdates(contrib); - } - return false; + + filter = contrib -> { + if (contrib instanceof ListPanel.SectionHeaderContribution) { + return true; + } + if (contrib instanceof LocalContribution) { + return ContributionListing.getInstance().hasUpdates(contrib); } + return false; }; contributionListPanel = new UpdateListPanel(this, filter); // contributionListPanel.setBorder(new EmptyBorder(8, 8, 8, 8)); @@ -67,4 +67,9 @@ protected void setLayout(boolean error, boolean loading) { setBackground(Color.WHITE); } + + @Override + public void updateStatusPanel(DetailPanel contributionPanel) { + // Do nothing + } } diff --git a/app/src/processing/app/contrib/UpdateListPanel.java b/app/src/processing/app/contrib/UpdateListPanel.java index 60c7c36d0e..75bcca3b6f 100644 --- a/app/src/processing/app/contrib/UpdateListPanel.java +++ b/app/src/processing/app/contrib/UpdateListPanel.java @@ -1,38 +1,50 @@ package processing.app.contrib; -import java.awt.Color; -import java.awt.Component; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Set; -import java.util.TreeMap; - -import javax.swing.BorderFactory; -import javax.swing.GroupLayout; -import javax.swing.Icon; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import processing.app.Base; - - public class UpdateListPanel extends ListPanel { - static final Color SECTION_COLOR = new Color(0xFFf8f8f8); - static final String[] PLURAL_TYPES = { - ContributionType.LIBRARY.getPluralTitle(), - ContributionType.MODE.getPluralTitle(), - ContributionType.TOOL.getPluralTitle(), - ContributionType.EXAMPLES.getPluralTitle(), - }; - Set sectionNames = new HashSet<>(Arrays.asList(PLURAL_TYPES)); + + Contribution.Filter filter; public UpdateListPanel(ContributionTab contributionTab, Contribution.Filter filter) { - super(contributionTab, filter); + super(contributionTab, filter, true, + ContributionColumn.STATUS_NO_HEADER, + ContributionColumn.NAME, + ContributionColumn.AUTHOR, + ContributionColumn.INSTALLED_VERSION, + ContributionColumn.AVAILABLE_VERSION); + + this.filter = filter; + table.getTableHeader().setEnabled(false); + } + + // Thread: EDT + @Override + public void contributionAdded(final Contribution contribution) { + // Ensures contributionAdded in ListPanel is only run on LocalContributions + if (filter.matches(contribution)) { + super.contributionAdded(contribution); + ((UpdateStatusPanel) contributionTab.statusPanel).update(); // Enables update button + } } + + // Thread: EDT + @Override + public void contributionRemoved(final Contribution contribution) { + super.contributionRemoved(contribution); + ((UpdateStatusPanel) contributionTab.statusPanel).update(); // Disables update button on last contribution + } + + // Thread: EDT + @Override + public void contributionChanged(final Contribution oldContrib, + final Contribution newContrib) { + DetailPanel panel = panelByContribution.get(oldContrib); + if (panel == null) { + contributionAdded(newContrib); + } else if (newContrib.isInstalled()) { + panelByContribution.remove(oldContrib); + } + model.fireTableDataChanged(); + } + } From 5b653263cc6151f838c11a61689d756901c11e37 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Thu, 3 Jan 2019 23:47:57 +0900 Subject: [PATCH 021/172] skip Android's SDK folder when adding sketches --- app/src/processing/app/Base.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index af367d374e..1289f3e10e 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -1699,6 +1699,15 @@ protected boolean addSketches(JMenu menu, File folder, return false; // let's not go there } + if (folder.getName().equals("sdk")) { + // This could be Android's SDK folder. Let's double check: + File suspectSDKPath = new File(folder.getParent(), folder.getName()); + File expectedSDKPath = new File(sketchbookFolder, "android" + File.separator + "sdk"); + if (expectedSDKPath.getAbsolutePath().equals(suspectSDKPath.getAbsolutePath())) { + return false; // Most likely the SDK folder, skip it + } + } + String[] list = folder.list(); // If a bad folder or unreadable or whatever, this will come back null if (list == null) { From 869da8c52e5a87589ca707fd4d1629fff7a71d07 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Thu, 10 Jan 2019 05:14:24 -0500 Subject: [PATCH 022/172] unload pixels if only used to init texture --- core/src/processing/opengl/PGraphicsOpenGL.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 6b0f42c635..3caca761fa 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6412,9 +6412,16 @@ protected Object initCache(PImage img) { if (tex == null || tex.contextIsOutdated()) { tex = addTexture(img); if (tex != null) { + boolean dispose = !img.loaded; img.loadPixels(); tex.set(img.pixels, img.format); img.setModified(); + if (dispose) { + // We only used the pixels to load the image into the texture and the user did not request + // to load the pixels, so we should dispose the pixels array to avoid wasting memory + img.pixels = null; + img.loaded = false; + } } } return tex; From 59be7babd9cb1e04d68e10ae99c8e59203f9eb06 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Thu, 10 Jan 2019 06:47:07 -0500 Subject: [PATCH 023/172] added 2D version of invMatrix utility methods --- .../processing/opengl/PGraphicsOpenGL.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 3caca761fa..fd77bfd3a3 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -3772,6 +3772,13 @@ static protected void invTranslate(PMatrix3D matrix, } + static protected void invTranslate(PMatrix2D matrix, + float tx, float ty) { + matrix.preApply(1, 0, -tx, + 0, 1, -ty); + } + + static protected float matrixScale(PMatrix matrix) { // Volumetric scaling factor that is associated to the given // transformation matrix, which is given by the absolute value of its @@ -3857,8 +3864,8 @@ protected void rotateImpl(float angle, float v0, float v1, float v2) { } - static private void invRotate(PMatrix3D matrix, float angle, - float v0, float v1, float v2) { + static protected void invRotate(PMatrix3D matrix, float angle, + float v0, float v1, float v2) { float c = PApplet.cos(-angle); float s = PApplet.sin(-angle); float t = 1.0f - c; @@ -3870,6 +3877,11 @@ static private void invRotate(PMatrix3D matrix, float angle, } + static protected void invRotate(PMatrix2D matrix, float angle) { + matrix.rotate(-angle); + } + + /** * Same as scale(s, s, s). */ @@ -3911,6 +3923,11 @@ static protected void invScale(PMatrix3D matrix, float x, float y, float z) { } + static protected void invScale(PMatrix2D matrix, float x, float y) { + matrix.preApply(1/x, 0, 0, 1/y, 0, 0); + } + + @Override public void shearX(float angle) { float t = (float) Math.tan(angle); From 93bc3bd34031675176e15dd24ddf3116076388a3 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Thu, 10 Jan 2019 06:49:40 -0500 Subject: [PATCH 024/172] removed use of transform stack in PShapeOpenGL --- core/src/processing/opengl/PShapeOpenGL.java | 72 +++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/core/src/processing/opengl/PShapeOpenGL.java b/core/src/processing/opengl/PShapeOpenGL.java index 69701acc1d..0a165b0330 100644 --- a/core/src/processing/opengl/PShapeOpenGL.java +++ b/core/src/processing/opengl/PShapeOpenGL.java @@ -43,7 +43,6 @@ import java.nio.Buffer; import java.util.Arrays; import java.util.HashSet; -import java.util.Stack; /** * This class holds a 3D model composed of vertices, normals, colors @@ -171,7 +170,8 @@ public class PShapeOpenGL extends PShape { // Geometric transformations. protected PMatrix transform; - protected Stack transformStack; + protected PMatrix transformInv; + protected PMatrix matrixInv; // ........................................................ @@ -847,7 +847,7 @@ protected void scaleTextureUV(float uFactor, float vFactor) { protected void addTexture(PImage tex) { if (textures == null) { - textures = new HashSet(); + textures = new HashSet<>(); } textures.add(tex); if (parent != null) { @@ -1334,39 +1334,34 @@ public void applyMatrix(float n00, float n01, float n02, float n03, @Override public void resetMatrix() { - if (shapeCreated && matrix != null && transformStack != null) { + if (shapeCreated && matrix != null && matrixInv != null) { if (family == GROUP) { updateTessellation(); } if (tessellated) { - PMatrix mat = popTransform(); - while (mat != null) { - boolean res = mat.invert(); - if (res) { - applyMatrixImpl(mat); - } else { - PGraphics.showWarning("Transformation applied on the shape cannot be inverted"); - } - mat = popTransform(); - } + applyMatrixImpl(matrixInv); } matrix.reset(); - transformStack.clear(); + matrixInv.reset(); } } protected void transform(int type, float... args) { int dimensions = is3D ? 3 : 2; + boolean invertible = true; checkMatrix(dimensions); if (transform == null) { if (dimensions == 2) { transform = new PMatrix2D(); + transformInv = new PMatrix2D(); } else { transform = new PMatrix3D(); + transformInv = new PMatrix3D(); } } else { transform.reset(); + transformInv.reset(); } int ncoords = args.length; @@ -1380,22 +1375,28 @@ protected void transform(int type, float... args) { case TRANSLATE: if (ncoords == 3) { transform.translate(args[0], args[1], args[2]); + PGraphicsOpenGL.invTranslate((PMatrix3D)transformInv, args[0], args[1], args[2]); } else { transform.translate(args[0], args[1]); + PGraphicsOpenGL.invTranslate((PMatrix2D)transformInv, args[0], args[1]); } break; case ROTATE: if (ncoords == 3) { transform.rotate(args[0], args[1], args[2], args[3]); + PGraphicsOpenGL.invRotate((PMatrix3D)transformInv, args[0], args[1], args[2], args[3]); } else { transform.rotate(args[0]); + PGraphicsOpenGL.invRotate((PMatrix2D)transformInv, -args[0]); } break; case SCALE: if (ncoords == 3) { transform.scale(args[0], args[1], args[2]); + PGraphicsOpenGL.invScale((PMatrix3D)transformInv, args[0], args[1], args[2]); } else { transform.scale(args[0], args[1]); + PGraphicsOpenGL.invScale((PMatrix2D)transformInv, args[0], args[1]); } break; case MATRIX: @@ -1408,32 +1409,20 @@ protected void transform(int type, float... args) { transform.set(args[0], args[1], args[2], args[3], args[4], args[5]); } + transformInv.set(transform); + invertible = transformInv.invert(); break; } matrix.preApply(transform); - pushTransform(); - if (tessellated) applyMatrixImpl(transform); - } - - - protected void pushTransform() { - if (transformStack == null) transformStack = new Stack(); - PMatrix mat; - if (transform instanceof PMatrix2D) { - mat = new PMatrix2D(); + if (invertible) { + matrixInv.apply(transformInv); } else { - mat = new PMatrix3D(); + PGraphics.showWarning("Transformation applied on the shape cannot be inverted"); } - mat.set(transform); - transformStack.push(mat); + if (tessellated) applyMatrixImpl(transform); } - protected PMatrix popTransform() { - if (transformStack == null || transformStack.size() == 0) return null; - return transformStack.pop(); - } - protected void applyMatrixImpl(PMatrix matrix) { if (hasPolys) { tessGeo.applyMatrixOnPolyGeometry(matrix, @@ -1465,6 +1454,23 @@ protected void applyMatrixImpl(PMatrix matrix) { } + @Override + protected void checkMatrix(int dimensions) { + if (matrix == null) { + if (dimensions == 2) { + matrix = new PMatrix2D(); + matrixInv = new PMatrix2D(); + } else { + matrix = new PMatrix3D(); + matrixInv = new PMatrix3D(); + } + } else if (dimensions == 3 && (matrix instanceof PMatrix2D)) { + matrix = new PMatrix3D(matrix); + matrixInv = new PMatrix3D(matrixInv); + } + } + + /////////////////////////////////////////////////////////// // From f9faa49c43154911aedb06c775ce5135c8e225a4 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Thu, 10 Jan 2019 07:04:04 -0500 Subject: [PATCH 025/172] do not show NSWindow warning in the console, cannot hide the native errors though --- app/src/processing/app/ui/EditorConsole.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/processing/app/ui/EditorConsole.java b/app/src/processing/app/ui/EditorConsole.java index da7fe54728..653fe40c84 100644 --- a/app/src/processing/app/ui/EditorConsole.java +++ b/app/src/processing/app/ui/EditorConsole.java @@ -233,6 +233,8 @@ public void message(String what, boolean err) { // https://github.com/processing/processing/issues/5462 // Some discussion on the Apple's developer forums seems to suggest that is not serious: // https://forums.developer.apple.com/thread/105244 + } else if (err && what.contains("NSWindow drag regions should only be invalidated on the Main Thread")) { + // Keep hiding warnings triggered by JOGL on recent macOS versions (this is from 10.14 onwards I think). } else if (err && what.contains("Make pbuffer:")) { // Remove initalization warning from LWJGL. } else if (err && what.contains("XInitThreads() called for concurrent")) { From a0f7665edd4e7b354eede9c4bc011deda8bbe947 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Thu, 10 Jan 2019 08:19:13 -0500 Subject: [PATCH 026/172] check if pixels is null --- core/src/processing/opengl/PGraphicsOpenGL.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index fd77bfd3a3..a146726fee 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6429,7 +6429,7 @@ protected Object initCache(PImage img) { if (tex == null || tex.contextIsOutdated()) { tex = addTexture(img); if (tex != null) { - boolean dispose = !img.loaded; + boolean dispose = img.pixels == null; img.loadPixels(); tex.set(img.pixels, img.format); img.setModified(); From b0065e6c5e9bfec1776e576a83ba37b7f8d458de Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 11 Jan 2019 18:42:39 -0500 Subject: [PATCH 027/172] updates for github issues, etc --- core/todo.txt | 75 +++++++++++++++++++++++++++++---------------------- todo.txt | 2 ++ 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/core/todo.txt b/core/todo.txt index c59fbbf38b..7df49bf6d5 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -11,6 +11,9 @@ X had to back this fix out again X Fixes blend mode not being set correctly, fixing #5645 X https://github.com/processing/processing/issues/5645 X https://github.com/processing/processing/pull/5647 +_ NullPointerException in Contribution Manager +_ https://github.com/processing/processing/issues/5524 +_ https://github.com/processing/processing/pull/5742 gohai X Profile GL3bc is not available on X11GraphicsDevice @@ -20,6 +23,14 @@ X https://github.com/processing/processing/pull/5652 andres X silence TIS/TSM warning message with P2D/P3D/OPENGL since macOS 10.13.4 X https://github.com/processing/processing/issues/5462 +X improve matrix performance in P2D/P3D +X https://github.com/processing/processing/issues/5685 +X Initializing textures loads the pixels array, even if not needed aferwards +X https://github.com/processing/processing/issues/5748 +X Processing 3.4 takes 60 seconds before can edit file +X https://github.com/processing/processing/issues/5707 +X skip Android's SDK folder when adding sketches +X https://github.com/processing/processing/commit/5b653263cc6151f838c11a61689d756901c11e37 _ NullPointerException at java.awt.Window.init(Window.java:497) when using Airplay @@ -71,7 +82,7 @@ _ https://github.com/processing/processing/issues/5249 _ when doing createFont, can we add it to the os fonts available? -_ add separator option to loadTable() +_ add separator option to loadTable() _ https://github.com/processing/processing/issues/5068 _ WARNING: GL pipe is running in software mode (Renderer ID=0x1020400) @@ -91,7 +102,7 @@ _ https://github.com/processing/processing/issues/4678 _ should we drop the 'default' prefix from the ex handler so it's not static? _ http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html -_ option to disable OpenGL ES on Linux? +_ option to disable OpenGL ES on Linux? _ https://github.com/processing/processing/issues/4584 _ textAlign(CENTER) and pixelDensity(2) aligning incorrectly with Java2D @@ -144,12 +155,12 @@ _ https://github.com/processing/processing/issues/4737 _ menu bar not hiding properly in exported applications with FX2D _ https://github.com/processing/processing/issues/4527 _ hideMenuBar() called from setup() works fine -_ just call it around setup time? +_ just call it around setup time? _ the --hide-stop option not working (FX only? traces?) _ make wiki about quirks _ starving the thread makes things really slow down _ keyPressed() is always uppercase, keyTyped() will be correct -_ do we really need setTextFont/Size when we already have Impl? +_ do we really need setTextFont/Size when we already have Impl? _ need keyPressed() to do lower and upper case _ static mode sketches (draw once and halt w/o closing window) _ fix display handling, line up the device order with AWT @@ -183,7 +194,7 @@ _ also not API we want to expose, so sort this out _ or maybe we're fine b/c now FX2D needs it as well _ when did setPath() sneak into PShape? API is nothing like anything else _ probably from the material stuff, but we need to fix that -_ why is createShape() implemented 4x (for P2D, P3D, and 2x versions)? +_ why is createShape() implemented 4x (for P2D, P3D, and 2x versions)? _ shouldn't be static, run it from the renderer, that's point of createXxx() _ public createShape() method that takes another shape as param? _ should just be the constructor doing this, or copy() @@ -235,7 +246,7 @@ _ row count and array size are combined.. need to break apart _ match and iterators _ add match version that returns table that's only a pointer to original _ save the constructor for the version that actually copies data -_ the table pointer version will be speedy and allow chaining +_ the table pointer version will be speedy and allow chaining high @@ -248,7 +259,7 @@ _ https://github.com/processing/processing/issues/2428 _ finish PFont.getShape() implementation _ needs to have a way to set width/height properly _ draw(s) doesn't work on the returned PShape -_ y-location of frame might be negative, but that might be ok +_ y-location of frame might be negative, but that might be ok _ right now, on Windows it moves it on-screen (b/c of previous bug reports) _ may be cause of some of the display placement issues w/ multiple displays _ seem to recall one of the bugs mentioning stacked displays @@ -260,7 +271,7 @@ _ don't override the window icon w/ p5 logo if already set decisions/misc -_ Separately, if we wanted, we could add a method that can safely do drawing calls, but that won't be any faster or make use of more processors the way that `thread()` does. +_ Separately, if we wanted, we could add a method that can safely do drawing calls, but that won't be any faster or make use of more processors the way that `thread()` does. _ need reference update for createShape() _ though we need to verify the behavior here _ createShape(RECT) uses x/y/w/h, and optionally adds a mode param @@ -301,16 +312,16 @@ _ public float textWidth(char[] chars, int start, int length) _ add version of math functions that use doubles? _ what other methods should work with doubles? all math functions? _ seems like internal (mostly static) things, but not graphics api -_ new PGraphics(... OutputStream) +_ new PGraphics(... OutputStream) _ https://github.com/processing/processing/issues/285 _ already added for PDF, just need to work out the API _ if save() returns boolean, does saveFrame()? _ also need to copy this over to android _ "translate, or this variation of it" when using text(s, x, y, z) accidentally _ change to be the text command -_ size() and resize() and whatever? +_ size() and resize() and whatever? _ should be setSize(), but that's odd for image files -_ -> resize() is fine with PImage and PGraphics... +_ -> resize() is fine with PImage and PGraphics... _ we may be inheriting the resize() from Java -> make it final? _ add resize().. make it call setSize(). _ also needs to do a redraw if noLoop() has been called @@ -344,7 +355,7 @@ _ have to pass PApplet just to make the rendering work to both renderers _ should instead be a renderer that splits things out _ wrap exceptions with die() and warn() methods _ this way, people can make use of exceptions if they would rather -_ or shut them off if they don't want to +_ or shut them off if they don't want to _ also need to explain exception handling in general _ https://github.com/processing/processing/issues/222 _ bring PConstants back in line w/ previous 1.5 (can't renumber) @@ -357,12 +368,12 @@ _ add reference/docs for urlEncode() and urlDecode() _ add explanation to the reference about using beginRecord() with fonts _ pdf.textMode(SHAPE) _ also set the font *after* the record has started -_ maybe should instead make textMode(SHAPE) the norm? +_ maybe should instead make textMode(SHAPE) the norm? _ and people can change it to textMode(MODEL) if they want? _ http://dev.processing.org/bugs/show_bug.cgi?id=1535 (no gcode) _ explain the new PGL interface _ decide how disconnectEvent should actually be handled (and name?) -_ was disconnect always there? +_ was disconnect always there? _ will need documentation _ negative indices so that we can work relative to the end in data classes? _ add requestFocus() method to PApplet (or surface?) @@ -385,7 +396,7 @@ _ http://www.javalobby.org/forums/thread.jspa?threadID=16867&tstart=0 _ http://www.gamedev.net/page/resources/_/technical/general-programming/java-games-active-rendering-r2418 -CORE / stop() +CORE / stop() _ in PApplet.main(), windowClosing() should probably be calling 'exit()' _ or rather, we should never call System.exit(0), ja? @@ -415,7 +426,7 @@ _ if not looping, need to do it immediately _ does stop() unwind the thread, or does the thread unwind call stop? _ browser will call start() and stop() methods _ need to figure out start/stop signals coming from the browser -_ is it dispose/destroy? +_ is it dispose/destroy? _ when closing a sketch via the close box, make sure stop() getting called _ test to see if it's working _ what's up with stop() vs exit()? @@ -429,10 +440,10 @@ _ noloop ref even says that redraw will be called on resize, make sure it is _ focus not coming through, ESC no longer working(?) _ hitting cmd-q when an applet is running quits p5 (on macosx) _ but cmd-q when running externally is ok because it just quits -_ is there a way to catch cmd-q when running a sketch? +_ is there a way to catch cmd-q when running a sketch? _ so that it could avoid quitting if the sketch hasn't been stopped _ or if the sketch window is foremost -_ maybe a hack where a new menubar is added? +_ maybe a hack where a new menubar is added? o destroy() removed, but bring back? is that better than dispose()? _ destroy() only called dispose(), so no difference _ Python Mode has a hook for when it's called @@ -446,7 +457,7 @@ _ Text rotation, placement and font metrics incorrect when scaled _ https://github.com/processing/processing/issues/2167 _ remove subsetting stuff from PFont? -_ or use hint(ENABLE_FONT_SUBSETTING)? +_ or use hint(ENABLE_FONT_SUBSETTING)? _ what's the difference with ascent on loadFont vs. createFont? _ svg fonts _ would be nifty if we could convert on the fly to ttf for speed... @@ -460,7 +471,7 @@ _ book example 25-03 _ accessors inside PFont need a lot of work _ improve font metrics _ http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_How_do_I_obtain_font_metrics -_ font encoding issues +_ font encoding issues _ java seems to force straight windows encoding.. (problem for pi fonts) _ opentype/cff fonts don't work with live loading from the app _ many (all?) opentype fonts won't show up or aren't supported @@ -473,11 +484,11 @@ _ make screen space fonts use get/set as well? _ too much to debug on their own _ unfortunately tint not set with setImpl, but... _ not having kerning really blows -_ could this be pulled from the OpenType font stuff? +_ could this be pulled from the OpenType font stuff? _ it could be placed at the end of the file _ not having fractional widths on small fonts really blows _ screen space text looks crappy -_ working with vector fonts? +_ working with vector fonts? _ need to be able to handle shapes within shapes (reverse winding) _ ftgl: main code is in FTVectoriser _ uses gluTessBeginContour and gluTessEndContour @@ -528,7 +539,7 @@ _ trying to remember why primitive was changed to kind? (better name?) _ these aren't per-vertex: _ get/setStrokeWeight _ get/setAmbient -_ get/setEmissive +_ get/setEmissive _ get/setShininess _ boolean isGL() -> now removed _ unapproved (made protected) @@ -620,7 +631,7 @@ _ touchEvent(), gestureEvent()? LIBRARIES / PDF _ beginRecord() doesn't use current settings of the sketch -_ sometimes reported as a bug, but probably not a good way to +_ sometimes reported as a bug, but probably not a good way to _ consistently carry these over _ pdf sketches exiting before writing has finished _ people have to call exit() (so that dispose() is called in particular) @@ -628,7 +639,7 @@ _ when using noLoop() and the PDF renderer, sketch should exit gracefully _ because isDisplayable() returns false, there's no coming back from noLoop -LIBRARIES / Video +LIBRARIES / Video _ remove dispose() being used in the Movie and Capture _ added warning notes, but shouldn't be necessary @@ -653,7 +664,7 @@ _ can we use String... for options? or does it screw up the method signature? _ and would we have to always concatenate arrays to prepend extensions, etc _ include Instant and Interval? (or just Time and TimeSpan) _ it's going to be File or Reader (mostly BufferedReader) everywhere -_ though TableODS needs an InputStream... +_ though TableODS needs an InputStream... _ and XML could use InputStream if we hope to be able to reflect doc encoding _ ok, so File, Reader, and InputStream (where needed) _ setMissingXxxx() -> should this live in PApplet? be static? @@ -670,7 +681,7 @@ _ that way we can do what's most efficient _ then we add keyIterator() and others to handle the other case (deletion) _ blogs.oracle.com/CoreJavaTechTips/entry/using_enhanced_for_loops_with _ means that JSON.keys() -> JSON.keyIterator(), JSON.keySet() -> JSON.keys() -_ what should they all return? +_ what should they all return? _ remove -> true/false based on whether it found something? _ remove all -> the number removed? _ List: remove(), append(), index(), etc all use values @@ -709,7 +720,7 @@ _ i.e. get unique tables based on a particular column _ or, get uniques, then grab rows that match a name in a particular col _ create table from TableRow iterator...allows for subset and find _ downside is types are not included -_ getMaxFloat() (whole table) or getMaxFloat(col) +_ getMaxFloat() (whole table) or getMaxFloat(col) _ that's max(getFloatColumn(n)) _ also important b/c can leave out missing values _ dictionary support @@ -734,12 +745,12 @@ _ that way, methods could use the information when reading _ loadBytes() needs optimization _ don't bother using a buffering stream, just handle internally. gah! _ can loadBytes() be improved by querying file size first? -_ background +_ background _ this would require a new version of createInput(), which would query _ the URL (or file) for an actual file size. the size is not always _ available, so it can't be relied upon, but would help in some cases. _ loadBytes() is used for images.. ouch -_ might be worth doing a test to see if it actually would help at all +_ might be worth doing a test to see if it actually would help at all _ before rewriting all of createInput() @@ -763,10 +774,10 @@ _ createColor() instead of color()? _ route all exceptions through PException and catch method _ advanced users can override the method if they want _ or you can set an option to have PExceptions be raised -_ decision: just copy & paste the serial/net code.. +_ decision: just copy & paste the serial/net code.. _ until we can find a more compelling example _ actual shape api for things like rectangles and whatnot? -_ should we kill import xxxx syntax for libraries? +_ should we kill import xxxx syntax for libraries? _ just give up and use a gui for it _ cons: copy & paste breaks _ pro: there's no guaranteed 1:1 between packages and single libraries diff --git a/todo.txt b/todo.txt index f1dfc5ee11..6cbdddc089 100755 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,7 @@ 0266 (3.4.1 or 3.5) X update to Java 8u192 +_ fix the link to the FAQ in the menu +_ https://github.com/processing/processing/issues/5729 contrib X Updated russian translation, now can choose russian in preferences From b9f4be62649beeb05151e29ebf9f9d3cfff046fc Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 11 Jan 2019 19:44:48 -0500 Subject: [PATCH 028/172] still more bug reports --- core/todo.txt | 13 +++++++++++++ todo.txt | 2 ++ 2 files changed, 15 insertions(+) diff --git a/core/todo.txt b/core/todo.txt index 7df49bf6d5..16378967b2 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -32,6 +32,19 @@ X https://github.com/processing/processing/issues/5707 X skip Android's SDK folder when adding sketches X https://github.com/processing/processing/commit/5b653263cc6151f838c11a61689d756901c11e37 +jakub +X Fix freeze when restarting sketch with variables in size +X https://github.com/processing/processing/pull/5708 +X Make sure Ctrl+Left Mouse on MacOS is consistent +X https://github.com/processing/processing/issues/5672 +X https://github.com/processing/processing/pull/5674 +X Stop frame rate counter from exaggerating +X https://github.com/processing/processing/pull/5697 +X Fix vertex buffer initialized with wrong number of components +X https://github.com/processing/processing/pull/5698 +X Recreate FBOs when offscreen PGraphicsOpenGL is resized +X https://github.com/processing/processing/pull/5699 + _ NullPointerException at java.awt.Window.init(Window.java:497) when using Airplay _ https://github.com/processing/processing/issues/5620 diff --git a/todo.txt b/todo.txt index 6cbdddc089..53bf5e697c 100755 --- a/todo.txt +++ b/todo.txt @@ -2,6 +2,8 @@ X update to Java 8u192 _ fix the link to the FAQ in the menu _ https://github.com/processing/processing/issues/5729 +_ processing-java doesn't handle sketch exceptions by quitting the sketch +_ https://github.com/processing/processing/issues/5375 contrib X Updated russian translation, now can choose russian in preferences From 508cde1fd7a53e958328e12e937e28028e08b966 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Tue, 15 Jan 2019 13:30:24 -0500 Subject: [PATCH 029/172] set tessGeo when collecting custom vertex attributes --- core/src/processing/opengl/PShapeOpenGL.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/processing/opengl/PShapeOpenGL.java b/core/src/processing/opengl/PShapeOpenGL.java index 0a165b0330..c579c8ce30 100644 --- a/core/src/processing/opengl/PShapeOpenGL.java +++ b/core/src/processing/opengl/PShapeOpenGL.java @@ -2828,15 +2828,21 @@ protected void initModified() { protected void tessellate() { if (root == this && parent == null) { // Root shape + boolean initAttr = false; if (polyAttribs == null) { polyAttribs = PGraphicsOpenGL.newAttributeMap(); - collectPolyAttribs(); + initAttr = true; } if (tessGeo == null) { tessGeo = PGraphicsOpenGL.newTessGeometry(pg, polyAttribs, PGraphicsOpenGL.RETAINED); } tessGeo.clear(); + + if (initAttr) { + collectPolyAttribs(); + } + for (int i = 0; i < polyAttribs.size(); i++) { VertexAttribute attrib = polyAttribs.get(i); tessGeo.initAttrib(attrib); @@ -2854,6 +2860,7 @@ protected void tessellate() { protected void collectPolyAttribs() { AttributeMap rootAttribs = root.polyAttribs; + tessGeo = root.tessGeo; if (family == GROUP) { for (int i = 0; i < childCount; i++) { From f05094b81f0e6f263c506ae3378240ed4e5a7e5b Mon Sep 17 00:00:00 2001 From: codeanticode Date: Tue, 15 Jan 2019 13:33:04 -0500 Subject: [PATCH 030/172] create attribute in setAttrib() functions if does not exist, and also fix indexing bug --- core/src/processing/opengl/PShapeOpenGL.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/core/src/processing/opengl/PShapeOpenGL.java b/core/src/processing/opengl/PShapeOpenGL.java index c579c8ce30..c240847512 100644 --- a/core/src/processing/opengl/PShapeOpenGL.java +++ b/core/src/processing/opengl/PShapeOpenGL.java @@ -1761,10 +1761,11 @@ public void setAttrib(String name, int index, float... values) { return; } - VertexAttribute attrib = polyAttribs.get(name); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.FLOAT, + values.length); float[] array = inGeo.fattribs.get(name); for (int i = 0; i < values.length; i++) { - array[attrib.size * index + 0] = values[i]; + array[attrib.size * index + i] = values[i]; } markForTessellation(); } @@ -1777,10 +1778,11 @@ public void setAttrib(String name, int index, int... values) { return; } - VertexAttribute attrib = polyAttribs.get(name); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.INT, + values.length); int[] array = inGeo.iattribs.get(name); for (int i = 0; i < values.length; i++) { - array[attrib.size * index + 0] = values[i]; + array[attrib.size * index + i] = values[i]; } markForTessellation(); } @@ -1793,10 +1795,11 @@ public void setAttrib(String name, int index, boolean... values) { return; } - VertexAttribute attrib = polyAttribs.get(name); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.BOOL, + values.length); byte[] array = inGeo.battribs.get(name); for (int i = 0; i < values.length; i++) { - array[attrib.size * index + 0] = (byte)(values[i]?1:0); + array[attrib.size * index + i] = (byte)(values[i]?1:0); } markForTessellation(); } From f671f16ed8d97351d56d6380bd1a4a04addb22b9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 17 Jan 2019 08:52:46 -0800 Subject: [PATCH 031/172] temporarily ignore IntelliJ files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 41efa90f56..cd99249298 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ *~ /build/shared/reference.zip +# temporary, until we complete the move to IntelliJ +*.iml +/.idea # via https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm From 7ce606e0f4932bc64f84739888cdf8a3e3833873 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 17 Jan 2019 08:53:11 -0800 Subject: [PATCH 032/172] update out-of-date Help menu links (fixes #5729) --- build/shared/lib/languages/PDE.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index 7acab2a196..37b191509f 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -116,15 +116,15 @@ menu.help.tools_reference = Tools Reference menu.help.empty = (empty) menu.help.online = Online menu.help.getting_started = Getting Started -menu.help.getting_started.url = http://processing.org/learning/gettingstarted/ +menu.help.getting_started.url = https://processing.org/tutorials/gettingstarted/ menu.help.troubleshooting = Troubleshooting -menu.help.troubleshooting.url = http://wiki.processing.org/w/Troubleshooting +menu.help.troubleshooting.url = https://github.com/processing/processing/wiki/troubleshooting menu.help.faq = Frequently Asked Questions -menu.help.faq.url = http://wiki.processing.org/w/FAQ +menu.help.faq.url = https://github.com/processing/processing/wiki/FAQ menu.help.foundation = The Processing Foundation -menu.help.foundation.url = http://processing.org/foundation/ +menu.help.foundation.url = https://processing.foundation/ menu.help.visit = Visit Processing.org -menu.help.visit.url = http://processing.org/ +menu.help.visit.url = https://processing.org/ # --------------------------------------- From 9a3fc521bbc301d289df72742d2e7b493dc1dec3 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 17 Jan 2019 08:53:45 -0800 Subject: [PATCH 033/172] resolve ambiguous import --- java/src/processing/mode/java/preproc/PdePreprocessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java index 1b38e14311..f22de1387c 100644 --- a/java/src/processing/mode/java/preproc/PdePreprocessor.java +++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java @@ -27,7 +27,7 @@ package processing.mode.java.preproc; -import java.awt.*; +import java.awt.EventQueue; import java.io.*; import java.util.*; import java.util.regex.MatchResult; From ea7ac8ce0703468e119a84ce8a152472f2fa22f3 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 17 Jan 2019 08:54:00 -0800 Subject: [PATCH 034/172] more notes and updates for recent issues --- core/todo.txt | 2 ++ todo.txt | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/todo.txt b/core/todo.txt index 16378967b2..04f84f551d 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -31,6 +31,8 @@ X Processing 3.4 takes 60 seconds before can edit file X https://github.com/processing/processing/issues/5707 X skip Android's SDK folder when adding sketches X https://github.com/processing/processing/commit/5b653263cc6151f838c11a61689d756901c11e37 +X PShape.attrib() and PShape.setAttrib() are not working +X https://github.com/processing/processing/issues/5560 jakub X Fix freeze when restarting sketch with variables in size diff --git a/todo.txt b/todo.txt index 53bf5e697c..882879304d 100755 --- a/todo.txt +++ b/todo.txt @@ -1,9 +1,10 @@ 0266 (3.4.1 or 3.5) X update to Java 8u192 +o processing-java doesn't handle sketch exceptions by quitting the sketch +X https://github.com/processing/processing/issues/5375 +X this is by design/follows PDE behavior _ fix the link to the FAQ in the menu _ https://github.com/processing/processing/issues/5729 -_ processing-java doesn't handle sketch exceptions by quitting the sketch -_ https://github.com/processing/processing/issues/5375 contrib X Updated russian translation, now can choose russian in preferences From 50af488d69ce34b9a8e1bf56eed591d07b1778c9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 17 Jan 2019 09:12:14 -0800 Subject: [PATCH 035/172] other notes and cleanup --- todo.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/todo.txt b/todo.txt index 882879304d..1d586c976b 100755 --- a/todo.txt +++ b/todo.txt @@ -3,8 +3,8 @@ X update to Java 8u192 o processing-java doesn't handle sketch exceptions by quitting the sketch X https://github.com/processing/processing/issues/5375 X this is by design/follows PDE behavior -_ fix the link to the FAQ in the menu -_ https://github.com/processing/processing/issues/5729 +X fix the link to the FAQ in the menu +X https://github.com/processing/processing/issues/5729 contrib X Updated russian translation, now can choose russian in preferences @@ -17,9 +17,8 @@ X https://github.com/processing/processing/pull/5654 _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 +_ discuss with Casey -_ Examples dialog causes high CPU load -_ https://github.com/processing/processing/issues/5246 _ Welcome screen doesn't size properly for HiDPI screens _ https://github.com/processing/processing/issues/4896 _ Find in Reference disabled for various keywords (draw, for, if, catch, while) From a2834efbac737962f1c86e04243110ff40ef829f Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 09:55:43 -0800 Subject: [PATCH 036/172] move to JDK 1.8 instead of 1.6 b/c of Eclipse warnings --- java/libraries/dxf/.settings/org.eclipse.jdt.core.prefs | 9 +++++---- java/libraries/net/.settings/org.eclipse.jdt.core.prefs | 8 +++++--- java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs | 8 +++++--- .../serial/.settings/org.eclipse.jdt.core.prefs | 9 +++++---- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/java/libraries/dxf/.settings/org.eclipse.jdt.core.prefs b/java/libraries/dxf/.settings/org.eclipse.jdt.core.prefs index 2770cf1bf3..87b7a7a3a6 100644 --- a/java/libraries/dxf/.settings/org.eclipse.jdt.core.prefs +++ b/java/libraries/dxf/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,13 @@ -#Sat Nov 12 10:56:00 CST 2011 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/java/libraries/net/.settings/org.eclipse.jdt.core.prefs b/java/libraries/net/.settings/org.eclipse.jdt.core.prefs index a11eccb8d4..f256b10aad 100644 --- a/java/libraries/net/.settings/org.eclipse.jdt.core.prefs +++ b/java/libraries/net/.settings/org.eclipse.jdt.core.prefs @@ -1,14 +1,16 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 diff --git a/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs b/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs index f3b4e11d65..160529e9d0 100644 --- a/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs +++ b/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs @@ -1,14 +1,16 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 diff --git a/java/libraries/serial/.settings/org.eclipse.jdt.core.prefs b/java/libraries/serial/.settings/org.eclipse.jdt.core.prefs index f709eac1ee..87b7a7a3a6 100644 --- a/java/libraries/serial/.settings/org.eclipse.jdt.core.prefs +++ b/java/libraries/serial/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,13 @@ -#Sat Nov 12 10:56:44 CST 2011 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 From f62b931a30373d1b404ff6579935b92506f503f3 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 09:55:51 -0800 Subject: [PATCH 037/172] remove unnecessary cast --- core/src/processing/core/PApplet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index ca37ca75ae..f4f5d97c6b 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -2455,7 +2455,7 @@ public void handleDraw() { // Get the frame time of the last frame double frameTimeSecs = (now - frameRateLastNanos) / 1e9; // Convert average frames per second to average frame time - double avgFrameTimeSecs = 1.0 / (double) frameRate; + double avgFrameTimeSecs = 1.0 / frameRate; // Calculate exponential moving average of frame time final double alpha = 0.05; avgFrameTimeSecs = (1.0 - alpha) * avgFrameTimeSecs + alpha * frameTimeSecs; From adaf90196bc660ac3537f5d5729852351866023c Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 10:35:39 -0800 Subject: [PATCH 038/172] incorporating console collapse button (#5115) --- app/src/processing/app/ui/EditorStatus.java | 84 ++++++++++++--------- todo.txt | 18 ++--- 2 files changed, 58 insertions(+), 44 deletions(-) diff --git a/app/src/processing/app/ui/EditorStatus.java b/app/src/processing/app/ui/EditorStatus.java index c4db92bae2..481cea81df 100644 --- a/app/src/processing/app/ui/EditorStatus.java +++ b/app/src/processing/app/ui/EditorStatus.java @@ -49,7 +49,7 @@ /** * Panel just below the editing area that contains status messages. */ -public class EditorStatus extends BasicSplitPaneDivider { //JPanel { +public class EditorStatus extends BasicSplitPaneDivider { static final int HIGH = Toolkit.zoom(28); static final int LEFT_MARGIN = Editor.LEFT_GUTTER; static final int RIGHT_MARGIN = Toolkit.zoom(20); @@ -60,11 +60,11 @@ public class EditorStatus extends BasicSplitPaneDivider { //JPanel { Image[] bgImage; @SuppressWarnings("hiding") - static public final int ERROR = 1; + static public final int ERROR = 1; static public final int CURSOR_LINE_ERROR = 2; static public final int WARNING = 3; static public final int CURSOR_LINE_WARNING = 4; - static public final int NOTICE = 0; + static public final int NOTICE = 0; static final int YES = 1; static final int NO = 2; @@ -80,21 +80,36 @@ public class EditorStatus extends BasicSplitPaneDivider { //JPanel { int rightEdge; int mouseX; int rolloverState; - static final int ROLLOVER_NONE = 0; - static final int ROLLOVER_URL = 1; - static final int ROLLOVER_COLLAPSE = 2; - static final int ROLLOVER_EMOJI = 3; + static final int ROLLOVER_NONE = 0; + static final int ROLLOVER_URL = 1; + static final int ROLLOVER_COLLAPSE = 2; + static final int ROLLOVER_CLIPBOARD = 3; Font font; FontMetrics metrics; int ascent; - // used to draw the clipboard icon - Font emojiFont; + // actual Clipboard character not available [fry 180326] + //static final String CLIPBOARD_GLYPH = "\uD83D\uDCCB"; + // other apps seem to use this one as a hack + static final String CLIPBOARD_GLYPH = "\u2398"; + +// static final String COLLAPSE_GLYPH = "\u25B3"; // large up +// static final String EXPAND_GLYPH = "\u25BD"; // large down +// static final String COLLAPSE_GLYPH = "\u25B5"; // small up (unavailable) +// static final String EXPAND_GLYPH = "\u25BF"; // small down (unavailable) + static final String COLLAPSE_GLYPH = "\u25C1"; // left + static final String EXPAND_GLYPH = "\u25B7"; // right +// static final String COLLAPSE_GLYPH = "\u25F8"; // upper-left (unavailable) +// static final String EXPAND_GLYPH = "\u25FF"; // lower-right (unavailable) + + // a font that supports the Unicode glyphs we need + Font glyphFont; Image offscreen; int sizeW, sizeH; - boolean collapseState = false; + int buttonSize; + boolean collapsed = false; int response; @@ -120,7 +135,7 @@ public void mousePressed(MouseEvent e) { if (rolloverState == ROLLOVER_URL) { Platform.openURL(url); - } else if (rolloverState == ROLLOVER_EMOJI) { + } else if (rolloverState == ROLLOVER_CLIPBOARD) { if (e.isShiftDown()) { // open the text in a browser window as a search final String fmt = Preferences.get("search.format"); @@ -135,7 +150,7 @@ public void mousePressed(MouseEvent e) { } } else if (rolloverState == ROLLOVER_COLLAPSE) { - collapse(!collapseState); + setCollapsed(!collapsed); } } @@ -153,7 +168,7 @@ public void mouseDragged(MouseEvent e) { // BasicSplitPaneUI.startDragging gets called even when you click but // don't drag, so we can't expand the console whenever that gets called // or the button wouldn't work. - collapse(false); + setCollapsed(false); } @Override @@ -165,17 +180,18 @@ public void mouseMoved(MouseEvent e) { } - void collapse(boolean doCollapse) { - if (collapseState == doCollapse) return; - collapseState = doCollapse; - editor.footer.setVisible(!doCollapse); - splitPane.resetToPreferredSizes(); + void setCollapsed(boolean newState) { + if (collapsed != newState) { + collapsed = newState; + editor.footer.setVisible(!newState); + splitPane.resetToPreferredSizes(); + } } void updateMouse() { switch (rolloverState) { - case ROLLOVER_EMOJI: + case ROLLOVER_CLIPBOARD: case ROLLOVER_URL: setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); break; @@ -229,8 +245,7 @@ public void updateMode() { }; font = mode.getFont("status.font"); - //emojiFont = new Font("Dialog", Font.PLAIN, 21); - emojiFont = mode.getFont("status.emoji.font"); + glyphFont = mode.getFont("status.emoji.font"); metrics = null; } @@ -319,7 +334,7 @@ public void paint(Graphics screen) { if (offscreen == null) { sizeW = size.width; sizeH = size.height; - +// buttonSize = sizeH; offscreen = Toolkit.offscreenGraphics(this, sizeW, sizeH); } @@ -339,7 +354,7 @@ public void paint(Graphics screen) { rolloverState = ROLLOVER_COLLAPSE; } else if (message != null && !message.isEmpty()) { if (sizeW - 2*sizeH < mouseX) { - rolloverState = ROLLOVER_EMOJI; + rolloverState = ROLLOVER_CLIPBOARD; } else if (url != null && mouseX > LEFT_MARGIN && // calculate right edge of the text for rollovers (otherwise the pane // cannot be resized up or down whenever a URL is being displayed) @@ -377,29 +392,29 @@ public void paint(Graphics screen) { } } else if (!message.isEmpty()) { - g.setFont(emojiFont); - // actual Clipboard character not available [fry 180326] - //g.drawString("\uD83D\uDCCB", sizeW - LEFT_MARGIN, (sizeH + ascent) / 2); - // other apps seem to use this one as a hack: ⎘ - drawButton(g, "\u2398", 1, rolloverState == ROLLOVER_EMOJI); + g.setFont(glyphFont); + drawButton(g, CLIPBOARD_GLYPH, 1, rolloverState == ROLLOVER_CLIPBOARD); g.setFont(font); } // draw collapse/expand button - drawButton(g, collapseState ? "▲" : "▼", 0, rolloverState == ROLLOVER_COLLAPSE); + String collapseGlyph = collapsed ? EXPAND_GLYPH : COLLAPSE_GLYPH; + drawButton(g, collapseGlyph, 0, rolloverState == ROLLOVER_COLLAPSE); screen.drawImage(offscreen, 0, 0, sizeW, sizeH, null); } - private final Color whitishTint = new Color(0x40eeeeee, true); + private final Color whitishTint = new Color(0x20eeeeee, true); + /** * @param pos A zero-based index with 0 on the right. */ private void drawButton(Graphics g, String symbol, int pos, boolean highlight) { int left = sizeW - (pos + 1) * sizeH; - g.setColor(bgColor[mode]); // Overlap very long errors. - g.fillRect(left, 0, sizeH, sizeH); + // Overlap very long errors + g.drawImage(bgImage[mode], left, 0, sizeH, sizeH, this); + if (highlight) { g.setColor(whitishTint); g.fillRect(left, 0, sizeH, sizeH); @@ -408,10 +423,11 @@ private void drawButton(Graphics g, String symbol, int pos, boolean highlight) { g.setColor(fgColor[mode]); } g.drawString(symbol, - left + (sizeH - g.getFontMetrics().stringWidth(symbol))/2, - (sizeH + ascent) / 2); + left + (sizeH - g.getFontMetrics().stringWidth(symbol))/2, + (sizeH + ascent) / 2); } + public Dimension getPreferredSize() { return getMinimumSize(); } diff --git a/todo.txt b/todo.txt index 1d586c976b..ef4c3b4a17 100755 --- a/todo.txt +++ b/todo.txt @@ -14,22 +14,19 @@ X https://github.com/processing/processing/pull/5636 X Examples dialog causes high CPU load X https://github.com/processing/processing/issues/5246 X https://github.com/processing/processing/pull/5654 + +jakub +X Fix sketch exception getting hidden by warning +X https://github.com/processing/processing/pull/5486 +X https://github.com/processing/processing/issues/5412 + + _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 _ discuss with Casey - _ Welcome screen doesn't size properly for HiDPI screens _ https://github.com/processing/processing/issues/4896 -_ Find in Reference disabled for various keywords (draw, for, if, catch, while) -_ https://github.com/processing/processing/issues/5562 -_ "Could not find a examples in the downloaded file" is a poorly worded message - - -jakub -_ Fix sketch exception getting hidden by warning -_ https://github.com/processing/processing/pull/5486 -_ https://github.com/processing/processing/issues/5412 manager @@ -48,6 +45,7 @@ _ mode > add mode > libraries > install video _ did not update the examples window, had to restart pde _ was able to save over the video capture examples b/c they were a library _ lib examples not properly marked as read-only +_ "Could not find a examples in the downloaded file" is a poorly worded message temp From 06666edc7386ff949939da44c5a1d1e20bd23817 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 10:47:01 -0800 Subject: [PATCH 039/172] more cleanup; use buttonSize constant instead of sizeH for clarity --- app/src/processing/app/ui/EditorStatus.java | 51 +++++++++++---------- todo.txt | 37 +++++++-------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/app/src/processing/app/ui/EditorStatus.java b/app/src/processing/app/ui/EditorStatus.java index 481cea81df..db77a932c0 100644 --- a/app/src/processing/app/ui/EditorStatus.java +++ b/app/src/processing/app/ui/EditorStatus.java @@ -66,10 +66,10 @@ public class EditorStatus extends BasicSplitPaneDivider { static public final int CURSOR_LINE_WARNING = 4; static public final int NOTICE = 0; - static final int YES = 1; - static final int NO = 2; + static final int YES = 1; + static final int NO = 2; static final int CANCEL = 3; - static final int OK = 4; + static final int OK = 4; Editor editor; @@ -77,13 +77,15 @@ public class EditorStatus extends BasicSplitPaneDivider { String message = ""; String url; + int rightEdge; int mouseX; - int rolloverState; - static final int ROLLOVER_NONE = 0; - static final int ROLLOVER_URL = 1; - static final int ROLLOVER_COLLAPSE = 2; + + static final int ROLLOVER_NONE = 0; + static final int ROLLOVER_URL = 1; + static final int ROLLOVER_COLLAPSE = 2; static final int ROLLOVER_CLIPBOARD = 3; + int rolloverState; Font font; FontMetrics metrics; @@ -94,6 +96,7 @@ public class EditorStatus extends BasicSplitPaneDivider { // other apps seem to use this one as a hack static final String CLIPBOARD_GLYPH = "\u2398"; + // https://en.wikipedia.org/wiki/Geometric_Shapes // static final String COLLAPSE_GLYPH = "\u25B3"; // large up // static final String EXPAND_GLYPH = "\u25BD"; // large down // static final String COLLAPSE_GLYPH = "\u25B5"; // small up (unavailable) @@ -108,6 +111,7 @@ public class EditorStatus extends BasicSplitPaneDivider { Image offscreen; int sizeW, sizeH; + // size of the glyph buttons (width and height are identical) int buttonSize; boolean collapsed = false; @@ -334,7 +338,7 @@ public void paint(Graphics screen) { if (offscreen == null) { sizeW = size.width; sizeH = size.height; -// buttonSize = sizeH; + buttonSize = sizeH; offscreen = Toolkit.offscreenGraphics(this, sizeW, sizeH); } @@ -349,27 +353,25 @@ public void paint(Graphics screen) { g.drawImage(bgImage[mode], 0, 0, sizeW, sizeH, this); - // What's the mouse over? - if (sizeW - sizeH < mouseX && mouseX < sizeW) { + rolloverState = ROLLOVER_NONE; + if (mouseX > sizeW - buttonSize && mouseX < sizeW) { rolloverState = ROLLOVER_COLLAPSE; + } else if (message != null && !message.isEmpty()) { - if (sizeW - 2*sizeH < mouseX) { + if (sizeW - 2*buttonSize < mouseX) { rolloverState = ROLLOVER_CLIPBOARD; + } else if (url != null && mouseX > LEFT_MARGIN && // calculate right edge of the text for rollovers (otherwise the pane // cannot be resized up or down whenever a URL is being displayed) mouseX < (LEFT_MARGIN + g.getFontMetrics().stringWidth(message))) { rolloverState = ROLLOVER_URL; - } else { - rolloverState = ROLLOVER_NONE; } - } else { - rolloverState = ROLLOVER_NONE; } // https://github.com/processing/processing/issues/3265 if (message != null) { - // needs to be set each time on osx + // font needs to be set each time on osx g.setFont(font); // set the highlight color on rollover so that the user's not surprised // to see the web browser open when they click @@ -381,7 +383,7 @@ public void paint(Graphics screen) { //int x = cancelButton.getX(); //int w = cancelButton.getWidth(); int w = Toolkit.getButtonWidth(); - int x = getWidth() - Math.max(RIGHT_MARGIN, (int)(sizeH*1.2)) - w; + int x = getWidth() - Math.max(RIGHT_MARGIN, (int)(buttonSize*1.2)) - w; int y = sizeH / 3; int h = sizeH / 3; g.setColor(new Color(0x80000000, true)); @@ -405,25 +407,26 @@ public void paint(Graphics screen) { } - private final Color whitishTint = new Color(0x20eeeeee, true); + //private final Color whitishTint = new Color(0x20eeeeee, true); /** - * @param pos A zero-based index with 0 on the right. + * @param pos A zero-based button index with 0 as the rightmost button */ private void drawButton(Graphics g, String symbol, int pos, boolean highlight) { - int left = sizeW - (pos + 1) * sizeH; + int left = sizeW - (pos + 1) * buttonSize; // Overlap very long errors - g.drawImage(bgImage[mode], left, 0, sizeH, sizeH, this); + g.drawImage(bgImage[mode], left, 0, buttonSize, sizeH, this); if (highlight) { - g.setColor(whitishTint); - g.fillRect(left, 0, sizeH, sizeH); + // disabling since this doesn't match any of our other UI +// g.setColor(whitishTint); +// g.fillRect(left, 0, sizeH, sizeH); g.setColor(urlColor); } else { g.setColor(fgColor[mode]); } g.drawString(symbol, - left + (sizeH - g.getFontMetrics().stringWidth(symbol))/2, + left + (buttonSize - g.getFontMetrics().stringWidth(symbol))/2, (sizeH + ascent) / 2); } diff --git a/todo.txt b/todo.txt index ef4c3b4a17..282ef20b5d 100755 --- a/todo.txt +++ b/todo.txt @@ -14,6 +14,8 @@ X https://github.com/processing/processing/pull/5636 X Examples dialog causes high CPU load X https://github.com/processing/processing/issues/5246 X https://github.com/processing/processing/pull/5654 +X console hiding button +X https://github.com/processing/processing/pull/5115 jakub X Fix sketch exception getting hidden by warning @@ -29,6 +31,19 @@ _ Welcome screen doesn't size properly for HiDPI screens _ https://github.com/processing/processing/issues/4896 +nasty ones +_ errors inside setup() aren't coming through at all? +_ seen in Eclipse; have to turn on the debugger +_ "Sketch disappeared" infinite pop up dialogs +_ https://github.com/processing/processing/pull/4808 +_ https://github.com/processing/processing/issues/4805 +_ EventQueue problems with "could not find sketch size" message +_ https://github.com/processing/processing/issues/4893 +_ https://github.com/processing/processing/issues/5030 +_ size(0, 0) just freezes instead of showing an error (as a result) +_ https://github.com/processing/processing/issues/5233 + + manager _ Manager fails to complete install of PythonMode when no windows open _ https://github.com/processing/processing/issues/5309 @@ -69,26 +84,6 @@ _ clean Windows temp folders _ https://github.com/processing/processing/issues/1896 -contrib -_ console hiding button? -_ https://github.com/processing/processing/pull/5115 -_ alternate handling of duplicate library conflicts -_ https://github.com/processing/processing/pull/5126 - - -nasty ones -_ errors inside setup() aren't coming through at all? -_ seen in Eclipse; have to turn on the debugger -_ "Sketch disappeared" infinite pop up dialogs -_ https://github.com/processing/processing/pull/4808 -_ https://github.com/processing/processing/issues/4805 -_ EventQueue problems with "could not find sketch size" message -_ https://github.com/processing/processing/issues/4893 -_ https://github.com/processing/processing/issues/5030 -_ size(0, 0) just freezes instead of showing an error (as a result) -_ https://github.com/processing/processing/issues/5233 - - _ sketch.properties not being written if initial mode is p5.js? _ when creating a sketch within non-Java mode, should write the settings file _ so that it re-loads in the proper environment @@ -709,6 +704,8 @@ _ see how library installation goes, then possibly do same w/ examples PDE / Libraries +_ alternate handling of duplicate library conflicts +_ https://github.com/processing/processing/pull/5126 _ Add a means to specify packages to import in library.properties _ https://github.com/processing/processing/issues/2134 _ need to deal with classpath conflicts From 07dfee2df44c4b4129dda3d380d1e243c049fe63 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 11:05:54 -0800 Subject: [PATCH 040/172] update to Java 8u202 --- build/build.xml | 6 +++--- todo.txt | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build/build.xml b/build/build.xml index a23317c813..fdd1d9a08a 100644 --- a/build/build.xml +++ b/build/build.xml @@ -71,11 +71,11 @@ value="../../processing-docs/content/examples" /> - - + + - + diff --git a/todo.txt b/todo.txt index 282ef20b5d..6b47d382e3 100755 --- a/todo.txt +++ b/todo.txt @@ -5,6 +5,7 @@ X https://github.com/processing/processing/issues/5375 X this is by design/follows PDE behavior X fix the link to the FAQ in the menu X https://github.com/processing/processing/issues/5729 +X update to Java 8u202 contrib X Updated russian translation, now can choose russian in preferences @@ -39,9 +40,10 @@ _ https://github.com/processing/processing/pull/4808 _ https://github.com/processing/processing/issues/4805 _ EventQueue problems with "could not find sketch size" message _ https://github.com/processing/processing/issues/4893 -_ https://github.com/processing/processing/issues/5030 -_ size(0, 0) just freezes instead of showing an error (as a result) -_ https://github.com/processing/processing/issues/5233 +X https://github.com/processing/processing/pull/5708 +X https://github.com/processing/processing/issues/5030 (duplicate) +_ size(0, 0) just freezes instead of showing an error +X https://github.com/processing/processing/issues/5233 (duplicate) manager From b3763a8f8072d93178cd435ebc6f4a3a0f94adb9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 11:19:28 -0800 Subject: [PATCH 041/172] prevent infinite "sketch disappeared" warnings (fixes #4805) --- app/src/processing/app/Sketch.java | 43 ++++++++++++++++++------------ todo.txt | 12 ++++----- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index 40a3d7fb2b..15882dfb51 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -40,7 +40,9 @@ import java.beans.PropertyChangeListener; import java.io.*; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.*; @@ -1497,29 +1499,36 @@ public void prepareBuild(File targetFolder) throws SketchException { */ + private Set existenceWarnings = new HashSet<>(); + /** - * Make sure the sketch hasn't been moved or deleted by some - * nefarious user. If they did, try to re-create it and save. - * Only checks to see if the main folder is still around, - * but not its contents. + * Make sure the sketch hasn't been moved or deleted by a nefarious user. + * If they did, try to re-create it and save. Only checks whether the + * main folder is still around, but not its contents. */ public void ensureExistence() { if (!folder.exists()) { - // Disaster recovery, try to salvage what's there already. - Messages.showWarning(Language.text("ensure_exist.messages.missing_sketch"), - Language.text("ensure_exist.messages.missing_sketch.description")); - try { - folder.mkdirs(); - modified = true; + // Avoid an infinite loop if we've already warned about this + // https://github.com/processing/processing/issues/4805 + if (!existenceWarnings.contains(folder)) { + existenceWarnings.add(folder); + + // Disaster recovery, try to salvage what's there already. + Messages.showWarning(Language.text("ensure_exist.messages.missing_sketch"), + Language.text("ensure_exist.messages.missing_sketch.description")); + try { + folder.mkdirs(); + modified = true; + + for (int i = 0; i < codeCount; i++) { + code[i].save(); // this will force a save + } + calcModified(); - for (int i = 0; i < codeCount; i++) { - code[i].save(); // this will force a save + } catch (Exception e) { + Messages.showWarning(Language.text("ensure_exist.messages.unrecoverable"), + Language.text("ensure_exist.messages.unrecoverable.description"), e); } - calcModified(); - - } catch (Exception e) { - Messages.showWarning(Language.text("ensure_exist.messages.unrecoverable"), - Language.text("ensure_exist.messages.unrecoverable.description"), e); } } } diff --git a/todo.txt b/todo.txt index 6b47d382e3..a1f4d2dc01 100755 --- a/todo.txt +++ b/todo.txt @@ -22,6 +22,12 @@ jakub X Fix sketch exception getting hidden by warning X https://github.com/processing/processing/pull/5486 X https://github.com/processing/processing/issues/5412 +X EventQueue problems with "could not find sketch size" message +X https://github.com/processing/processing/issues/4893 +X https://github.com/processing/processing/pull/5708 +X https://github.com/processing/processing/issues/5030 (duplicate) +X size(0, 0) just freezes instead of showing an error +X https://github.com/processing/processing/issues/5233 (duplicate) _ Find in Reference disabled for various keywords (draw, for, if, catch, while) @@ -38,12 +44,6 @@ _ seen in Eclipse; have to turn on the debugger _ "Sketch disappeared" infinite pop up dialogs _ https://github.com/processing/processing/pull/4808 _ https://github.com/processing/processing/issues/4805 -_ EventQueue problems with "could not find sketch size" message -_ https://github.com/processing/processing/issues/4893 -X https://github.com/processing/processing/pull/5708 -X https://github.com/processing/processing/issues/5030 (duplicate) -_ size(0, 0) just freezes instead of showing an error -X https://github.com/processing/processing/issues/5233 (duplicate) manager From d1ce74b93d683e5e2b92dc366af033804c761695 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 11:23:50 -0800 Subject: [PATCH 042/172] simpler solution for disappearance warning (#4805) --- app/src/processing/app/Sketch.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index 15882dfb51..7d3caf8988 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -40,9 +40,7 @@ import java.beans.PropertyChangeListener; import java.io.*; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.*; @@ -93,6 +91,8 @@ public class Sketch { /** Moved out of Editor and into here for cleaner access. */ private boolean untitled; + /** true if we've posted a "sketch disappeared" warning */ + private boolean disappearedWarning; /** * Used by the command-line version to create a sketch object. @@ -125,6 +125,7 @@ protected void load(String path) { int suffixLength = mode.getDefaultExtension().length() + 1; name = mainFilename.substring(0, mainFilename.length() - suffixLength); folder = new File(new File(path).getParent()); + disappearedWarning = false; load(); } @@ -1199,6 +1200,7 @@ protected void updateInternal(String sketchName, File sketchFolder) { name = sketchName; folder = sketchFolder; + disappearedWarning = false; codeFolder = new File(folder, "code"); dataFolder = new File(folder, "data"); @@ -1499,8 +1501,6 @@ public void prepareBuild(File targetFolder) throws SketchException { */ - private Set existenceWarnings = new HashSet<>(); - /** * Make sure the sketch hasn't been moved or deleted by a nefarious user. * If they did, try to re-create it and save. Only checks whether the @@ -1510,8 +1510,8 @@ public void ensureExistence() { if (!folder.exists()) { // Avoid an infinite loop if we've already warned about this // https://github.com/processing/processing/issues/4805 - if (!existenceWarnings.contains(folder)) { - existenceWarnings.add(folder); + if (!disappearedWarning) { + disappearedWarning = true; // Disaster recovery, try to salvage what's there already. Messages.showWarning(Language.text("ensure_exist.messages.missing_sketch"), @@ -1526,6 +1526,7 @@ public void ensureExistence() { calcModified(); } catch (Exception e) { + // disappearedWarning prevents infinite loop in this scenario Messages.showWarning(Language.text("ensure_exist.messages.unrecoverable"), Language.text("ensure_exist.messages.unrecoverable.description"), e); } From 2e476be5962ff4f33ed8051187f34a11c82c1597 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 11:25:11 -0800 Subject: [PATCH 043/172] wrapping up #4805 and #4808 --- todo.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/todo.txt b/todo.txt index a1f4d2dc01..22b0bcef19 100755 --- a/todo.txt +++ b/todo.txt @@ -6,6 +6,9 @@ X this is by design/follows PDE behavior X fix the link to the FAQ in the menu X https://github.com/processing/processing/issues/5729 X update to Java 8u202 +X "Sketch disappeared" infinite pop up dialogs +X https://github.com/processing/processing/pull/4808 +X https://github.com/processing/processing/issues/4805 contrib X Updated russian translation, now can choose russian in preferences @@ -41,9 +44,6 @@ _ https://github.com/processing/processing/issues/4896 nasty ones _ errors inside setup() aren't coming through at all? _ seen in Eclipse; have to turn on the debugger -_ "Sketch disappeared" infinite pop up dialogs -_ https://github.com/processing/processing/pull/4808 -_ https://github.com/processing/processing/issues/4805 manager From d1cb0c8b105df7d26bda5558d0affec3f1119a26 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 11:44:12 -0800 Subject: [PATCH 044/172] additional cleanup to SVG code after incorporating #4168 --- core/src/processing/core/PShape.java | 19 +--- core/src/processing/core/PShapeSVG.java | 117 +++++++++++++----------- core/todo.txt | 24 +++-- todo.txt | 33 ++++--- 4 files changed, 96 insertions(+), 97 deletions(-) diff --git a/core/src/processing/core/PShape.java b/core/src/processing/core/PShape.java index 2010bf8ff5..b587e3e9b0 100644 --- a/core/src/processing/core/PShape.java +++ b/core/src/processing/core/PShape.java @@ -25,24 +25,13 @@ import java.awt.Image; import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; -import java.util.Base64.Decoder; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.nio.charset.StandardCharsets; + import javax.swing.ImageIcon; import javax.xml.bind.DatatypeConverter; - -import processing.core.PApplet; - - /** * ( begin auto-generated from PShape.xml ) * @@ -1910,7 +1899,7 @@ private void loadImage(PGraphics g){ } this.imagePath = null; } - + private void loadFileSystemImage(PGraphics g){ imagePath = imagePath.substring(7); PImage loadedImage = g.parent.loadImage(imagePath); @@ -1932,7 +1921,7 @@ private void loadBase64Image(){ System.err.println("Decode Error on image: " + imagePath.substring(0, 20)); return; } - + Image awtImage = new ImageIcon(decodedBytes).getImage(); if (awtImage instanceof BufferedImage) { @@ -1953,7 +1942,7 @@ private void loadBase64Image(){ extension.equals("unknown")) { loadedImage.checkAlpha(); } - + setTexture(loadedImage); } diff --git a/core/src/processing/core/PShapeSVG.java b/core/src/processing/core/PShapeSVG.java index 10f75ebd6a..d74253af6e 100644 --- a/core/src/processing/core/PShapeSVG.java +++ b/core/src/processing/core/PShapeSVG.java @@ -334,7 +334,7 @@ protected PShape parseChild(XML elem) { } else if (name.equals("rect")) { shape = createShape(this, elem, true); shape.parseRect(); - + } else if (name.equals("image")) { shape = createShape(this, elem, true); shape.parseImage(); @@ -368,8 +368,8 @@ protected PShape parseChild(XML elem) { } else if (name.equals("text")) { // || name.equals("font")) { return new Text(this, elem); - - } else if (name.equals("tspan")) { + + } else if (name.equals("tspan")) { return new LineOfText(this, elem); } else if (name.equals("filter")) { @@ -450,8 +450,8 @@ protected void parseRect() { getFloatWithUnit(element, "height", svgHeight) }; } - - + + protected void parseImage() { kind = RECT; textureMode = NORMAL; @@ -466,7 +466,7 @@ protected void parseImage() { this.imagePath = element.getString("xlink:href"); } - + /** * Parse a polyline or polygon from an SVG file. * Syntax defined at http://www.w3.org/TR/SVG/shapes.html#PointsBNF @@ -1537,7 +1537,10 @@ public Gradient(PShapeSVG parent, XML properties) { } - public class LinearGradient extends Gradient { + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + static public class LinearGradient extends Gradient { public float x1, y1, x2, y2; public LinearGradient(PShapeSVG parent, XML properties) { @@ -1567,7 +1570,10 @@ public LinearGradient(PShapeSVG parent, XML properties) { } - public class RadialGradient extends Gradient { + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + static public class RadialGradient extends Gradient { public float cx, cy, r; public RadialGradient(PShapeSVG parent, XML properties) { @@ -1596,23 +1602,22 @@ public RadialGradient(PShapeSVG parent, XML properties) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - - public static float TEXT_QUALITY = 1; - protected PFont parseFont(XML properties) { -// FontFace fontFace = new FontFace(this, properties); + +// static private float TEXT_QUALITY = 1; + + static private PFont parseFont(XML properties) { String fontFamily = null; float size = 10; int weight = PLAIN; // 0 int italic = 0; - + if (properties.hasAttribute("style")) { String styleText = properties.getString("style"); String[] styleTokens = PApplet.splitTokens(styleText, ";"); //PApplet.println(styleTokens); for (int i = 0; i < styleTokens.length; i++) { - String[] tokens = PApplet.splitTokens(styleTokens[i], ":"); //PApplet.println(tokens); @@ -1628,13 +1633,13 @@ protected PFont parseFont(XML properties) { // setFillOpacity(tokens[1]); } else if (tokens[0].equals("font-weight")) { - // PApplet.println("font-weight: " + tokens[1]); - - if (tokens[1].contains("bold")) { - weight = BOLD; - // PApplet.println("Bold weight ! "); - } - + // PApplet.println("font-weight: " + tokens[1]); + + if (tokens[1].contains("bold")) { + weight = BOLD; + // PApplet.println("Bold weight ! "); + } + } else if (tokens[0].equals("font-stretch")) { // not supported. @@ -1673,25 +1678,26 @@ protected PFont parseFont(XML properties) { if (fontFamily == null) { return null; } - size = size * TEXT_QUALITY; +// size = size * TEXT_QUALITY; return createFont(fontFamily, weight | italic, size, true); } - protected PFont createFont(String name, int weight, float size, boolean smooth) { - -// System.out.println("Try to create a font of " + name + " family, " + weight); - java.awt.Font baseFont = new java.awt.Font(name, weight, (int) size); // PFont.findFont(name);ç -// System.out.println("Resulting family : " + baseFont.getFamily() + " " + baseFont.getStyle()); - PFont outputPFont = new PFont(baseFont.deriveFont(size), smooth, null); + static protected PFont createFont(String name, int weight, + float size, boolean smooth) { + //System.out.println("Try to create a font of " + name + " family, " + weight); + java.awt.Font baseFont = new java.awt.Font(name, weight, (int) size); -// System.out.println("Resulting PFont family : " + outputPFont.getName()); - return outputPFont; + //System.out.println("Resulting family : " + baseFont.getFamily() + " " + baseFont.getStyle()); + return new PFont(baseFont.deriveFont(size), smooth, null); } - public static class Text extends PShapeSVG { + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + static public class Text extends PShapeSVG { protected PFont font; public Text(PShapeSVG parent, XML properties) { @@ -1709,43 +1715,40 @@ public Text(PShapeSVG parent, XML properties) { family = GROUP; font = parseFont(properties); - } - -// @Override -// public void drawImpl(PGraphics g){ -// } } - public static class LineOfText extends PShapeSVG { + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + static public class LineOfText extends PShapeSVG { String textToDisplay; PFont font; public LineOfText(PShapeSVG parent, XML properties) { - - // TODO: child should ideally be parsed too... - // for inline content. + // TODO: child should ideally be parsed too for inline content. super(parent, properties, false); -// // get location + //get location float x = Float.parseFloat(properties.getString("x")); float y = Float.parseFloat(properties.getString("y")); float parentX = Float.parseFloat(parent.element.getString("x")); float parentY = Float.parseFloat(parent.element.getString("y")); - + if (matrix == null) matrix = new PMatrix2D(); matrix.translate(x - parentX, (y - parentY) / 2f); - - // get the first properties - parseColors(properties); + + // get the first properties + parseColors(properties); font = parseFont(properties); - // It is a line.. - boolean isALine = properties.getString("role") == "line"; - // NO inline content yet. + // cleaned up syntax but removing b/c unused [fry 190118] + //boolean isLine = properties.getString("role").equals("line"); + if (this.childCount > 0) { + // no inline content yet. } String text = properties.getContent(); @@ -1762,14 +1765,18 @@ public void drawImpl(PGraphics g) { } pre(g); - g.textFont(font, font.size / TEXT_QUALITY); +// g.textFont(font, font.size / TEXT_QUALITY); + g.textFont(font, font.size); g.text(textToDisplay, 0, 0); post(g); } - } - - public static class Font extends PShapeSVG { + + + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + static public class Font extends PShapeSVG { public FontFace face; public Map namedGlyphs; @@ -1790,8 +1797,8 @@ public Font(PShapeSVG parent, XML properties) { horizAdvX = properties.getInt("horiz-adv-x", 0); - namedGlyphs = new HashMap(); - unicodeGlyphs = new HashMap(); + namedGlyphs = new HashMap<>(); + unicodeGlyphs = new HashMap<>(); glyphCount = 0; glyphs = new FontGlyph[elements.length]; @@ -1920,7 +1927,7 @@ protected void drawShape() { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - public static class FontGlyph extends PShapeSVG { // extends Path + static public class FontGlyph extends PShapeSVG { // extends Path public String name; char unicode; int horizAdvX; diff --git a/core/todo.txt b/core/todo.txt index 04f84f551d..42c1e0aefc 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -11,9 +11,8 @@ X had to back this fix out again X Fixes blend mode not being set correctly, fixing #5645 X https://github.com/processing/processing/issues/5645 X https://github.com/processing/processing/pull/5647 -_ NullPointerException in Contribution Manager -_ https://github.com/processing/processing/issues/5524 -_ https://github.com/processing/processing/pull/5742 +X extended SVG support +X https://github.com/processing/processing/pull/4168 gohai X Profile GL3bc is not available on X11GraphicsDevice @@ -47,6 +46,11 @@ X https://github.com/processing/processing/pull/5698 X Recreate FBOs when offscreen PGraphicsOpenGL is resized X https://github.com/processing/processing/pull/5699 +cleaning +o WARNING: GL pipe is running in software mode (Renderer ID=0x1020400) +o is this coming from us? if so, need to provide actions +X haven't seen for a while, maybe fixed + _ NullPointerException at java.awt.Window.init(Window.java:497) when using Airplay _ https://github.com/processing/processing/issues/5620 @@ -72,8 +76,6 @@ _ create icon.png or have an 'icons' folder with multiple sizes contribs -_ extended SVG support -_ https://github.com/processing/processing/pull/4168 _ show a warning when a font isn't what the user expected _ https://github.com/processing/processing/issues/5481 _ https://github.com/processing/processing/pull/5605 @@ -89,20 +91,12 @@ _ Switch to getModifiersEx() and fix the AWT modifiers used in PSurfaceAWT _ this is an easy fix, but need to check impact elsewhere _ does anything else rely on these modifiers? -_ Fix Java 9 incompatibilities inside PSurfaceFX -_ https://github.com/processing/processing/issues/5286 - -_ Hitting ESC in FX2D app on macOS throws IllegalStateException -_ https://github.com/processing/processing/issues/5249 _ when doing createFont, can we add it to the os fonts available? _ add separator option to loadTable() _ https://github.com/processing/processing/issues/5068 -_ WARNING: GL pipe is running in software mode (Renderer ID=0x1020400) -_ is this coming from us? if so, need to provide actions - _ implement sketch scaling into PApplet _ https://github.com/processing/processing/issues/4897 _ Sketches on Windows don't take UI sizing into account @@ -165,6 +159,10 @@ _ https://github.com/processing/processing/issues/3753 javafx +_ Fix Java 11 incompatibilities inside PSurfaceFX +_ https://github.com/processing/processing/issues/5286 +_ Hitting ESC in FX2D app on macOS throws IllegalStateException +_ https://github.com/processing/processing/issues/5249 _ wrong window size with fullScreen() _ https://github.com/processing/processing/issues/4737 _ menu bar not hiding properly in exported applications with FX2D diff --git a/todo.txt b/todo.txt index 22b0bcef19..7db71da76a 100755 --- a/todo.txt +++ b/todo.txt @@ -10,6 +10,13 @@ X "Sketch disappeared" infinite pop up dialogs X https://github.com/processing/processing/pull/4808 X https://github.com/processing/processing/issues/4805 +fixed earlier +X Could not initialize class com.sun.jna.Native on startup (Windows) +X https://github.com/processing/processing/issues/4929 +X closed earlier; fixed as best we could +X sharing usage metrics about libraries +X https://github.com/processing/processing/issues/4708 + contrib X Updated russian translation, now can choose russian in preferences X https://github.com/processing/processing/pull/5619 @@ -20,6 +27,9 @@ X https://github.com/processing/processing/issues/5246 X https://github.com/processing/processing/pull/5654 X console hiding button X https://github.com/processing/processing/pull/5115 +_ NullPointerException in Contribution Manager +_ https://github.com/processing/processing/issues/5524 +_ https://github.com/processing/processing/pull/5742 jakub X Fix sketch exception getting hidden by warning @@ -111,9 +121,6 @@ _ see the 'examples' section below _ how are file associations handled in Linux? (for .pde, .psk) -_ Could not initialize class com.sun.jna.Native on startup (Windows) -_ https://github.com/processing/processing/issues/4929 - _ implement fallback fonts instead of giving up and using Dialog and Mono _ https://github.com/processing/processing/issues/5023 @@ -156,11 +163,6 @@ _ https://github.com/processing/processing/issues/1476#issuecomment-23229990 _ could not write to temporary directory (virus checker problems) _ https://github.com/processing/processing/issues/4757 -_ Export Application fails on machines w/ non-ASCII chars in user name -_ at least give a warning about this? -_ https://github.com/processing/processing/issues/4736 -_ related: https://github.com/processing/processing/issues/3543 - _ fix appbundler problems due to rollback _ https://github.com/processing/processing/issues/3790 _ the rollback re-introduces two bugs (serial export and scrolling) @@ -176,9 +178,6 @@ _ https://github.com/processing/processing/issues/4703 _ right bracket missing error _ https://github.com/processing/processing/issues/4702 -_ sharing usage metrics about libraries -_ https://github.com/processing/processing/issues/4708 - _ library compilations handled oddly _ https://github.com/processing/processing/issues/4630 @@ -222,17 +221,19 @@ _ https://github.com/processing/processing/pull/4097 _ solution is to create a sprite sheet as a psd that'll have better type _ no way we're gonna fix the sizing and spacing for all platforms -_ need docs for translations -_ https://github.com/processing/processing/issues/4018 _ setting a bad font/size causes a crash on startup _ https://github.com/processing/processing/issues/4085 o https://github.com/processing/processing/pull/4087 -more contribs +translations +_ need docs for translations +_ https://github.com/processing/processing/issues/4018 _ question about PDE_pt-br instead of PDE_pt _ https://github.com/processing/processing/issues/4018 + +more contribs _ Saving sketch with the same name as a class _ https://github.com/processing/processing/pull/4033 _ Pasting text into PDE results in "Clipboard does not contain a string" @@ -245,6 +246,10 @@ _ but anything else reports "font sadness" b/c it's using the system JRE _ https://github.com/processing/processing/issues/3543 _ move to javapackager or another option? _ http://www.excelsiorjet.com/kb/35/howto-create-a-single-exe-from-your-java-application +_ Export Application fails on machines w/ non-ASCII chars in user name +_ at least give a warning about this? +_ https://github.com/processing/processing/issues/4736 +_ related: https://github.com/processing/processing/issues/3543 _ mouse events (i.e. toggle breakpoint) seem to be firing twice From 4a794bfc7f7c54a6f8668248914986acb6952c1e Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 12:02:56 -0800 Subject: [PATCH 045/172] cleanups for default font warning (#5606 and #5481) --- core/src/processing/core/PFont.java | 32 +++++++++++-------------- core/src/processing/core/PGraphics.java | 8 +++---- core/todo.txt | 8 +++---- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/core/src/processing/core/PFont.java b/core/src/processing/core/PFont.java index b4b9a0fe69..811a9e78c1 100644 --- a/core/src/processing/core/PFont.java +++ b/core/src/processing/core/PFont.java @@ -146,10 +146,10 @@ public class PFont implements PConstants { protected boolean fontSearched; /** - * The name of the font that is used as default when a font isn't found. + * The name of the font that Java uses when a font isn't found. * See {@link #findFont(String)} and {@link #loadFonts()} for more info. */ - static protected String defaultFontName; + static protected String systemFontName; /** * Array of the native system fonts. Used to lookup native fonts by their @@ -157,7 +157,7 @@ public class PFont implements PConstants { * bug that they can't be bothered to fix. */ static protected Font[] fonts; - static protected HashMap fontDifferent; + static protected HashMap fontDifferent; // /** // * If not null, this font is set to load dynamically. This is the default @@ -907,9 +907,12 @@ static public void loadFonts() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); fonts = ge.getAllFonts(); - defaultFontName = new Font("",Font.PLAIN,1).getFontName(); + + // Figure out what the font is named when things fail + systemFontName = new Font("", Font.PLAIN, 1).getFontName(); + if (PApplet.platform == PConstants.MACOSX) { - fontDifferent = new HashMap(); + fontDifferent = new HashMap<>(); for (Font font : fonts) { // getName() returns the PostScript name on OS X 10.6 w/ Java 6. fontDifferent.put(font.getName(), font); @@ -924,9 +927,9 @@ static public void loadFonts() { * Starting with Java 1.5, Apple broke the ability to specify most fonts. * This bug was filed years ago as #4769141 at bugreporter.apple.com. More: * Bug 407. - *
- * This function displays a warning when the font isn't found and the default font is - * used. + *
+ * This function displays a warning when the font isn't found and + * Java's system font is used. * See: issue #5481 */ static public Font findFont(String name) { @@ -936,18 +939,11 @@ static public Font findFont(String name) { if (maybe != null) { return maybe; } -// for (int i = 0; i < fonts.length; i++) { -// if (name.equals(fonts[i].getName())) { -// return fonts[i]; -// } -// } } Font font = new Font(name, Font.PLAIN, 1); - if(!defaultFontName.equals(name) && font.getFontName().equals(defaultFontName)) { - System.err.println("Warning: font \"" + name - + "\" is missing or inaccessible on this system. Default font \"" - + defaultFontName + "\" is used."); - + if (!name.equals(systemFontName) && + font.getFontName().equals(systemFontName)) { + PGraphics.showWarning("Default font being used because \"" + name + "\" is not available."); } return font; } diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 9e65198786..76eaf6d242 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -4063,7 +4063,7 @@ protected void shape(PShape shape, float x, float y, float z, float c, float d, protected PFont createFont(String name, float size, - boolean smooth, char[] charset) { + boolean smooth, char[] charset) { String lowerName = name.toLowerCase(); Font baseFont = null; @@ -4073,9 +4073,9 @@ protected PFont createFont(String name, float size, stream = parent.createInput(name); if (stream == null) { System.err.println("The font \"" + name + "\" " + - "is missing or inaccessible, make sure " + - "the URL is valid or that the file has been " + - "added to your sketch and is readable."); + "is missing or inaccessible, make sure " + + "the URL is valid or that the file has been " + + "added to your sketch and is readable."); return null; } baseFont = Font.createFont(Font.TRUETYPE_FONT, parent.createInput(name)); diff --git a/core/todo.txt b/core/todo.txt index 42c1e0aefc..becc631505 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -13,6 +13,9 @@ X https://github.com/processing/processing/issues/5645 X https://github.com/processing/processing/pull/5647 X extended SVG support X https://github.com/processing/processing/pull/4168 +X show a warning when a font isn't what the user expected +X https://github.com/processing/processing/issues/5481 +X https://github.com/processing/processing/pull/5605 gohai X Profile GL3bc is not available on X11GraphicsDevice @@ -75,11 +78,6 @@ _ need to make this work behind the scenes instead _ create icon.png or have an 'icons' folder with multiple sizes -contribs -_ show a warning when a font isn't what the user expected -_ https://github.com/processing/processing/issues/5481 -_ https://github.com/processing/processing/pull/5605 - _ Implement blendMode() for PDF _ https://github.com/processing/processing/issues/5438 From b84ca8289493959d028affe8a9226d6fed3b4d13 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 14:32:22 -0800 Subject: [PATCH 046/172] greatly improve startup slowness on systems that have a lot of fonts installed --- core/src/processing/core/PApplet.java | 12 ------ core/src/processing/core/PFont.java | 49 +++++++++++++++---------- core/src/processing/core/PGraphics.java | 23 ++++++++++-- core/todo.txt | 10 ++++- 4 files changed, 56 insertions(+), 38 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index f4f5d97c6b..f0647e3960 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -6319,18 +6319,6 @@ public PFont loadFont(String filename) { } - /** - * Used by PGraphics to remove the requirement for loading a font! - */ - protected PFont createDefaultFont(float size) { -// Font f = new Font("SansSerif", Font.PLAIN, 12); -// println("n: " + f.getName()); -// println("fn: " + f.getFontName()); -// println("ps: " + f.getPSName()); - return createFont("Lucida Sans", size, true, null); - } - - public PFont createFont(String name, float size) { return createFont(name, size, true, null); } diff --git a/core/src/processing/core/PFont.java b/core/src/processing/core/PFont.java index 811a9e78c1..c76e63a04b 100644 --- a/core/src/processing/core/PFont.java +++ b/core/src/processing/core/PFont.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-15 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry & Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology @@ -159,21 +159,12 @@ public class PFont implements PConstants { static protected Font[] fonts; static protected HashMap fontDifferent; -// /** -// * If not null, this font is set to load dynamically. This is the default -// * when createFont() method is called without a character set. Bitmap -// * versions of characters are only created when prompted by an index() call. -// */ -// protected Font lazyFont; protected BufferedImage lazyImage; protected Graphics2D lazyGraphics; protected FontMetrics lazyMetrics; protected int[] lazySamples; - /** for subclasses that need to store metadata about the font */ -// protected HashMap cacheMap; - /** * @nowebref */ @@ -902,21 +893,29 @@ static public String[] list() { } + /** + * Make an internal list of all installed fonts. This can take a while with + * a lot of fonts installed, but running it on a separate thread may not + * help much. As of the commit that's adding this note, loadFonts() will + * only be called by PFont.list() and when loading a font by name, both of + * which are occasions when we'd need to block until this was finished + * anyway. It's also possible that running getAllFonts() on a non-EDT thread + * could cause graphics system issues. Further, the first fonts are usually + * loaded at the beginning of a sketch, meaning that sketch startup time + * will still be affected, even with threading (and blocking) in place. + */ static public void loadFonts() { if (fonts == null) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); fonts = ge.getAllFonts(); - // Figure out what the font is named when things fail - systemFontName = new Font("", Font.PLAIN, 1).getFontName(); - if (PApplet.platform == PConstants.MACOSX) { fontDifferent = new HashMap<>(); for (Font font : fonts) { - // getName() returns the PostScript name on OS X 10.6 w/ Java 6. + // No need to use getPSName() anymore because getName() + // returns the PostScript name on OS X 10.6 w/ Java 6. fontDifferent.put(font.getName(), font); - //fontDifferent.put(font.getPSName(), font); } } } @@ -928,22 +927,32 @@ static public void loadFonts() { * This bug was filed years ago as #4769141 at bugreporter.apple.com. More: * Bug 407. *
- * This function displays a warning when the font isn't found and - * Java's system font is used. + * This function displays a warning when the font is not found + * and Java's system font is used. * See: issue #5481 */ static public Font findFont(String name) { - loadFonts(); if (PApplet.platform == PConstants.MACOSX) { + loadFonts(); Font maybe = fontDifferent.get(name); if (maybe != null) { return maybe; } } Font font = new Font(name, Font.PLAIN, 1); + + // make sure we have the name of the system fallback font + if (systemFontName == null) { + // Figure out what the font is named when things fail + systemFontName = new Font("", Font.PLAIN, 1).getFontName(); + } + + // warn the user if they didn't get the font they want if (!name.equals(systemFontName) && - font.getFontName().equals(systemFontName)) { - PGraphics.showWarning("Default font being used because \"" + name + "\" is not available."); + font.getFontName().equals(systemFontName)) { + PGraphics.showWarning("\"" + name + "\" is not available, " + + "so another font will be used. " + + "Use PFont.list() to show available fonts."); } return font; } diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 76eaf6d242..3cca0bec09 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -4062,6 +4062,15 @@ protected void shape(PShape shape, float x, float y, float z, float c, float d, // TEXT/FONTS + /** + * Used by PGraphics to remove the requirement for loading a font. + */ + protected PFont createDefaultFont(float size) { + Font baseFont = new Font("Lucida Sans", Font.PLAIN, 1); + return createFont(baseFont, size, true, null, false); + } + + protected PFont createFont(String name, float size, boolean smooth, char[] charset) { String lowerName = name.toLowerCase(); @@ -4083,9 +4092,7 @@ protected PFont createFont(String name, float size, } else { baseFont = PFont.findFont(name); } - return new PFont(baseFont.deriveFont(size * parent.pixelDensity), - smooth, charset, stream != null, - parent.pixelDensity); + return createFont(baseFont, size, smooth, charset, stream != null); } catch (Exception e) { System.err.println("Problem with createFont(\"" + name + "\")"); @@ -4095,6 +4102,14 @@ protected PFont createFont(String name, float size, } + private PFont createFont(Font baseFont, float size, + boolean smooth, char[] charset, boolean stream) { + return new PFont(baseFont.deriveFont(size * parent.pixelDensity), + smooth, charset, stream, + parent.pixelDensity); + } + + public void textAlign(int alignX) { textAlign(alignX, BASELINE); } @@ -8217,7 +8232,7 @@ protected void defaultFontOrDeath(String method) { */ protected void defaultFontOrDeath(String method, float size) { if (parent != null) { - textFont = parent.createDefaultFont(size); + textFont = createDefaultFont(size); } else { throw new RuntimeException("Use textFont() before " + method + "()"); } diff --git a/core/todo.txt b/core/todo.txt index becc631505..0ba74eee30 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -2,6 +2,13 @@ X make JSONObject.quote() (both versions) public X fix javaPlatform variable for newer JDK versions X https://github.com/processing/processing/pull/5626 +o many fonts installed causes slow startup on macos +o run that on a thread, and make sure default font doesn't need the list loaded +X can't be done, notes in the code for PFont.loadFonts() +X greatly improve startup time when user-specified fonts are not used +X default font will be faster, using ttf/otf is fine +X only createFont("The Font Name") is still slow on macOS +X and PFont.list() contrib o make tabs into spaces, fixes pixelDensity(2) issue with tabs @@ -55,6 +62,7 @@ o is this coming from us? if so, need to provide actions X haven't seen for a while, maybe fixed + _ NullPointerException at java.awt.Window.init(Window.java:497) when using Airplay _ https://github.com/processing/processing/issues/5620 _ try to catch the NPE and warn the user about what's happening @@ -78,7 +86,6 @@ _ need to make this work behind the scenes instead _ create icon.png or have an 'icons' folder with multiple sizes - _ Implement blendMode() for PDF _ https://github.com/processing/processing/issues/5438 @@ -89,7 +96,6 @@ _ Switch to getModifiersEx() and fix the AWT modifiers used in PSurfaceAWT _ this is an easy fix, but need to check impact elsewhere _ does anything else rely on these modifiers? - _ when doing createFont, can we add it to the os fonts available? _ add separator option to loadTable() From 8f17ba66ef01d1666c12938b268d28f42401900c Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 15:16:21 -0800 Subject: [PATCH 047/172] add circle() and square() --- core/src/processing/core/PGraphics.java | 10 ++++++++++ core/todo.txt | 4 ++-- todo.txt | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 3cca0bec09..de50982965 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -2730,6 +2730,11 @@ protected void rectImpl(float x1, float y1, float x2, float y2, } + public void square(float x, float y, float extent) { + rect(x, y, extent, extent); + } + + ////////////////////////////////////////////////////////////// @@ -2906,6 +2911,11 @@ protected void arcImpl(float x, float y, float w, float h, } + public void circle(float x, float y, float extent) { + ellipse(x, y, extent, extent); + } + + ////////////////////////////////////////////////////////////// // BOX diff --git a/core/todo.txt b/core/todo.txt index 0ba74eee30..83eb6a5833 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,4 +1,4 @@ -0266 (3.4.1 or 3.5) +0266 (3.5) X make JSONObject.quote() (both versions) public X fix javaPlatform variable for newer JDK versions X https://github.com/processing/processing/pull/5626 @@ -9,6 +9,7 @@ X greatly improve startup time when user-specified fonts are not used X default font will be faster, using ttf/otf is fine X only createFont("The Font Name") is still slow on macOS X and PFont.list() +X add circle() and square() contrib o make tabs into spaces, fixes pixelDensity(2) issue with tabs @@ -76,7 +77,6 @@ _ (Map is more efficient b/c of size, Iterable more useful) 3.5+ -_ add circle() and square() _ add push() and pop() _ requestSize() and xxxxTitle() (to diminish use of 'surface') _ make setting the window icon automatic, based on files in local dirs diff --git a/todo.txt b/todo.txt index 7db71da76a..50d86b831f 100755 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,4 @@ -0266 (3.4.1 or 3.5) +0266 (3.5) X update to Java 8u192 o processing-java doesn't handle sketch exceptions by quitting the sketch X https://github.com/processing/processing/issues/5375 From 2b50c0b535aa083e2f51732f821e9e9037a65601 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 15:17:51 -0800 Subject: [PATCH 048/172] add push() and pop() --- core/src/processing/core/PGraphics.java | 37 +++++++++++-------------- core/todo.txt | 2 +- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index de50982965..c05d34c383 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -5126,27 +5126,22 @@ protected void textCharScreenImpl(PImage glyph, */ -// /** -// * Convenience method to get a legit FontMetrics object. Where possible, -// * override this any renderer subclass so that you're not using what's -// * returned by getDefaultToolkit() to get your metrics. -// */ -// @SuppressWarnings("deprecation") -// public FontMetrics getFontMetrics(Font font) { // ignore -// Frame frame = parent.frame; -// if (frame != null) { -// return frame.getToolkit().getFontMetrics(font); -// } -// return Toolkit.getDefaultToolkit().getFontMetrics(font); -// } -// -// -// /** -// * Convenience method to jump through some Java2D hoops and get an FRC. -// */ -// public FontRenderContext getFontRenderContext(Font font) { // ignore -// return getFontMetrics(font).getFontRenderContext(); -// } + + ////////////////////////////////////////////////////////////// + + // PARITY WITH P5.JS + + + public void push() { + pushStyle(); + pushMatrix(); + } + + + public void pop() { + popStyle(); + popMatrix(); + } diff --git a/core/todo.txt b/core/todo.txt index 83eb6a5833..94abc2fe85 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -10,6 +10,7 @@ X default font will be faster, using ttf/otf is fine X only createFont("The Font Name") is still slow on macOS X and PFont.list() X add circle() and square() +X add push() and pop() contrib o make tabs into spaces, fixes pixelDensity(2) issue with tabs @@ -77,7 +78,6 @@ _ (Map is more efficient b/c of size, Iterable more useful) 3.5+ -_ add push() and pop() _ requestSize() and xxxxTitle() (to diminish use of 'surface') _ make setting the window icon automatic, based on files in local dirs X https://github.com/processing/processing/issues/5123 From 5d727e8d96bd55b077b446f70ff62b3e914f52b4 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 15:59:05 -0800 Subject: [PATCH 049/172] adding circle, square, push, pop --- core/src/processing/core/PApplet.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index f0647e3960..52d4f8068c 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -12109,6 +12109,12 @@ public void rect(float a, float b, float c, float d, } + public void square(float x, float y, float extent) { + if (recorder != null) recorder.square(x, y, extent); + g.square(x, y, extent); + } + + /** * ( begin auto-generated from ellipseMode.xml ) * @@ -12197,6 +12203,12 @@ public void arc(float a, float b, float c, float d, } + public void circle(float x, float y, float extent) { + if (recorder != null) recorder.circle(x, y, extent); + g.circle(x, y, extent); + } + + /** * ( begin auto-generated from box.xml ) * @@ -13219,6 +13231,18 @@ public void text(float num, float x, float y, float z) { } + public void push() { + if (recorder != null) recorder.push(); + g.push(); + } + + + public void pop() { + if (recorder != null) recorder.pop(); + g.pop(); + } + + /** * ( begin auto-generated from pushMatrix.xml ) * From 1c8b05666d6fac801297b7ecfdcd433f79d3cc5e Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 15:59:15 -0800 Subject: [PATCH 050/172] more notes about font issues and performance --- core/src/processing/core/PFont.java | 22 +++++++++++++--------- todo.txt | 4 ++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/src/processing/core/PFont.java b/core/src/processing/core/PFont.java index c76e63a04b..33ca7eb404 100644 --- a/core/src/processing/core/PFont.java +++ b/core/src/processing/core/PFont.java @@ -894,15 +894,19 @@ static public String[] list() { /** - * Make an internal list of all installed fonts. This can take a while with - * a lot of fonts installed, but running it on a separate thread may not - * help much. As of the commit that's adding this note, loadFonts() will - * only be called by PFont.list() and when loading a font by name, both of - * which are occasions when we'd need to block until this was finished - * anyway. It's also possible that running getAllFonts() on a non-EDT thread - * could cause graphics system issues. Further, the first fonts are usually - * loaded at the beginning of a sketch, meaning that sketch startup time - * will still be affected, even with threading (and blocking) in place. + * Make an internal list of all installed fonts. + * + * This can take a while with a lot of fonts installed, but running it on + * a separate thread may not help much. As of the commit that's adding this + * note, loadFonts() will only be called by PFont.list() and when loading a + * font by name, both of which are occasions when we'd need to block until + * this was finished anyway. It's also possible that running getAllFonts() + * on a non-EDT thread could cause graphics system issues. Further, the first + * fonts are usually loaded at the beginning of a sketch, meaning that sketch + * startup time will still be affected, even with threading in place. + * + * Where we're getting killed on font performance is due to this bug: + * https://bugs.openjdk.java.net/browse/JDK-8179209 */ static public void loadFonts() { if (fonts == null) { diff --git a/todo.txt b/todo.txt index 50d86b831f..1d964a64b7 100755 --- a/todo.txt +++ b/todo.txt @@ -9,6 +9,10 @@ X update to Java 8u202 X "Sketch disappeared" infinite pop up dialogs X https://github.com/processing/processing/pull/4808 X https://github.com/processing/processing/issues/4805 +X text("test", 10, 10); is still slow with lots of fonts +X https://bugs.openjdk.java.net/browse/JDK-8179209 +X added a note to the Known Issues section in the Changes wiki +_ update the about screen to 2019 fixed earlier X Could not initialize class com.sun.jna.Native on startup (Windows) From 773b094e70a7bda070c34fa2928d44c8ce740520 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 16:09:18 -0800 Subject: [PATCH 051/172] add 2019 to the About/splash screen --- build/shared/lib/about-1x.png | Bin 170565 -> 119185 bytes build/shared/lib/about-2x.png | Bin 372398 -> 365934 bytes build/windows/about.bmp | Bin 507656 -> 507656 bytes todo.txt | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build/shared/lib/about-1x.png b/build/shared/lib/about-1x.png index 3678b0e71d1cb5b4a2665865fc24b84f62dc1c59..4224ee4e6678adae78f4b50b94cca9f40f2b9983 100644 GIT binary patch literal 119185 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 literal 170565 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 z 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%0AmRm%nD1d6%BzeIP$UZy4A}| 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

VzG_t07?(U(9$w*v9pY2Q2<_J>!9pR9bX667bK| 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�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ⅆJmuUMgD$bn?MU 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 z%0D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

Jd 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�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 diff --git a/todo.txt b/todo.txt index 1d964a64b7..58570a6c14 100755 --- a/todo.txt +++ b/todo.txt @@ -12,7 +12,7 @@ X https://github.com/processing/processing/issues/4805 X text("test", 10, 10); is still slow with lots of fonts X https://bugs.openjdk.java.net/browse/JDK-8179209 X added a note to the Known Issues section in the Changes wiki -_ update the about screen to 2019 +X update the about screen to 2019 fixed earlier X Could not initialize class com.sun.jna.Native on startup (Windows) From 438dbb2fae66a35d055ba6ab085df0171c1fcfd6 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 17:23:02 -0800 Subject: [PATCH 052/172] move problematic shortcuts out to the language files (fixes #2199) --- app/src/processing/app/ui/Editor.java | 10 ++- app/src/processing/app/ui/EditorHeader.java | 12 ++-- app/src/processing/app/ui/Toolkit.java | 23 ++++++ build/shared/lib/languages/PDE.properties | 6 ++ java/src/processing/mode/java/JavaEditor.java | 9 ++- todo.txt | 71 ++++++++++++------- 6 files changed, 96 insertions(+), 35 deletions(-) diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index 0fbd5b1ea6..8da45570c8 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -956,7 +956,8 @@ public void actionPerformed(ActionEvent e) { }); menu.add(item); - item = Toolkit.newJMenuItem(Language.text("menu.edit.comment_uncomment"), '/'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.comment_uncomment"), + Language.text("menu.edit.comment_uncomment.keystroke")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCommentUncomment(); @@ -964,7 +965,9 @@ public void actionPerformed(ActionEvent e) { }); menu.add(item); - item = Toolkit.newJMenuItem("\u2192 "+Language.text("menu.edit.increase_indent"), ']'); + item = Toolkit.newJMenuItem("\u2192 " + Language.text("menu.edit.increase_indent"), + Language.text("menu.edit.increase_indent.keystroke")); + item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(true); @@ -972,7 +975,8 @@ public void actionPerformed(ActionEvent e) { }); menu.add(item); - item = Toolkit.newJMenuItem("\u2190 "+Language.text("menu.edit.decrease_indent"), '['); + item = Toolkit.newJMenuItem("\u2190 " + Language.text("menu.edit.decrease_indent"), + Language.text("menu.edit.decrease_indent.keystroke")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(false); diff --git a/app/src/processing/app/ui/EditorHeader.java b/app/src/processing/app/ui/EditorHeader.java index 7fba02d21a..32a4cc7ea2 100644 --- a/app/src/processing/app/ui/EditorHeader.java +++ b/app/src/processing/app/ui/EditorHeader.java @@ -498,7 +498,8 @@ public void actionPerformed(ActionEvent e) { if (Platform.isLinux()) { item = Toolkit.newJMenuItem(prevTab, KeyEvent.VK_PAGE_UP); } else { - item = Toolkit.newJMenuItemAlt(prevTab, KeyEvent.VK_LEFT); + //item = Toolkit.newJMenuItemAlt(prevTab, KeyEvent.VK_LEFT); + item = Toolkit.newJMenuItem(prevTab, Language.text("editor.header.previous_tab.keystroke")); } action = new AbstractAction() { @Override @@ -510,7 +511,8 @@ public void actionPerformed(ActionEvent e) { if (Platform.isLinux()) { keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, Toolkit.SHORTCUT_KEY_MASK); } else { - keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Toolkit.SHORTCUT_ALT_KEY_MASK); + //keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Toolkit.SHORTCUT_ALT_KEY_MASK); + keyStroke = KeyStroke.getKeyStroke(Language.text("editor.header.previous_tab.keystroke")); } inputMap.put(keyStroke, mapKey); actionMap.put(mapKey, action); @@ -521,7 +523,8 @@ public void actionPerformed(ActionEvent e) { if (Platform.isLinux()) { item = Toolkit.newJMenuItem(nextTab, KeyEvent.VK_PAGE_DOWN); } else { - item = Toolkit.newJMenuItemAlt(nextTab, KeyEvent.VK_RIGHT); + //item = Toolkit.newJMenuItemAlt(nextTab, KeyEvent.VK_RIGHT); + item = Toolkit.newJMenuItem(nextTab, Language.text("editor.header.next_tab.keystroke")); } action = new AbstractAction() { @Override @@ -533,7 +536,8 @@ public void actionPerformed(ActionEvent e) { if (Platform.isLinux()) { keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, Toolkit.SHORTCUT_KEY_MASK); } else { - keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Toolkit.SHORTCUT_ALT_KEY_MASK); + //keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Toolkit.SHORTCUT_ALT_KEY_MASK); + keyStroke = KeyStroke.getKeyStroke(Language.text("editor.header.next_tab.keystroke")); } inputMap.put(keyStroke, mapKey); actionMap.put(mapKey, action); diff --git a/app/src/processing/app/ui/Toolkit.java b/app/src/processing/app/ui/Toolkit.java index 8dedc57f16..b49987a46d 100644 --- a/app/src/processing/app/ui/Toolkit.java +++ b/app/src/processing/app/ui/Toolkit.java @@ -131,6 +131,29 @@ static public JMenuItem newJMenuItem(String title, int what) { } + /** + * Create a menu item and set its KeyStroke by name (so it can be stored + * in the language settings or the preferences. Syntax is here: + * https://docs.oracle.com/javase/8/docs/api/javax/swing/KeyStroke.html#getKeyStroke-java.lang.String- + * @param sequence the name, as outlined by the KeyStroke API + * @param fallback what to use if getKeyStroke() comes back null + */ + static public JMenuItem newJMenuItem(String title, + String sequence) { + JMenuItem menuItem = new JMenuItem(title); + KeyStroke ks = KeyStroke.getKeyStroke(sequence); + if (ks != null) { + menuItem.setAccelerator(ks); + + } else { + System.err.println("'" + sequence + "' is not understood, " + + "pleae re-read the Java reference for KeyStroke"); + //ks = KeyStroke.getKeyStroke(fallback); + } + return menuItem; + } + + /** * @param action: use an Action, which sets the title, reaction * and enabled-ness all by itself. diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index 37b191509f..e45b698dbb 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -40,8 +40,11 @@ menu.edit.paste = Paste menu.edit.select_all = Select All menu.edit.auto_format = Auto Format menu.edit.comment_uncomment = Comment/Uncomment +menu.edit.comment_uncomment.keystroke = meta pressed SLASH menu.edit.increase_indent = Increase Indent +menu.edit.increase_indent.keystroke = meta pressed CLOSE_BRACKET menu.edit.decrease_indent = Decrease Indent +menu.edit.decrease_indent.keystroke = meta pressed OPEN_BRACKET menu.edit.find = Find... menu.edit.find_next = Find Next menu.edit.find_previous = Find Previous @@ -77,8 +80,11 @@ menu.debug.toggle_breakpoint = Toggle Breakpoint # --- # used for both menus and toolbars menu.debug.step = Step +menu.debug.step.keystroke = meta pressed J menu.debug.step_into = Step Into +menu.debug.step.keystroke = shift meta pressed J menu.debug.step_out = Step Out +menu.debug.step.keystroke = meta alt pressed J menu.debug.continue = Continue # --- #menu.debug.print_stack_trace = Print Stack Trace diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 209a1e4277..53723ff023 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -1384,7 +1384,8 @@ public void actionPerformed(ActionEvent e) { // }); // debugMenu.add(item); - item = Toolkit.newJMenuItem(Language.text("menu.debug.step"), KeyEvent.VK_J); + item = Toolkit.newJMenuItem(Language.text("menu.debug.step"), + Language.text("menu.debug.step.keystroke")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleStep(0); @@ -1393,7 +1394,8 @@ public void actionPerformed(ActionEvent e) { debugMenu.add(item); item.setEnabled(false); - item = Toolkit.newJMenuItemShift(Language.text("menu.debug.step_into"), KeyEvent.VK_J); + item = Toolkit.newJMenuItem(Language.text("menu.debug.step_into"), + Language.text("menu.debug.step_into.keystroke")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleStep(ActionEvent.SHIFT_MASK); @@ -1402,7 +1404,8 @@ public void actionPerformed(ActionEvent e) { debugMenu.add(item); item.setEnabled(false); - item = Toolkit.newJMenuItemAlt(Language.text("menu.debug.step_out"), KeyEvent.VK_J); + item = Toolkit.newJMenuItem(Language.text("menu.debug.step_out"), + Language.text("menu.debug.step_out.keystroke")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleStep(ActionEvent.ALT_MASK); diff --git a/todo.txt b/todo.txt index 58570a6c14..d063372776 100755 --- a/todo.txt +++ b/todo.txt @@ -13,6 +13,35 @@ X text("test", 10, 10); is still slow with lots of fonts X https://bugs.openjdk.java.net/browse/JDK-8179209 X added a note to the Known Issues section in the Changes wiki X update the about screen to 2019 +o report of a library or tool (probably includes 2.x? 1.x?) breaking things +o NoSuchFieldError: useNativeSelect +X https://github.com/processing/processing/issues/4821 +X closed, no response + + +shortcuts +X problems with non-US keyboards and some shortcuts +X https://github.com/processing/processing/issues/2199 +_ Determine new keyboard shortcut for Step Out +_ https://github.com/processing/processing/issues/3538 + +# Comment/Uncomment, Increase Indent, Decrease Indent +menu.edit.comment_uncomment.keystroke = meta pressed SLASH +menu.edit.increase_indent.keystroke = meta pressed CLOSE_BRACKET +menu.edit.decrease_indent.keystroke = meta pressed OPEN_BRACKET +# inside Editor.java + +# Previous Tab, Next Tab (ignored on Linux, which is Page Up and Page Down) +editor.header.previous_tab.keystroke = meta alt pressed LEFT +editor.header.next_tab.keystroke = meta alt pressed RIGHT +# inside EditorHeader.java + +# Step, Step Into, and Step Out +menu.debug.step.keystroke = meta pressed J +menu.debug.step_into.keystroke = shift meta pressed J +menu.debug.step_out.keystroke = meta alt pressed J +# inside JavaEditor.java + fixed earlier X Could not initialize class com.sun.jna.Native on startup (Windows) @@ -20,6 +49,8 @@ X https://github.com/processing/processing/issues/4929 X closed earlier; fixed as best we could X sharing usage metrics about libraries X https://github.com/processing/processing/issues/4708 +X Determine shortcut for Export vs Use Selection for Find +X https://github.com/processing/processing/issues/2985 contrib X Updated russian translation, now can choose russian in preferences @@ -31,9 +62,9 @@ X https://github.com/processing/processing/issues/5246 X https://github.com/processing/processing/pull/5654 X console hiding button X https://github.com/processing/processing/pull/5115 -_ NullPointerException in Contribution Manager -_ https://github.com/processing/processing/issues/5524 -_ https://github.com/processing/processing/pull/5742 +X NullPointerException in Contribution Manager when installing +X https://github.com/processing/processing/issues/5524 +X https://github.com/processing/processing/pull/5742 jakub X Fix sketch exception getting hidden by warning @@ -51,13 +82,14 @@ _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 _ discuss with Casey -_ Welcome screen doesn't size properly for HiDPI screens -_ https://github.com/processing/processing/issues/4896 -nasty ones + +high-ish _ errors inside setup() aren't coming through at all? _ seen in Eclipse; have to turn on the debugger +_ Welcome screen doesn't size properly for HiDPI screens +_ https://github.com/processing/processing/issues/4896 manager @@ -100,16 +132,22 @@ _ clean Windows temp folders _ https://github.com/processing/processing/issues/1896 +modes _ sketch.properties not being written if initial mode is p5.js? _ when creating a sketch within non-Java mode, should write the settings file _ so that it re-loads in the proper environment _ remove sketch.properties when moving back to the default? _ or can we not do this, because it's used to set the 'next' mode +_ allow modes to specify their own base file name +_ need to move "is this a sketch?" handling into Mode +_ fix extension check for other modes +_ https://github.com/processing/processing/issues/3980 + +sketch/launching _ what to double-click when opening p5 projects _ lack of a project file makes this a pain _ dropping a sketch folder onto the PDE should also be implemented - _ some type of sketch archive format for posting examples (.psk?) _ would be nice to open a sketch directly from a zip file _ https://github.com/processing/processing/issues/73 @@ -140,15 +178,6 @@ _ implement simple table for prefs? _ "error during export" message, but no error message contents come through _ e.g. https://github.com/processing/processing/issues/4792 -_ report of a library or tool (probably includes 2.x? 1.x?) breaking things -_ NoSuchFieldError: useNativeSelect -_ https://github.com/processing/processing/issues/4821 - -_ allow modes to specify their own base file name -_ need to move "is this a sketch?" handling into Mode -_ fix extension check for other modes -_ https://github.com/processing/processing/issues/3980 - _ did we lose settings.path because it was too buggy? _ https://github.com/processing/processing/issues/3948 @@ -200,19 +229,11 @@ _ https://github.com/processing/processing/issues/4353#issuecomment-237715947 medium _ detect changes in case with libraries _ https://github.com/processing/processing/issues/4507 -_ make when opening new editor window, open on the same display as current +_ when opening new editor window, open on the same display as current _ https://github.com/processing/processing/issues/4526 _ Library path mismatch between processing-java and export _ https://github.com/processing/processing/issues/4493 -shortcuts -_ problems with non-US keyboards and some shortcuts -_ https://github.com/processing/processing/issues/2199 -_ Determine shortcut for Export vs Use Selection for Find -_ https://github.com/processing/processing/issues/2985 -_ Determine new keyboard shortcut for Step Out -_ https://github.com/processing/processing/issues/3538 - needs more review _ createPreprocessor() added to JavaEditor, creating a mess From fe7b90cf5507252456b8c4b711ef4742efa9b2cf Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 17:25:44 -0800 Subject: [PATCH 053/172] wrapping up #2199 in the todo notes --- todo.txt | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/todo.txt b/todo.txt index d063372776..28473f01bf 100755 --- a/todo.txt +++ b/todo.txt @@ -17,31 +17,12 @@ o report of a library or tool (probably includes 2.x? 1.x?) breaking things o NoSuchFieldError: useNativeSelect X https://github.com/processing/processing/issues/4821 X closed, no response - - -shortcuts X problems with non-US keyboards and some shortcuts X https://github.com/processing/processing/issues/2199 -_ Determine new keyboard shortcut for Step Out -_ https://github.com/processing/processing/issues/3538 - -# Comment/Uncomment, Increase Indent, Decrease Indent -menu.edit.comment_uncomment.keystroke = meta pressed SLASH -menu.edit.increase_indent.keystroke = meta pressed CLOSE_BRACKET -menu.edit.decrease_indent.keystroke = meta pressed OPEN_BRACKET -# inside Editor.java - -# Previous Tab, Next Tab (ignored on Linux, which is Page Up and Page Down) -editor.header.previous_tab.keystroke = meta alt pressed LEFT -editor.header.next_tab.keystroke = meta alt pressed RIGHT -# inside EditorHeader.java - -# Step, Step Into, and Step Out -menu.debug.step.keystroke = meta pressed J -menu.debug.step_into.keystroke = shift meta pressed J -menu.debug.step_out.keystroke = meta alt pressed J -# inside JavaEditor.java - +_ https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings +o Determine new keyboard shortcut for Step Out +X https://github.com/processing/processing/issues/3538 +X all set based on #2199 fixed earlier X Could not initialize class com.sun.jna.Native on startup (Windows) From c946d640a90c61d8cb549017f658835e88e326f8 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 18 Jan 2019 17:44:31 -0800 Subject: [PATCH 054/172] unsaved language/keystroke edits, other notes --- build/shared/lib/languages/PDE.properties | 6 ++++-- todo.txt | 13 +++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index e45b698dbb..1a42b0a809 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -82,9 +82,9 @@ menu.debug.toggle_breakpoint = Toggle Breakpoint menu.debug.step = Step menu.debug.step.keystroke = meta pressed J menu.debug.step_into = Step Into -menu.debug.step.keystroke = shift meta pressed J +menu.debug.step_into.keystroke = shift meta pressed J menu.debug.step_out = Step Out -menu.debug.step.keystroke = meta alt pressed J +menu.debug.step_out.keystroke = meta alt pressed J menu.debug.continue = Continue # --- #menu.debug.print_stack_trace = Print Stack Trace @@ -315,7 +315,9 @@ editor.header.new_tab = New Tab editor.header.rename = Rename editor.header.delete = Delete editor.header.previous_tab = Previous Tab +editor.header.previous_tab.keystroke = meta alt pressed LEFT editor.header.next_tab = Next Tab +editor.header.next_tab.keystroke = meta alt pressed RIGHT editor.header.delete.warning.title = Yeah, no. editor.header.delete.warning.text = You cannot delete the main tab of the only open sketch. diff --git a/todo.txt b/todo.txt index 28473f01bf..5ed8e9169e 100755 --- a/todo.txt +++ b/todo.txt @@ -19,7 +19,7 @@ X https://github.com/processing/processing/issues/4821 X closed, no response X problems with non-US keyboards and some shortcuts X https://github.com/processing/processing/issues/2199 -_ https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings +X https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings o Determine new keyboard shortcut for Step Out X https://github.com/processing/processing/issues/3538 X all set based on #2199 @@ -46,6 +46,8 @@ X https://github.com/processing/processing/pull/5115 X NullPointerException in Contribution Manager when installing X https://github.com/processing/processing/issues/5524 X https://github.com/processing/processing/pull/5742 +X Improvements to appdata.xml for Linux +X https://github.com/processing/processing/pull/5604 jakub X Fix sketch exception getting hidden by warning @@ -65,10 +67,11 @@ _ https://github.com/processing/processing/pull/5642 _ discuss with Casey - high-ish +_ settings() present and pixelDensity() is in setup(), nothing set/no error +_ https://github.com/processing/processing/issues/4703 _ errors inside setup() aren't coming through at all? -_ seen in Eclipse; have to turn on the debugger +_ seen in Eclipse; have to turn on the debugger... same as #4703? _ Welcome screen doesn't size properly for HiDPI screens _ https://github.com/processing/processing/issues/4896 @@ -165,6 +168,7 @@ _ https://github.com/processing/processing/issues/3948 _ update list of optional JRE files for Java 8 _ Andres provided some updates _ https://github.com/processing/processing/issues/3288 +_ these will change again for Java 11, so wait until then _ proxy trouble with p5? since adding the system proxy? _ https://github.com/processing/processing/pull/3251/files @@ -186,9 +190,6 @@ _ https://github.com/processing/processing/commits/master/build/macosx/appbund _ https://github.com/processing/processing/commit/fa27b983e76fdbc5c4c1451a1f0d854c652b1639 _ https://bitbucket.org/infinitekind/appbundler -_ settings() present and pixelDensity() is in setup(), nothing set/no error -_ https://github.com/processing/processing/issues/4703 - _ right bracket missing error _ https://github.com/processing/processing/issues/4702 From 6efaea622fc0d2d8432c025a6ab9b6615f849791 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 19 Jan 2019 17:16:01 -0800 Subject: [PATCH 055/172] fix warnings --- app/src/processing/app/contrib/ListPanel.java | 1 - .../app/contrib/UpdateListPanel.java | 22 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/processing/app/contrib/ListPanel.java b/app/src/processing/app/contrib/ListPanel.java index cf73db21d5..49c50658cc 100644 --- a/app/src/processing/app/contrib/ListPanel.java +++ b/app/src/processing/app/contrib/ListPanel.java @@ -35,7 +35,6 @@ import processing.app.Base; import processing.app.Platform; import processing.app.ui.Toolkit; -import sun.swing.SwingUtilities2; // The "Scrollable" implementation and its methods here take care of preventing diff --git a/app/src/processing/app/contrib/UpdateListPanel.java b/app/src/processing/app/contrib/UpdateListPanel.java index 75bcca3b6f..6ade2e439a 100644 --- a/app/src/processing/app/contrib/UpdateListPanel.java +++ b/app/src/processing/app/contrib/UpdateListPanel.java @@ -2,18 +2,18 @@ public class UpdateListPanel extends ListPanel { - Contribution.Filter filter; + Contribution.Filter contribFilter; public UpdateListPanel(ContributionTab contributionTab, - Contribution.Filter filter) { - super(contributionTab, filter, true, - ContributionColumn.STATUS_NO_HEADER, - ContributionColumn.NAME, - ContributionColumn.AUTHOR, - ContributionColumn.INSTALLED_VERSION, - ContributionColumn.AVAILABLE_VERSION); - - this.filter = filter; + Contribution.Filter contribFilter) { + super(contributionTab, contribFilter, true, + ContributionColumn.STATUS_NO_HEADER, + ContributionColumn.NAME, + ContributionColumn.AUTHOR, + ContributionColumn.INSTALLED_VERSION, + ContributionColumn.AVAILABLE_VERSION); + + this.contribFilter = contribFilter; table.getTableHeader().setEnabled(false); } @@ -21,7 +21,7 @@ public UpdateListPanel(ContributionTab contributionTab, @Override public void contributionAdded(final Contribution contribution) { // Ensures contributionAdded in ListPanel is only run on LocalContributions - if (filter.matches(contribution)) { + if (contribFilter.matches(contribution)) { super.contributionAdded(contribution); ((UpdateStatusPanel) contributionTab.statusPanel).update(); // Enables update button } From 5b3e6449a7c6f685e73cad09865c7d33a1b951b9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 19 Jan 2019 17:16:14 -0800 Subject: [PATCH 056/172] cleaning up the todo list a bit --- core/todo.txt | 18 ++++++-------- todo.txt | 69 ++++++++++++++++++++++++--------------------------- 2 files changed, 39 insertions(+), 48 deletions(-) diff --git a/core/todo.txt b/core/todo.txt index 94abc2fe85..2a85b79e4b 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -64,7 +64,12 @@ o is this coming from us? if so, need to provide actions X haven't seen for a while, maybe fixed - +high-ish +_ make setting the window icon automatic, based on files in local dirs +X https://github.com/processing/processing/issues/5123 +X https://github.com/processing/processing/pull/5202 +_ need to make this work behind the scenes instead +_ create icon.png or have an 'icons' folder with multiple sizes _ NullPointerException at java.awt.Window.init(Window.java:497) when using Airplay _ https://github.com/processing/processing/issues/5620 _ try to catch the NPE and warn the user about what's happening @@ -77,14 +82,7 @@ _ should DoubleDict create from Iterable or Map<>? _ (Map is more efficient b/c of size, Iterable more useful) -3.5+ _ requestSize() and xxxxTitle() (to diminish use of 'surface') -_ make setting the window icon automatic, based on files in local dirs -X https://github.com/processing/processing/issues/5123 -X https://github.com/processing/processing/pull/5202 -_ need to make this work behind the scenes instead -_ create icon.png or have an 'icons' folder with multiple sizes - _ Implement blendMode() for PDF _ https://github.com/processing/processing/issues/5438 @@ -96,8 +94,6 @@ _ Switch to getModifiersEx() and fix the AWT modifiers used in PSurfaceAWT _ this is an easy fix, but need to check impact elsewhere _ does anything else rely on these modifiers? -_ when doing createFont, can we add it to the os fonts available? - _ add separator option to loadTable() _ https://github.com/processing/processing/issues/5068 @@ -468,11 +464,11 @@ _ Python Mode has a hook for when it's called CORE / PFont and text() +_ when doing createFont, can we add it to the os fonts available? _ font rotation (native font problem?) with natives? _ https://github.com/processing/processing/issues/731 _ Text rotation, placement and font metrics incorrect when scaled _ https://github.com/processing/processing/issues/2167 - _ remove subsetting stuff from PFont? _ or use hint(ENABLE_FONT_SUBSETTING)? _ what's the difference with ascent on loadFont vs. createFont? diff --git a/todo.txt b/todo.txt index 5ed8e9169e..8ec6eb00a0 100755 --- a/todo.txt +++ b/todo.txt @@ -24,7 +24,7 @@ o Determine new keyboard shortcut for Step Out X https://github.com/processing/processing/issues/3538 X all set based on #2199 -fixed earlier +cleaning X Could not initialize class com.sun.jna.Native on startup (Windows) X https://github.com/processing/processing/issues/4929 X closed earlier; fixed as best we could @@ -32,6 +32,15 @@ X sharing usage metrics about libraries X https://github.com/processing/processing/issues/4708 X Determine shortcut for Export vs Use Selection for Find X https://github.com/processing/processing/issues/2985 +o swap font smoothing for tab size? +o implement simple table for prefs? +X still requires restart of the software, so problematic +X need docs for translations +X https://github.com/processing/processing/issues/4018 +X setting a bad font/size in preferences.txt causes a crash on startup +X https://github.com/processing/processing/issues/4085 +o https://github.com/processing/processing/pull/4087 +X can't reproduce with current code contrib X Updated russian translation, now can choose russian in preferences @@ -61,10 +70,10 @@ X size(0, 0) just freezes instead of showing an error X https://github.com/processing/processing/issues/5233 (duplicate) +3.5.1 _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 -_ discuss with Casey high-ish @@ -76,25 +85,6 @@ _ Welcome screen doesn't size properly for HiDPI screens _ https://github.com/processing/processing/issues/4896 -manager -_ Manager fails to complete install of PythonMode when no windows open -_ https://github.com/processing/processing/issues/5309 -_ an incompatible Mode prevents the PDE from quitting after last window is closed -_ https://github.com/processing/processing/issues/5112 -_ “could not move the contribution to the backup folder” message while updating -_ problem is that any sketch that uses a library, the lib is stuck as "in use" -_ https://github.com/processing/processing/issues/4973 -_ issues with updating modes -_ https://github.com/processing/processing/issues/5424 -_ examples window not updating on install -_ open examples window -_ mode > add mode > libraries > install video -_ did not update the examples window, had to restart pde -_ was able to save over the video capture examples b/c they were a library -_ lib examples not properly marked as read-only -_ "Could not find a examples in the downloaded file" is a poorly worded message - - temp _ inside Sketch, makeTempFolder() would be the place to modify the location _ perhaps make a 'temp' inside the sketchbook folder? @@ -114,6 +104,8 @@ _ don't allow adding files w/o saving _ others? _ clean Windows temp folders _ https://github.com/processing/processing/issues/1896 +_ could not write to temporary directory (virus checker problems) +_ https://github.com/processing/processing/issues/4757 modes @@ -147,7 +139,7 @@ _ see the 'examples' section below _ how are file associations handled in Linux? (for .pde, .psk) -_ implement fallback fonts instead of giving up and using Dialog and Mono +_ Implement fallback fonts so we can use Source et al with CJK/Greek/Arabic _ https://github.com/processing/processing/issues/5023 _ "Required files could not be found" when trying to run from the .zip file @@ -156,8 +148,6 @@ _ use an installer instead? _ mode list does not update after changing sketchbook folder _ already reported? -_ swap font smoothing for tab size? -_ implement simple table for prefs? _ "error during export" message, but no error message contents come through _ e.g. https://github.com/processing/processing/issues/4792 @@ -178,8 +168,6 @@ _ malformed proxy issues http://stackoverflow.com/q/376101 _ docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html _ https://github.com/processing/processing/issues/1476#issuecomment-23229990 -_ could not write to temporary directory (virus checker problems) -_ https://github.com/processing/processing/issues/4757 _ fix appbundler problems due to rollback _ https://github.com/processing/processing/issues/3790 @@ -205,8 +193,6 @@ _ text gutter doesn't seem to be hidpi X or is it b/c screen not quite 2x? (nope) _ swap out the fonts? -_ Help Menu disabled on OS X -_ https://github.com/processing/processing/issues/4353#issuecomment-237715947 medium _ detect changes in case with libraries @@ -229,16 +215,7 @@ _ solution is to create a sprite sheet as a psd that'll have better type _ no way we're gonna fix the sizing and spacing for all platforms -_ setting a bad font/size causes a crash on startup -_ https://github.com/processing/processing/issues/4085 -o https://github.com/processing/processing/pull/4087 - -translations -_ need docs for translations -_ https://github.com/processing/processing/issues/4018 -_ question about PDE_pt-br instead of PDE_pt -_ https://github.com/processing/processing/issues/4018 more contribs _ Saving sketch with the same name as a class @@ -762,6 +739,22 @@ _ e.g. ocd is broken in 0125 because of method signature changes PDE / Manager +_ Manager fails to complete install of PythonMode when no windows open +_ https://github.com/processing/processing/issues/5309 +_ an incompatible Mode prevents the PDE from quitting after last window is closed +_ https://github.com/processing/processing/issues/5112 +_ “could not move the contribution to the backup folder” message while updating +_ problem is that any sketch that uses a library, the lib is stuck as "in use" +_ https://github.com/processing/processing/issues/4973 +_ issues with updating modes +_ https://github.com/processing/processing/issues/5424 +_ examples window not updating on install +_ open examples window +_ mode > add mode > libraries > install video +_ did not update the examples window, had to restart pde +_ was able to save over the video capture examples b/c they were a library +_ lib examples not properly marked as read-only +_ "Could not find a examples in the downloaded file" is a poorly worded message _ 'version' should be x.y or x.y.z, not some extra long string _ enforce this by disallowing spaces? on the import script? _ Progress bar height on macOS is too thin @@ -993,6 +986,8 @@ _ this may already work with SingleInstance stuff DIST / Mac OS X +_ Help Menu disabled on OS X (looks like a JVM bug) +_ https://github.com/processing/processing/issues/4353#issuecomment-237715947 _ Java bug prevents us from setting the dock name of a sketch run from the PDE _ https://github.com/processing/processing/issues/5045 _ client properties From 06abd1bfa6ce84576919a909dc9cedfc24fc2c4b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 07:59:14 -0800 Subject: [PATCH 057/172] don't remove settings() methods if settings() is present in code (fixes #4703) --- java/src/processing/mode/java/JavaBuild.java | 33 +-- .../mode/java/preproc/PdePreprocessor.java | 189 +++++++----------- todo.txt | 4 +- 3 files changed, 78 insertions(+), 148 deletions(-) diff --git a/java/src/processing/mode/java/JavaBuild.java b/java/src/processing/mode/java/JavaBuild.java index 0022fe2220..034c5b0341 100644 --- a/java/src/processing/mode/java/JavaBuild.java +++ b/java/src/processing/mode/java/JavaBuild.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org -Copyright (c) 2012-16 The Processing Foundation +Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology @@ -58,8 +58,6 @@ import processing.mode.java.preproc.PreprocessorResult; import processing.mode.java.preproc.SurfaceInfo; -// Would you believe there's a java.lang.Compiler class? I wouldn't. - public class JavaBuild { public static final String PACKAGE_REGEX = @@ -224,10 +222,11 @@ public String preprocess(File srcFolder, // Remove the entries being moved to settings(). They will be re-inserted // by writeFooter() when it emits the settings() method. - if (sizeInfo != null && sizeInfo.hasSettings()) { -// String sizeStatement = sizeInfo.getStatement(); + // If the user already has a settings() method, don't mess with anything. + // https://github.com/processing/processing/issues/4703 + if (!PdePreprocessor.hasSettingsMethod(bigCode.toString()) && + sizeInfo != null && sizeInfo.hasSettings()) { for (String stmt : sizeInfo.getStatements()) { - //System.out.format("size stmt is '%s'%n", sizeStatement); // Don't remove newlines (and while you're at it, just keep spaces) // https://github.com/processing/processing/issues/3654 stmt = stmt.trim(); @@ -267,19 +266,10 @@ public String preprocess(File srcFolder, // then search through for anyone else whose preprocName is null, // since they've also been combined into the main pde. int errorFile = findErrorFile(errorLine); -// System.out.println("error line is " + errorLine + ", file is " + errorFile); errorLine -= sketch.getCode(errorFile).getPreprocOffset(); -// System.out.println(" preproc offset for that file: " + sketch.getCode(errorFile).getPreprocOffset()); - -// System.out.println("i found this guy snooping around.."); -// System.out.println("whatcha want me to do with 'im boss?"); -// System.out.println(errorLine + " " + errorFile + " " + code[errorFile].getPreprocOffset()); String msg = re.getMessage(); - //System.out.println(java.getAbsolutePath()); -// System.out.println(bigCode); - if (msg.contains("expecting RCURLY") || msg.contains("expecting LCURLY")) { for (int i = 0; i < sketch.getCodeCount(); i++) { SketchCode sc = sketch.getCode(i); @@ -294,8 +284,8 @@ public String preprocess(File srcFolder, // the result of PApplet.match(msg, "found ('.*')") on missing // LCURLY. throw new SketchException(braceTest[0] > 0 - ? "Found one too many { characters without a } to match it." - : "Found one too many } characters without a { to match it.", + ? "Found an extra { character without a } to match it." + : "Found an extra } character without a { to match it.", i, braceTest[1], braceTest[2], false); } } @@ -413,26 +403,19 @@ public String preprocess(File srcFolder, javaLibraryPath += File.pathSeparator + core.getNativePath(); } -// System.out.println("extra imports: " + result.extraImports); for (String item : result.extraImports) { -// System.out.println("item = '" + item + "'"); // remove things up to the last dot int dot = item.lastIndexOf('.'); // http://dev.processing.org/bugs/show_bug.cgi?id=1145 String entry = (dot == -1) ? item : item.substring(0, dot); -// System.out.print(entry + " => "); if (item.startsWith("static ")) { // import static - https://github.com/processing/processing/issues/8 - // Remove more stuff. int dot2 = item.lastIndexOf('.'); entry = entry.substring(7, (dot2 == -1) ? entry.length() : dot2); -// System.out.println(entry); } -// System.out.println("library searching for " + entry); Library library = mode.getLibrary(entry); -// System.out.println(" found " + library); if (library != null) { if (!importedLibraries.contains(library)) { @@ -461,7 +444,6 @@ public String preprocess(File srcFolder, } } } -// PApplet.println(PApplet.split(libraryPath, File.pathSeparatorChar)); // Finally, add the regular Java CLASSPATH. This contains everything // imported by the PDE itself (core.jar, pde.jar, quaqua.jar) which may @@ -533,6 +515,7 @@ public String preprocess(File srcFolder, return result.className; } + /** * Returns true if this package isn't part of a library (it's a system import * or something like that). Don't bother complaining about java.* or javax.* diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java index f22de1387c..a6aeb746a4 100644 --- a/java/src/processing/mode/java/preproc/PdePreprocessor.java +++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java @@ -4,7 +4,8 @@ PdePreprocessor - wrapper for default ANTLR-generated parser Part of the Processing project - http://processing.org - Copyright (c) 2004-15 Ben Fry and Casey Reas + Copyright (c) 2012-19 The Processing Foundation + Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology ANTLR-generated parser and several supporting classes written @@ -153,6 +154,7 @@ public enum Mode { Set foundMethods; SurfaceInfo sizeInfo; + boolean settingsMethod; /** @@ -175,6 +177,8 @@ public enum Mode { static private final Pattern VOID_SETUP_REGEX = Pattern.compile("(?:^|\\s|;)void\\s+setup\\s*\\(", Pattern.MULTILINE); + static private final Pattern VOID_SETTINGS_REGEX = + Pattern.compile("(?:^|\\s|;)void\\s+settings\\s*\\(", Pattern.MULTILINE); // Can't only match any 'public class', needs to be a PApplet // http://code.google.com/p/processing/issues/detail?id=551 @@ -206,8 +210,7 @@ public PdePreprocessor(final String sketchName, final int tabSize) { public SurfaceInfo initSketchSize(String code, boolean sizeWarning) throws SketchException { - sizeInfo = parseSketchSize(code, sizeWarning); - return sizeInfo; + return parseSketchSize(code, sizeWarning); } @@ -251,6 +254,13 @@ static private StringList breakCommas(String contents) { } + // if there's a settings() method, we do less moving things around + static public boolean hasSettingsMethod(String code) { + final String uncommented = scrubComments(code); + return findInCurrentScope(VOID_SETTINGS_REGEX, uncommented) != null; + } + + /** * Parse a chunk of code and extract the size() command and its contents. * Also goes after fullScreen(), smooth(), and noSmooth(). @@ -259,26 +269,21 @@ static private StringList breakCommas(String contents) { * @return null if there was an error, otherwise an array (might contain some/all nulls) */ static public SurfaceInfo parseSketchSize(String code, - boolean fussy) throws SketchException { + boolean fussy) throws SketchException { // This matches against any uses of the size() function, whether numbers // or variables or whatever. This way, no warning is shown if size() isn't // actually used in the applet, which is the case especially for anyone // who is cutting/pasting from the reference. -// String scrubbed = scrubComments(sketch.getCode(0).getProgram()); -// String[] matches = PApplet.match(scrubbed, SIZE_REGEX); -// String[] matches = PApplet.match(scrubComments(code), SIZE_REGEX); - - /* - 1. no size() or fullScreen() method at all - will use the non-overridden settings() method in PApplet - 2. size() or fullScreen() found inside setup() (static mode sketch or otherwise) - make sure that it uses numbers (or displayWidth/Height), copy into settings - 3. size() or fullScreen() already in settings() - don't mess with the sketch, don't insert any defaults + // 1. no size() or fullScreen() method at all + // will use the non-overridden settings() method in PApplet + // 2. size() or fullScreen() found inside setup() (static mode sketch or otherwise) + // make sure that it uses numbers (or displayWidth/Height), copy into settings + // 3. size() or fullScreen() already in settings() + // don't mess with the sketch, don't insert any defaults + // + // really only need to deal with situation #2.. nothing to be done for 1 and 3 - really only need to deal with situation #2.. nothing to be done for 1 and 3 - */ // if static mode sketch, all we need is regex // easy proxy for static in this case is whether [^\s]void\s is present @@ -288,33 +293,30 @@ make sure that it uses numbers (or displayWidth/Height), copy into settings String searchArea = null; - switch (mode) { - case JAVA: - // it's up to the user - searchArea = null; - break; - case ACTIVE: - // active mode, limit scope to setup - - // Find setup() in global scope - MatchResult setupMatch = findInCurrentScope(VOID_SETUP_REGEX, uncommented); - if (setupMatch != null) { - int start = uncommented.indexOf("{", setupMatch.end()); - if (start >= 0) { - // Find a closing brace - MatchResult match = findInCurrentScope(CLOSING_BRACE, uncommented, start); - if (match != null) { - searchArea = uncommented.substring(start + 1, match.end() - 1); - } else { - throw new SketchException("Found a { that's missing a matching }", false); - } + if (mode == Mode.JAVA) { + // it's up to the user + searchArea = null; + + } else if (mode == Mode.ACTIVE) { + // active mode, limit scope to setup + + // Find setup() in global scope + MatchResult setupMatch = findInCurrentScope(VOID_SETUP_REGEX, uncommented); + if (setupMatch != null) { + int start = uncommented.indexOf("{", setupMatch.end()); + if (start >= 0) { + // Find a closing brace + MatchResult match = findInCurrentScope(CLOSING_BRACE, uncommented, start); + if (match != null) { + searchArea = uncommented.substring(start + 1, match.end() - 1); + } else { + throw new SketchException("Found a { that's missing a matching }", false); } } - break; - case STATIC: - // static mode, look everywhere - searchArea = uncommented; - break; + } + } else if (mode == Mode.STATIC) { + // static mode, look everywhere + searchArea = uncommented; } if (searchArea == null) { @@ -761,23 +763,12 @@ public boolean hasMethod(String methodName) { } -// public void setFoundMain(boolean foundMain) { -// this.foundMain = foundMain; -// } - - -// public boolean getFoundMain() { -// return foundMain; -// } - - public void setAdvClassName(final String advClassName) { this.advClassName = advClassName; } public void setMode(final Mode mode) { - //System.err.println("Setting mode to " + mode); this.mode = mode; } @@ -897,7 +888,7 @@ private static void checkForUnterminatedMultilineComment(final String program) } - public PreprocessorResult write(final Writer out, String program) + public PreprocessorResult write(final Writer out, final String program) throws SketchException, RecognitionException, TokenStreamException { return write(out, program, null); } @@ -941,10 +932,8 @@ public PreprocessorResult write(Writer out, String program, m = importPattern.matcher(scrubbed); found = m.find(offset); if (found) { -// System.out.println("found " + m.groupCount() + " groups"); String before = m.group(1); String piece = m.group(2) + m.group(3) + m.group(4); -// int len = piece.length(); // how much to trim out if (!ignoreImport(m.group(3))) { programImports.add(m.group(3)); // the package name @@ -953,9 +942,6 @@ public PreprocessorResult write(Writer out, String program, // find index of this import in the program int start = m.start() + before.length(); int stop = start + piece.length(); -// System.out.println(start + " " + stop + " " + piece); - //System.out.println("found " + m.group(3)); -// System.out.println("removing '" + program.substring(start, stop) + "'"); // Remove the import from the main program program = program.substring(0, start) + program.substring(stop); @@ -965,8 +951,6 @@ public PreprocessorResult write(Writer out, String program, offset = m.start(); } } while (found); -// System.out.println("program now:"); -// System.out.println(program); if (codeFolderPackages != null) { for (String item : codeFolderPackages) { @@ -994,35 +978,32 @@ private String write(final String program, final PrintWriter stream) String uncomment = scrubComments(program); PdeRecognizer parser = createParser(program); Mode mode = parseMode(uncomment); - switch (mode) { - case JAVA: + + if (mode == Mode.JAVA) { + try { + final PrintStream saved = System.err; try { - final PrintStream saved = System.err; - try { - // throw away stderr for this tentative parse - System.setErr(new PrintStream(new ByteArrayOutputStream())); - parser.javaProgram(); - } finally { - System.setErr(saved); - } - setMode(Mode.JAVA); - } catch (Exception e) { - // I can't figure out any other way of resetting the parser. - parser = createParser(program); - parser.pdeProgram(); + // throw away stderr for this tentative parse + System.setErr(new PrintStream(new ByteArrayOutputStream())); + parser.javaProgram(); + } finally { + System.setErr(saved); } - break; - case ACTIVE: - setMode(Mode.ACTIVE); - parser.activeProgram(); - break; - case STATIC: + setMode(Mode.JAVA); + } catch (Exception e) { + // I can't figure out any other way of resetting the parser. + parser = createParser(program); parser.pdeProgram(); - break; + } + } else if (mode == Mode.ACTIVE) { + setMode(Mode.ACTIVE); + parser.activeProgram(); + + } else if (mode == Mode.STATIC) { + parser.pdeProgram(); } // set up the AST for traversal by PdeEmitter - // ASTFactory factory = new ASTFactory(); AST parserAST = parser.getAST(); AST rootNode = factory.create(ROOT_ID, "AST ROOT"); @@ -1031,7 +1012,6 @@ private String write(final String program, final PrintWriter stream) makeSimpleMethodsPublic(rootNode); // unclear if this actually works, but it's worth a shot - // //((CommonAST)parserAST).setVerboseStringConversion( // true, parser.getTokenNames()); // (made to use the static version because of jikes 1.22 warning) @@ -1039,7 +1019,7 @@ private String write(final String program, final PrintWriter stream) final String className; if (mode == Mode.JAVA) { - // if this is an advanced program, the classname is already defined. + // in this mode, the class name is already defined. className = getFirstClassName(parserAST); } else { className = this.name; @@ -1047,7 +1027,6 @@ private String write(final String program, final PrintWriter stream) // if 'null' was passed in for the name, but this isn't // a 'java' mode class, then there's a problem, so punt. - // if (className == null) return null; @@ -1249,41 +1228,14 @@ protected void writeFooter(PrintWriter out, String className) { } if ((mode == Mode.STATIC) || (mode == Mode.ACTIVE)) { - // doesn't remove the original size() method, but calling size() - // again in setup() is harmless. + // doesn't remove the original size() method, + // but calling size() again in setup() is harmless. if (!hasMethod("settings") && sizeInfo.hasSettings()) { out.println(indent + "public void settings() { " + sizeInfo.getSettings() + " }"); -// out.println(indent + "public void settings() {"); -// out.println(indent + indent + sizeStatement); -// out.println(indent + "}"); - } - /* - if (sketchWidth != null && !hasMethod("sketchWidth")) { - // Only include if it's a number (a variable will be a problem) - if (PApplet.parseInt(sketchWidth, -1) != -1 || sketchWidth.equals("displayWidth")) { - out.println(indent + "public int sketchWidth() { return " + sketchWidth + "; }"); - } - } - if (sketchHeight != null && !hasMethod("sketchHeight")) { - // Only include if it's a number - if (PApplet.parseInt(sketchHeight, -1) != -1 || sketchHeight.equals("displayHeight")) { - out.println(indent + "public int sketchHeight() { return " + sketchHeight + "; }"); - } - } - if (sketchRenderer != null && !hasMethod("sketchRenderer")) { - // Only include if it's a known renderer (otherwise it might be a variable) - //if (PConstants.rendererList.hasValue(sketchRenderer)) { - out.println(indent + "public String sketchRenderer() { return " + sketchRenderer + "; }"); - //} - } - if (sketchOutputPath != null && !hasMethod("sketchOutputPath")) { - out.println(indent + "public String sketchOutputPath() { return " + sketchOutputPath + "; }"); } - */ if (!hasMethod("main")) { out.println(indent + "static public void main(String[] passedArgs) {"); - //out.print(indent + indent + "PApplet.main(new String[] { "); out.print(indent + indent + "String[] appletArgs = new String[] { "); if (Preferences.getBoolean("export.application.present")) { @@ -1298,11 +1250,6 @@ protected void writeFooter(PrintWriter out, String className) { } else { out.print("\"" + PApplet.ARGS_HIDE_STOP + "\", "); } -// } else { -// // This is set initially based on the system control color, just -// // sets the color for what goes behind the sketch before it's added. -// String farbe = Preferences.get("run.window.bgcolor"); -// out.print("\"" + PApplet.ARGS_BGCOLOR + "=" + farbe + "\", "); } out.println("\"" + className + "\" };"); diff --git a/todo.txt b/todo.txt index 8ec6eb00a0..af19b50213 100755 --- a/todo.txt +++ b/todo.txt @@ -23,6 +23,8 @@ X https://github.com/processing/processing/wiki/Localization#shortcuts-and-key o Determine new keyboard shortcut for Step Out X https://github.com/processing/processing/issues/3538 X all set based on #2199 +X settings() present and pixelDensity() is in setup(), nothing set/no error +X https://github.com/processing/processing/issues/4703 cleaning X Could not initialize class com.sun.jna.Native on startup (Windows) @@ -77,8 +79,6 @@ _ https://github.com/processing/processing/pull/5642 high-ish -_ settings() present and pixelDensity() is in setup(), nothing set/no error -_ https://github.com/processing/processing/issues/4703 _ errors inside setup() aren't coming through at all? _ seen in Eclipse; have to turn on the debugger... same as #4703? _ Welcome screen doesn't size properly for HiDPI screens From 2083040313570fd9005c43799d96e04c6ec32b7a Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 08:45:44 -0800 Subject: [PATCH 058/172] update with notes about policy on locking issues --- README.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9302220f92..91a56142b9 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,34 @@ Processing ========== -This is the official source code for the [Processing](http://processing.org) Development Environment (PDE), +This is the official source code for the [Processing](http://processing.org) Development Environment (PDE), the “core” and the libraries that are included with the [download](http://processing.org/download). -__I've found a bug!__ -Let us know [here](https://github.com/processing/processing/issues) (after first checking if someone has already posted a similar problem). -If it's a documentation, web site, or examples problem, take that up with folks [here](https://github.com/processing/processing-docs/issues). -There are also separate locations for [Android Mode](https://github.com/processing/processing-android/issues), or the [Video](https://github.com/processing/processing-video/issues) and [Sound](https://github.com/processing/processing-sound/issues) libraries. +__I've found a bug!__ +Let us know [here](https://github.com/processing/processing/issues) (after first checking if someone has already posted a similar problem). +If it's a reference, web site, or examples issue, take that up with folks [here](https://github.com/processing/processing-docs/issues). +There are also separate locations for [Android Mode](https://github.com/processing/processing-android/issues), or the [Video](https://github.com/processing/processing-video/issues) and [Sound](https://github.com/processing/processing-sound/issues) libraries. The [processing.js](http://processingjs.org) project is not affiliated with us, but you can find their issue tracker [here](https://github.com/processing-js/processing-js/issues). -__That [processing-bugs](https://github.com/processing-bugs) fella is a damn liar.__ -The issues list has been imported from Google Code, so there are many spurious references -amongst them since the numbering changed. Basically, any time you see references to +__Locked Issues__ +Where possible, I've started locking issues once resolved. This helps reduce the amount of noise from folks adding to an issue that's been closed for years. Because this project has existed for a long time and we have thousands of closed issues, lots of them may sound similar to an issue you're having. But if there's a new problem, it'll be missed if it's lost in a comment added to an already closed issue. I don't like to lock issues because it cuts off conversation, but it's better than legitimate problems being missed. + +__That [processing-bugs](https://github.com/processing-bugs) fella is suspicious.__ +The issues list has been imported from Google Code, so there are many spurious references +amongst them since the numbering changed. Basically, any time you see references to changes made by [processing-bugs](https://github.com/processing-bugs), it may be somewhat suspect. Over time this will clean itself up as bugs are fixed and new issues are added from within Github. Help speed this process along by helping us! __Please help.__ -The instructions for building the source [are here](https://github.com/processing/processing/wiki/Build-Instructions). -Please help us fix problems, and if you're submitting code, following the [style guidelines](https://github.com/processing/processing/wiki/Style-Guidelines) helps save us a lot of time. +The instructions for building the source [are here](https://github.com/processing/processing/wiki/Build-Instructions). +Please help us fix problems, and if you're submitting code, following the [style guidelines](https://github.com/processing/processing/wiki/Style-Guidelines) helps save me a lot of time. __And finally...__ Someday we'll also fix all these bugs, throw together hundreds of unit tests, and get rich off all this stuff that we're giving away for free. But not today. -So in the meantime, I ask for your patience, -[participation](https://github.com/processing/processing/wiki/Project-List), +So in the meantime, I ask for your patience, +[participation](https://github.com/processing/processing/wiki/Project-List), and [patches](https://github.com/processing/processing/pulls). -Ben Fry, 6 August 2015 +Ben Fry, 20 January 2019 From 11b1b23e5c4443f0da1fe21a5e744ca1fafcbdab Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 09:52:29 -0800 Subject: [PATCH 059/172] normalize the behavior of remove() in the Dict classes --- core/src/processing/data/DoubleDict.java | 18 ++++++++++-------- core/src/processing/data/FloatDict.java | 18 ++++++++++-------- core/src/processing/data/IntDict.java | 16 +++++++++------- core/src/processing/data/LongDict.java | 18 ++++++++++-------- core/src/processing/data/StringDict.java | 19 +++++++++++-------- 5 files changed, 50 insertions(+), 39 deletions(-) diff --git a/core/src/processing/data/DoubleDict.java b/core/src/processing/data/DoubleDict.java index e310b079e3..f2a9adf10f 100644 --- a/core/src/processing/data/DoubleDict.java +++ b/core/src/processing/data/DoubleDict.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.NoSuchElementException; import processing.core.PApplet; @@ -610,21 +611,22 @@ protected void create(String what, double much) { * @webref doubledict:method * @brief Remove a key/value pair */ - public int remove(String key) { + public double remove(String key) { int index = index(key); - if (index != -1) { - removeIndex(index); + if (index == -1) { + throw new NoSuchElementException("'" + key + "' not found"); } - return index; + double value = values[index]; + removeIndex(index); + return value; } - public String removeIndex(int index) { + public double removeIndex(int index) { if (index < 0 || index >= count) { throw new ArrayIndexOutOfBoundsException(index); } - String key = keys[index]; - //System.out.println("index is " + which + " and " + keys[which]); + double value = values[index]; indices.remove(keys[index]); for (int i = index; i < count-1; i++) { keys[i] = keys[i+1]; @@ -634,7 +636,7 @@ public String removeIndex(int index) { count--; keys[count] = null; values[count] = 0; - return key; + return value; } diff --git a/core/src/processing/data/FloatDict.java b/core/src/processing/data/FloatDict.java index 2df14600cb..9495563ad0 100644 --- a/core/src/processing/data/FloatDict.java +++ b/core/src/processing/data/FloatDict.java @@ -3,6 +3,7 @@ import java.io.*; import java.util.HashMap; import java.util.Iterator; +import java.util.NoSuchElementException; import processing.core.PApplet; @@ -607,21 +608,22 @@ protected void create(String what, float much) { * @webref floatdict:method * @brief Remove a key/value pair */ - public int remove(String key) { + public float remove(String key) { int index = index(key); - if (index != -1) { - removeIndex(index); + if (index == -1) { + throw new NoSuchElementException("'" + key + "' not found"); } - return index; + float value = values[index]; + removeIndex(index); + return value; } - public String removeIndex(int index) { + public float removeIndex(int index) { if (index < 0 || index >= count) { throw new ArrayIndexOutOfBoundsException(index); } - String key = keys[index]; - //System.out.println("index is " + which + " and " + keys[which]); + float value = values[index]; indices.remove(keys[index]); for (int i = index; i < count-1; i++) { keys[i] = keys[i+1]; @@ -631,7 +633,7 @@ public String removeIndex(int index) { count--; keys[count] = null; values[count] = 0; - return key; + return value; } diff --git a/core/src/processing/data/IntDict.java b/core/src/processing/data/IntDict.java index 7acfd54b68..96913591fa 100644 --- a/core/src/processing/data/IntDict.java +++ b/core/src/processing/data/IntDict.java @@ -3,6 +3,7 @@ import java.io.*; import java.util.HashMap; import java.util.Iterator; +import java.util.NoSuchElementException; import processing.core.PApplet; @@ -593,19 +594,20 @@ protected void create(String what, int much) { */ public int remove(String key) { int index = index(key); - if (index != -1) { - removeIndex(index); + if (index == -1) { + throw new NoSuchElementException("'" + key + "' not found"); } - return index; + int value = values[index]; + removeIndex(index); + return value; } - public String removeIndex(int index) { + public int removeIndex(int index) { if (index < 0 || index >= count) { throw new ArrayIndexOutOfBoundsException(index); } - //System.out.println("index is " + which + " and " + keys[which]); - String key = keys[index]; + int value = values[index]; indices.remove(keys[index]); for (int i = index; i < count-1; i++) { keys[i] = keys[i+1]; @@ -615,7 +617,7 @@ public String removeIndex(int index) { count--; keys[count] = null; values[count] = 0; - return key; + return value; } diff --git a/core/src/processing/data/LongDict.java b/core/src/processing/data/LongDict.java index 18ecac7033..5292468625 100644 --- a/core/src/processing/data/LongDict.java +++ b/core/src/processing/data/LongDict.java @@ -3,6 +3,7 @@ import java.io.*; import java.util.HashMap; import java.util.Iterator; +import java.util.NoSuchElementException; import processing.core.PApplet; @@ -580,21 +581,22 @@ protected void create(String what, long much) { * @webref intdict:method * @brief Remove a key/value pair */ - public int remove(String key) { + public long remove(String key) { int index = index(key); - if (index != -1) { - removeIndex(index); + if (index == -1) { + throw new NoSuchElementException("'" + key + "' not found"); } - return index; + long value = values[index]; + removeIndex(index); + return value; } - public String removeIndex(int index) { + public long removeIndex(int index) { if (index < 0 || index >= count) { throw new ArrayIndexOutOfBoundsException(index); } - //System.out.println("index is " + which + " and " + keys[which]); - String key = keys[index]; + long value = values[index]; indices.remove(keys[index]); for (int i = index; i < count-1; i++) { keys[i] = keys[i+1]; @@ -604,7 +606,7 @@ public String removeIndex(int index) { count--; keys[count] = null; values[count] = 0; - return key; + return value; } diff --git a/core/src/processing/data/StringDict.java b/core/src/processing/data/StringDict.java index 012e266d22..c66a61e4df 100644 --- a/core/src/processing/data/StringDict.java +++ b/core/src/processing/data/StringDict.java @@ -3,6 +3,7 @@ import java.io.*; import java.util.HashMap; import java.util.Iterator; +import java.util.NoSuchElementException; import processing.core.PApplet; @@ -433,12 +434,14 @@ protected void create(String key, String value) { * @webref stringdict:method * @brief Remove a key/value pair */ - public int remove(String key) { + public String remove(String key) { int index = index(key); - if (index != -1) { - removeIndex(index); + if (index == -1) { + throw new NoSuchElementException("'" + key + "' not found"); } - return index; + String value = values[index]; + removeIndex(index); + return value; } @@ -446,9 +449,8 @@ public String removeIndex(int index) { if (index < 0 || index >= count) { throw new ArrayIndexOutOfBoundsException(index); } - //System.out.println("index is " + which + " and " + keys[which]); - String key = keys[index]; - indices.remove(key); + String value = values[index]; + indices.remove(keys[index]); for (int i = index; i < count-1; i++) { keys[i] = keys[i+1]; values[i] = values[i+1]; @@ -457,10 +459,11 @@ public String removeIndex(int index) { count--; keys[count] = null; values[count] = null; - return key; + return value; } + public void swap(int a, int b) { String tkey = keys[a]; String tvalue = values[a]; From 15418d07d9db6a6160b3991d4fb3c4cce1d53e68 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 09:52:40 -0800 Subject: [PATCH 060/172] major cleanup of the todo.txt file for core --- core/todo.txt | 348 +++++++++++++++++++++++--------------------------- 1 file changed, 161 insertions(+), 187 deletions(-) diff --git a/core/todo.txt b/core/todo.txt index 2a85b79e4b..770993c34b 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,16 +1,29 @@ 0266 (3.5) -X make JSONObject.quote() (both versions) public X fix javaPlatform variable for newer JDK versions X https://github.com/processing/processing/pull/5626 o many fonts installed causes slow startup on macos o run that on a thread, and make sure default font doesn't need the list loaded X can't be done, notes in the code for PFont.loadFonts() -X greatly improve startup time when user-specified fonts are not used +X improve startup time when user-specified fonts are not used X default font will be faster, using ttf/otf is fine X only createFont("The Font Name") is still slow on macOS X and PFont.list() +o check again whether element 0,0 in a Table is working +X https://github.com/processing/processing/issues/3011 +X was already checked, made a note and locked the issue + +api changes +X Dict.remove() should return value, not index (for consistency w/ others) +X returns the value removed, not the key, just like remove(key) +X rationale being that if you know the index, you probably know the key +X if unavailable, throw an exception; otherwise no consistent way to indicate error X add circle() and square() X add push() and pop() +X make JSONObject.quote() (both versions) public +X should DoubleDict create from Iterable or Map<>? +o (Map is more efficient b/c of size, Iterable more useful) +X Iterable of what, though? Map.Entry? +X sticking with just the Map<> version for now contrib o make tabs into spaces, fixes pixelDensity(2) issue with tabs @@ -62,41 +75,37 @@ cleaning o WARNING: GL pipe is running in software mode (Renderer ID=0x1020400) o is this coming from us? if so, need to provide actions X haven't seen for a while, maybe fixed +X figure our size(img.width, img.height) situation +X just make loadImage() work in settings +X update the wiki and reference +o update wiki/docs to say "don't override sketchXxxx() methods" +o size() command not working to do a resize +X need a programmatic way to set size +o check on performance of the new EDT setup +X present mode is 30-40% slower than windowed +X w/ this example: https://github.com/processing/processing/issues/2423 high-ish +_ add separator option to loadTable() +_ https://github.com/processing/processing/issues/5068 _ make setting the window icon automatic, based on files in local dirs X https://github.com/processing/processing/issues/5123 X https://github.com/processing/processing/pull/5202 _ need to make this work behind the scenes instead _ create icon.png or have an 'icons' folder with multiple sizes +_ don't override the window icon w/ p5 logo if already set _ NullPointerException at java.awt.Window.init(Window.java:497) when using Airplay _ https://github.com/processing/processing/issues/5620 _ try to catch the NPE and warn the user about what's happening - -data -_ Dict.remove() should return value, not index (for consistency w/ others) -_ check again whether element 0,0 in a Table is working -_ https://github.com/processing/processing/issues/3011 -_ should DoubleDict create from Iterable or Map<>? -_ (Map is more efficient b/c of size, Iterable more useful) - - _ requestSize() and xxxxTitle() (to diminish use of 'surface') +_ mostly held up by cross-renderer inconsistency with these +_ textAlign(CENTER) and pixelDensity(2) aligning incorrectly with Java2D +_ https://github.com/processing/processing/issues/4020 +_ calling textSize() fixes it, only hpapens with the default font -_ Implement blendMode() for PDF -_ https://github.com/processing/processing/issues/5438 - -_ many shift- keys not working properly in FX2D (added a test sketch) -_ https://github.com/processing/processing/issues/5317 - -_ Switch to getModifiersEx() and fix the AWT modifiers used in PSurfaceAWT -_ this is an easy fix, but need to check impact elsewhere -_ does anything else rely on these modifiers? - -_ add separator option to loadTable() -_ https://github.com/processing/processing/issues/5068 +retina/hi-dpi/sizing _ implement sketch scaling into PApplet _ https://github.com/processing/processing/issues/4897 _ Sketches on Windows don't take UI sizing into account @@ -104,46 +113,23 @@ _ https://github.com/processing/processing/issues/4894 _ Sketches on Linux don't take UI scaling into account _ https://github.com/processing/processing/issues/4895 _ gohai says "xrdb -query" or "xdpyinfo" might work - -_ TRIANGLE_STRIP not working correctly with createShape() and default renderer -_ https://github.com/processing/processing/issues/4678 - -_ should we drop the 'default' prefix from the ex handler so it's not static? -_ http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html - -_ option to disable OpenGL ES on Linux? -_ https://github.com/processing/processing/issues/4584 - -_ textAlign(CENTER) and pixelDensity(2) aligning incorrectly with Java2D -_ https://github.com/processing/processing/issues/4020 -_ calling textSize() fixes it, only hpapens with the default font - _ should fullScreen() set width and height to displayWidth/Height _ or is that being set/unset used for any state info? -_ when calling exit(), if sketch has halted w/ exception, force the quit -_ otherwise have to double-quit with cmd-q on OS X -_ simple test case: using size() inside setup() from Eclipse - - -discussion -_ how to handle the touch api -_ figure our size(img.width, img.height) situation -X just make loadImage() work in settings -_ update the wiki and reference -_ size() function that scales to screen, keeps aspect, re-scales mouse coords - - -known -_ window must close when using file dialogs with OpenGL on Windows -_ https://github.com/processing/processing/issues/3831 -_ window loses focus after maximizing -_ https://github.com/processing/processing/issues/3339 +_ present window draws in stages (OS X) +_ crash on startup when "Mirror Displays" selected (cantfix?) +_ suspect that this is a specific chipset since Oracle didn't reproduce +_ AMD Radeon HD 6770M was in the Oracle bug report +_ https://github.com/processing/processing/issues/2186 +_ https://bugs.openjdk.java.net/browse/JDK-8027391 +_ test with JG's 13" retina laptop misc -_ move blending calculations from PImage into PGraphics -_ tricky because that means moving blend_resize() as well -_ and should that live in PGraphics or be its own class or ?? +_ should we drop the 'default' prefix from the ex handler so it's not static? +_ http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html +_ Switch to getModifiersEx() and fix the AWT modifiers used in PSurfaceAWT +_ this is an easy fix, but need to check impact elsewhere +_ does anything else rely on these modifiers? _ try using Frame instead of JFrame _ default sketch location using insets incorrectly _ use the BufferStrategy directly from the Frame object? @@ -152,94 +138,12 @@ _ sketch placement (window insets) not properly set on Linux _ https://github.com/processing/processing/issues/2063 _ note in docs that full screen and present are now different _ on Export to Application, this has an impact -_ update wiki/docs to say "don't override sketchXxxx() methods" _ SVG only exports last frame _ possibly because Java2D is disposing the Graphics2D in between? _ https://github.com/processing/processing/issues/3753 - - -javafx -_ Fix Java 11 incompatibilities inside PSurfaceFX -_ https://github.com/processing/processing/issues/5286 -_ Hitting ESC in FX2D app on macOS throws IllegalStateException -_ https://github.com/processing/processing/issues/5249 -_ wrong window size with fullScreen() -_ https://github.com/processing/processing/issues/4737 -_ menu bar not hiding properly in exported applications with FX2D -_ https://github.com/processing/processing/issues/4527 -_ hideMenuBar() called from setup() works fine -_ just call it around setup time? -_ the --hide-stop option not working (FX only? traces?) -_ make wiki about quirks -_ starving the thread makes things really slow down -_ keyPressed() is always uppercase, keyTyped() will be correct -_ do we really need setTextFont/Size when we already have Impl? -_ need keyPressed() to do lower and upper case -_ static mode sketches (draw once and halt w/o closing window) -_ fix display handling, line up the device order with AWT -_ https://docs.oracle.com/javafx/2/api/javafx/stage/Screen.html -_ noLoop() -_ present mode not working at all -_ stage in the center, clear the rest of the screen -_ createGraphics() should probably create PGraphicsJava2D -_ or is Canvas specific to the PGraphics, and we get another Context2D? -_ http://docs.oracle.com/javafx/2/api/javafx/scene/canvas/Canvas.html -_ loadPixels() (also 2x) -_ text and fonts? -_ maybe helpful: https://wiki.openjdk.java.net/display/OpenJFX/Font+Setup -_ updatePixels() -_ save() and saveFrame() -_ get() and set() -_ clip/noClip -_ https://github.com/processing/processing/issues/3274 -_ getNative() in PImage problematic because it gives back a BufferedImage -_ move loadImage() into PGraphics, with AWT version the default -_ or pass createImage() through to renderer? -_ implement external messages (moving the window) -_ implement PSurfaceFX.setIcon() -_ javafx not supported with ARM (so we're screwed on raspberry pi) -_ https://www.linkedin.com/pulse/oracle-just-removed-javafx-support-arm-jan-snelders - - -opengl questions -_ exitCalled() and exitActual made public by Andres, breaks Python -_ also not API we want to expose, so sort this out -_ or maybe we're fine b/c now FX2D needs it as well -_ when did setPath() sneak into PShape? API is nothing like anything else -_ probably from the material stuff, but we need to fix that -_ why is createShape() implemented 4x (for P2D, P3D, and 2x versions)? -_ shouldn't be static, run it from the renderer, that's point of createXxx() -_ public createShape() method that takes another shape as param? -_ should just be the constructor doing this, or copy() - - -full screen -_ present window draws in stages (OS X) -_ crash on startup when "Mirror Displays" selected (cantfix?) -_ suspect that this is a specific chipset since Oracle didn't reproduce -_ AMD Radeon HD 6770M was in the Oracle bug report -_ https://github.com/processing/processing/issues/2186 -_ https://bugs.openjdk.java.net/browse/JDK-8027391 -_ test with JG's 13" retina laptop - - -graphics -_ need to be able to call pixelDensity(2) before beginDraw() -_ add pixelDensity() method to PImage/PGraphics -_ pixelDensity(2) does: pixelWidth = width; width /= 2; pixelDensity = 2; -_ this works for both PGraphics and images (though they're a little backwards) -_ for PGraphics it comes early enough -_ should the re-alloc of the drawing surface happen in beginDraw() -_ that way it won't blit to the screen until we have a fresh redraw? -_ otherwise it'll also be resizing on another thread.. badness -_ how to allocation image object w/ createGraphics() (since no surface) -_ createGraphics() currently broken in Java2D -_ size() command not working to do a resize -_ need a programmatic way to set size -_ deal with applySettings() change (maybe not a problem?) -_ check on performance of the new EDT setup -_ present mode is 30-40% slower than windowed -_ w/ this example: https://github.com/processing/processing/issues/2423 +_ when calling exit(), if sketch has halted w/ exception, force the quit +_ otherwise have to double-quit with cmd-q on OS X +_ simple test case: using size() inside setup() from Eclipse data @@ -262,28 +166,16 @@ _ save the constructor for the version that actually copies data _ the table pointer version will be speedy and allow chaining -high -_ point() rendering differently in 2.0.3 and 2.1 -_ https://github.com/processing/processing/issues/2278 -_ internally, we probably have to call set() if it's a 1 pixel point -_ but that's going to be a mess.. need to first check the CTM -_ tint() not working in PDF (regression between 2.0.3 and 2.1) -_ https://github.com/processing/processing/issues/2428 -_ finish PFont.getShape() implementation -_ needs to have a way to set width/height properly -_ draw(s) doesn't work on the returned PShape -_ y-location of frame might be negative, but that might be ok -_ right now, on Windows it moves it on-screen (b/c of previous bug reports) -_ may be cause of some of the display placement issues w/ multiple displays -_ seem to recall one of the bugs mentioning stacked displays -_ need to change to iterate through display rectangles -_ may be related to full-screen bug filed recently -_ closing a sketch window manually (not hitting Stop) not killing sketch -_ at least with the Java2D renderer -_ don't override the window icon w/ p5 logo if already set - - -decisions/misc +discussion/decisions +_ how to handle the touch api +_ can't do MouseEvent et al with Android +_ http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html +_ http://www.html5rocks.com/en/mobile/touch.html +_ decision: go with what looks like javascript/ios +_ touchEvent(), gestureEvent()? +_ size() function that scales to screen, keeps aspect, re-scales mouse coords +_ add screen(PVector), model(PVector) and world(PVector)? +_ maybe screenVec()? or screenXYZ()? _ Separately, if we wanted, we could add a method that can safely do drawing calls, but that won't be any faster or make use of more processors the way that `thread()` does. _ need reference update for createShape() _ though we need to verify the behavior here @@ -307,12 +199,9 @@ _ fix the registered methods doc, stop/dispose working _ Casey needs to nudge people about libraries, so we need to fix this _ pause(), resume(), start(), stop() clarifications _ dispose/stop not great w/ libraries yet -_ PShape complete refactoring _ proper touch events _ touch event doesn't make sense for mouseMove on desktop, hover on Android _ probably go with pointer: more universal for touch/mouse -_ high-level touch events (swipe, et al) -_ if Andres is done, they go in, if not then 3.0 _ move away from loadPixels _ add options for image.save() (or saveImage?) _ add quality=[0,1] for jpeg images @@ -390,6 +279,11 @@ _ was disconnect always there? _ will need documentation _ negative indices so that we can work relative to the end in data classes? _ add requestFocus() method to PApplet (or surface?) +_ point() rendering differently in 2.0.3 and 2.1 +_ https://github.com/processing/processing/issues/2278 +_ internally, we probably have to call set() if it's a 1 pixel point +_ but that's going to be a mess.. need to first check the CTM +_ discussion from Jakub in the report @@ -464,6 +358,15 @@ _ Python Mode has a hook for when it's called CORE / PFont and text() +_ finish PFont.getShape() implementation +_ needs to have a way to set width/height properly +_ draw(s) doesn't work on the returned PShape +_ y-location of frame might be negative, but that might be ok +_ right now, on Windows it moves it on-screen (b/c of previous bug reports) +_ may be cause of some of the display placement issues w/ multiple displays +_ seem to recall one of the bugs mentioning stacked displays +_ need to change to iterate through display rectangles +_ may be related to full-screen bug filed recently _ when doing createFont, can we add it to the os fonts available? _ font rotation (native font problem?) with natives? _ https://github.com/processing/processing/issues/731 @@ -516,25 +419,39 @@ CORE / PImage _ TGA files writing strangely _ https://github.com/processing/processing/issues/2096 - _ loadPixels() implementation needs to be in PApplet, not PGraphics -_ this is a tricky thing to implement because of how OpenGL is handled - +_ this is a tricky thing to implement because of how OpenGL is handled _ loadImage() should use the faster loading methods _ hint(DISABLE_IMAGE_CACHING) _ add a note to the loadImage() reference page _ figure out why 1024x768 image takes 3.5 seconds to load _ would using a BufferedImage work better? _ is the image actually a BufferedImage so PixelGrabber is a waste? - _ deprecate the blend() function - +_ move blending calculations from PImage into PGraphics +_ tricky because that means moving blend_resize() as well +_ and should that live in PGraphics or be its own class or ?? _ implement unified means to specify smoothing level for image scaling _ https://github.com/processing/processing/issues/204 +CORE / PGraphics + +_ need to be able to call pixelDensity(2) before beginDraw() +_ add pixelDensity() method to PImage/PGraphics +_ pixelDensity(2) does: pixelWidth = width; width /= 2; pixelDensity = 2; +_ this works for both PGraphics and images (though they're a little backwards) +_ for PGraphics it comes early enough +_ should the re-alloc of the drawing surface happen in beginDraw() +_ that way it won't blit to the screen until we have a fresh redraw? +_ otherwise it'll also be resizing on another thread.. badness +_ how to allocation image object w/ createGraphics() (since no surface) + + CORE / PShape +_ TRIANGLE_STRIP not working correctly with createShape() and default renderer +_ https://github.com/processing/processing/issues/4678 _ major refactoring for PShape/PShapeOpenGL _ https://github.com/processing/processing/issues/1623 _ PShape should be cached as well @@ -563,7 +480,6 @@ _ void setParams() _ void setPath() _ colorCalc() methods added to PShape.. should just be used from PGraphics _ loadShape() needs to live in PApplet -_ make PShapeOpenGL a cache object _ don't allow things inside begin/endShape() that aren't possible _ better lockout inside beginShape() to keep other things from happening _ don't allow you to draw stroked items unless stroke() is called @@ -609,13 +525,76 @@ _ PShape getVertex() not implemented properly for SVG files _ https://github.com/processing/processing/issues/1596 -CORE / PVector +FX2D / Issues -_ add screen(PVector), model(PVector) and world(PVector)? -_ maybe screenVec()? or screenXYZ()? +_ many shift- keys not working properly in FX2D (added a test sketch) +_ https://github.com/processing/processing/issues/5317 +_ Fix Java 11 incompatibilities inside PSurfaceFX +_ https://github.com/processing/processing/issues/5286 +_ Hitting ESC in FX2D app on macOS throws IllegalStateException +_ https://github.com/processing/processing/issues/5249 +_ wrong window size with fullScreen() +_ https://github.com/processing/processing/issues/4737 +_ menu bar not hiding properly in exported applications with FX2D +_ https://github.com/processing/processing/issues/4527 +_ hideMenuBar() called from setup() works fine +_ just call it around setup time? +_ the --hide-stop option not working (FX only? traces?) +_ make wiki about quirks +_ starving the thread makes things really slow down +_ keyPressed() is always uppercase, keyTyped() will be correct +_ do we really need setTextFont/Size when we already have Impl? +_ need keyPressed() to do lower and upper case +_ static mode sketches (draw once and halt w/o closing window) +_ fix display handling, line up the device order with AWT +_ https://docs.oracle.com/javafx/2/api/javafx/stage/Screen.html +_ noLoop() +_ present mode not working at all +_ stage in the center, clear the rest of the screen +_ createGraphics() should probably create PGraphicsJava2D +_ or is Canvas specific to the PGraphics, and we get another Context2D? +_ http://docs.oracle.com/javafx/2/api/javafx/scene/canvas/Canvas.html +_ loadPixels() (also 2x) +_ text and fonts? +_ maybe helpful: https://wiki.openjdk.java.net/display/OpenJFX/Font+Setup +_ updatePixels() +_ save() and saveFrame() +_ get() and set() +_ clip/noClip +_ https://github.com/processing/processing/issues/3274 +_ getNative() in PImage problematic because it gives back a BufferedImage +_ move loadImage() into PGraphics, with AWT version the default +_ or pass createImage() through to renderer? +_ implement external messages (moving the window) +_ implement PSurfaceFX.setIcon() +_ javafx not supported with ARM (so we're screwed on raspberry pi) +_ https://www.linkedin.com/pulse/oracle-just-removed-javafx-support-arm-jan-snelders + + +OPENGL / Known Issues + +_ window must close when using file dialogs with OpenGL on Windows +_ https://github.com/processing/processing/issues/3831 +_ window loses focus after maximizing +_ https://github.com/processing/processing/issues/3339 + + +OPENGL / Questions + +_ option to disable OpenGL ES on Linux? +_ https://github.com/processing/processing/issues/4584 +_ exitCalled() and exitActual made public by Andres, breaks Python +_ also not API we want to expose, so sort this out +_ or maybe we're fine b/c now FX2D needs it as well +_ when did setPath() sneak into PShape? API is nothing like anything else +_ probably from the material stuff, but we need to fix that +_ why is createShape() implemented 4x (for P2D, P3D, and 2x versions)? +_ shouldn't be static, run it from the renderer, that's point of createXxx() +_ public createShape() method that takes another shape as param? +_ should just be the constructor doing this, or copy() -CORE / OpenGL (Andres) +OPENGL / Andres _ textureWrap(CLAMP / REPEAT) _ simple NPE in OpenGL causes really large, not useful, stack trace @@ -632,17 +611,12 @@ _ InvScreenX, Y, Z to convert screen (mouse) coordinates to model coordinates _ https://github.com/processing/processing/issues/1609 -CORE / Events - -_ touch events.. can't do MouseEvent et al with Android -_ http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html -_ http://www.html5rocks.com/en/mobile/touch.html -_ decision: go with what looks like javascript/ios -_ touchEvent(), gestureEvent()? - - LIBRARIES / PDF +_ tint() not working in PDF (regression between 2.0.3 and 2.1) +_ https://github.com/processing/processing/issues/2428 +_ Implement blendMode() for PDF +_ https://github.com/processing/processing/issues/5438 _ beginRecord() doesn't use current settings of the sketch _ sometimes reported as a bug, but probably not a good way to _ consistently carry these over From 656e00af296d811bd5986374bf2b865bdcdd31d4 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 10:09:52 -0800 Subject: [PATCH 061/172] working on release notes --- build/shared/revisions.txt | 2039 +++++++++++++++++++----------------- 1 file changed, 1092 insertions(+), 947 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index d2f999b087..dd0609f4ff 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,13 +1,158 @@ +PROCESSING 3.5 (REV 0266) - 20 January 2019 + + +[ api changes and additions ] + ++ Added circle() and square() methods. + ++ Added push() and pop() for parity with p5.js + ++ Non-US keyboards have trouble with a couple of shortcuts, + so their implementation has been moved to the language files. + Please help us update the defaults for your language. More here: + https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings + https://github.com/processing/processing/issues/2199 + https://github.com/processing/processing/issues/3538 + ++ Make JSONObject.quote() (both versions) public + ++ Change behavior of the remove() method in IntDict, FloatDict, etc. + It now returns the value removed, for consistency with the other + remove functions (and most usefulness). In some cases, was returning + the index, which isn't as useful. If remove() is called on a value that + does not exist, an runtime exception will be thrown because there's no + sensible way to indicate that nothing was removed. This is also more + consistent with removeIndex() throwing and exception when the specified + index is not available. + + +[ contributed fixes ] + ++ Extended SVG support for fonts and text + https://github.com/processing/processing/pull/4168 + ++ Updated Russian translation, now can choose Russian in preferences + https://github.com/processing/processing/pull/5619 + ++ Turkish translation updates + https://github.com/processing/processing/pull/5636 + ++ Examples dialog was causing high CPU load + https://github.com/processing/processing/issues/5246 + https://github.com/processing/processing/pull/5654 + ++ Show a warning when a font isn't what the user expected + https://github.com/processing/processing/issues/5481 + https://github.com/processing/processing/pull/5605 + ++ Add a button to hide the console + https://github.com/processing/processing/pull/5115 + ++ Fix NullPointerException in Contribution Manager when installing + https://github.com/processing/processing/issues/5524 + https://github.com/processing/processing/pull/5742 + ++ Improvements to appdata.xml for Linux + https://github.com/processing/processing/pull/5604 + ++ Fix javaPlatform variable for newer JDK versions + https://github.com/processing/processing/pull/5626 + ++ Fix blend mode not being set correctly + https://github.com/processing/processing/issues/5645 + https://github.com/processing/processing/pull/5647 + ++ Profile GL3bc is not available on X11GraphicsDevice + https://github.com/processing/processing/issues/5476 + https://github.com/processing/processing/pull/5652 + + + +[ jakub fixes ] + ++ Prevent "could not find sketch size" message from freezing the app + https://github.com/processing/processing/issues/4893 + https://github.com/processing/processing/pull/5708 + https://github.com/processing/processing/issues/5030 (duplicate) + ++ Prevent sketch exceptions from being hidden by a warning + https://github.com/processing/processing/pull/5486 + https://github.com/processing/processing/issues/5412 + ++ size(0, 0) just freezes instead of showing an error + https://github.com/processing/processing/issues/5233 (duplicate) + + +[ bug fixes and improvements ] + ++ Improve startup time when user-specified fonts are not used. + The default font will be faster, using ttf/otf is fine. + Only load font list when createFont("The Font Name") is used, + or PFont.list() is called. + ++ "Sketch disappeared" infinite pop up dialogs + https://github.com/processing/processing/pull/4808 + https://github.com/processing/processing/issues/4805 + ++ If settings() present but pixelDensity() is in setup(), no error message + https://github.com/processing/processing/issues/4703 + + +[ minor updates ] + + ++ Fix several out of date links in the Help menu + https://github.com/processing/processing/issues/5729 + ++ Update the About screen to 2019 + + +[ internal changes ] + ++ Update to Java 8u192, then to 8u202 + +andres +X silence TIS/TSM warning message with P2D/P3D/OPENGL since macOS 10.13.4 +X https://github.com/processing/processing/issues/5462 +X improve matrix performance in P2D/P3D +X https://github.com/processing/processing/issues/5685 +X Initializing textures loads the pixels array, even if not needed aferwards +X https://github.com/processing/processing/issues/5748 +X Processing 3.4 takes 60 seconds before can edit file +X https://github.com/processing/processing/issues/5707 +X skip Android's SDK folder when adding sketches +X https://github.com/processing/processing/commit/5b653263cc6151f838c11a61689d756901c11e37 +X PShape.attrib() and PShape.setAttrib() are not working +X https://github.com/processing/processing/issues/5560 + +jakub +X Fix freeze when restarting sketch with variables in size +X https://github.com/processing/processing/pull/5708 +X Make sure Ctrl+Left Mouse on MacOS is consistent +X https://github.com/processing/processing/issues/5672 +X https://github.com/processing/processing/pull/5674 +X Stop frame rate counter from exaggerating +X https://github.com/processing/processing/pull/5697 +X Fix vertex buffer initialized with wrong number of components +X https://github.com/processing/processing/pull/5698 +X Recreate FBOs when offscreen PGraphicsOpenGL is resized +X https://github.com/processing/processing/pull/5699 + + + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + PROCESSING 3.4 (REV 0265) - 26 July 2018 -Kind of a huge batch of bug fixes and updates. +Kind of a huge batch of bug fixes and updates. We've had trouble on Windows when MS Security Essentials or Windows Defender -decides to defend your machine from our software, removing files from the +decides to defend your machine from our software, removing files from the download and making Processing unusable. A few extra checks have been added so that more helpful warnings can be conveyed when this happens. -The other important fix is better handling in the Contributions Manager +The other important fix is better handling in the Contributions Manager for sites that use https. This fixes Python Mode installation, and many others that have recently started reporting "Could not find a ... in the downloaded file" when installing a Library, Mode, Tool, or Example set. @@ -18,23 +163,23 @@ plus some internal changes that have an impact on API. [ the big ones ] -+ Show alternate error message on Windows when jnidispatch.dll or core.jar ++ Show alternate error message on Windows when jnidispatch.dll or core.jar have been removed by Windows Defender or Microsoft Security Essentials. https://github.com/processing/processing/issues/5537 https://github.com/processing/processing/issues/4929 https://github.com/processing/processing/issues/5442 - This has been a huge headache for us. We've repeatedly submitted the + This has been a huge headache for us. We've repeatedly submitted the software and asked Microsoft for help, but haven't had any luck. If you run into this issue and would like to help, please submit the files to Microsoft here: https://www.microsoft.com/en-us/wdsi/filesubmission Perhaps if there are enough reports, they'll understand this is affecting - a lot of people. + a lot of people. + Contributed libraries/examples/etc that redirect to https URLs now working. https://github.com/processing/processing/issues/5554 - -[ new features ] + +[ new features ] + It's now possible to make your own theme file for Processing. Copy the theme.txt file from inside the Processing folder to your sketchbook @@ -43,25 +188,25 @@ plus some internal changes that have an impact on API. + It's now possible to copy the text of the status bar. Click the clipboard icon at the right-hand side to copy the text to the clipboard. To search - immediately, use shift-click. + immediately, use shift-click. https://github.com/processing/processing/issues/5271 https://github.com/processing/processing/pull/5345 The default search engine is Google, but you can modify that by altering the 'search.format' line in preferences.txt -+ Added pyde as a supported extension, so double-clicking ++ Added pyde as a supported extension, so double-clicking on Python sketches will launch the PDE. https://github.com/jdf/processing.py/issues/284 [ do you like data? ] -+ Added Double and Long versions of the data classes. Not sure if we'll ++ Added Double and Long versions of the data classes. Not sure if we'll keep these, but we're trying them out. + Also add subset(long) and subset(double) to PApplet -+ Changed the internal Sort class to use int for comparisons for better ++ Changed the internal Sort class to use int for comparisons for better accuracy, especially when working with double and long values. + Consistently implemented write(PrintWriter) in the List and Dict classes @@ -73,8 +218,8 @@ plus some internal changes that have an impact on API. [ updates ] -+ Fixed up the Welcome dialog. When closing the window or hitting ESC, - the "show this" selection is recorded. Also clicking that text will ++ Fixed up the Welcome dialog. When closing the window or hitting ESC, + the "show this" selection is recorded. Also clicking that text will toggle the checkbox on/off, as users would expect. https://github.com/processing/processing/issues/3911 https://github.com/processing/processing/issues/3912 @@ -175,7 +320,7 @@ plus some internal changes that have an impact on API. + Update java.lang.UnsupportedClassVersionError message https://github.com/processing/processing/pull/5459 - + + Semi-transparent colors do not display properly in PGraphics https://github.com/processing/processing/issues/5519 https://github.com/processing/processing/pull/5522 @@ -202,7 +347,7 @@ plus some internal changes that have an impact on API. PROCESSING 3.3.7 (REV 0264) - 13 March 2018 -A rollup of several fixes from the last few months. +A rollup of several fixes from the last few months. [ changes most likely to be noticed ] @@ -249,7 +394,7 @@ A rollup of several fixes from the last few months. + Fix scrub comments for empty block comment /**/ https://github.com/processing/processing/pull/5265 https://github.com/processing/processing/issues/5219 - + + Fix error checker crash when className contains [ or ] https://github.com/processing/processing/pull/5304 @@ -324,7 +469,7 @@ A rollup of several fixes from the last few months. PROCESSING 3.3.6 (REV 0263) - 4 September 2017 -A collection of mostly minor bug fixes that have accreted +A collection of mostly minor bug fixes that have accreted since the last release back in June. @@ -332,7 +477,7 @@ since the last release back in June. + Add Italian translation https://github.com/processing/processing/pull/5169 - + + Wrong tab for missing brace https://github.com/processing/processing/pull/5180 https://github.com/processing/processing/issues/5165 @@ -340,11 +485,11 @@ since the last release back in June. + Fix typo in German translation https://github.com/processing/processing/pull/5195 https://github.com/processing/processing/issues/5187 - + + Movie Maker only works once https://github.com/processing/processing/issues/5168 https://github.com/processing/processing/pull/5230 - + + Add more build products to linux/.gitignore https://github.com/processing/processing/pull/5229 @@ -362,7 +507,7 @@ since the last release back in June. + Fix comment/uncomment adding slashes at wrong indent https://github.com/processing/processing/issues/5171 https://github.com/processing/processing/pull/5185 - + + Add JavaFX runtime to error checker class path https://github.com/processing/processing/pull/5186 @@ -399,14 +544,14 @@ PROCESSING 3.3.5 (REV 0262) - 23 June 2017 Fixes for a couple problems introduced in the last release. -[ everything that went bad ] +[ everything that went bad ] -+ Console window was only remembering two lines of text ++ Console window was only remembering two lines of text because of a name collision in the preferences handling. https://github.com/processing/processing/issues/5110 - + + Something went wrong with the 64-bit Linux release: - "libjli.so: cannot open shared object file: No such file or directory" + "libjli.so: cannot open shared object file: No such file or directory" https://github.com/processing/processing/issues/5111 + "Could not parse -1 for --display" message on some Windows machines @@ -421,7 +566,7 @@ Fixes for a couple problems introduced in the last release. https://github.com/processing/processing/pull/5138 + Per request, use native file choosers by default on Linux. I'm told - that the default Linux file choosers have grown up in the last decade. + that the default Linux file choosers have grown up in the last decade. I'm trusting the person who is making that claim and making them default. https://github.com/processing/processing/issues/5122 To get the old behavior in the Editor, change preferences.txt to say: @@ -461,7 +606,7 @@ Several useful bug fixes and improvements. Some big, many small. + Clarify wording of error message regarding sketchbook location https://github.com/processing/processing/issues/4942 -+ Remove 'run sketches on display' error text that showed up even ++ Remove 'run sketches on display' error text that showed up even when using Processing for the first time + Implement alternate 'ant app' target for macOS application debugging @@ -471,7 +616,7 @@ Several useful bug fixes and improvements. Some big, many small. + Handle edge case for set() being called with a 2D vector, on a 3D vector https://github.com/processing/processing/issues/5092 - + [ incomplete additions ] @@ -480,14 +625,14 @@ Several useful bug fixes and improvements. Some big, many small. + Begin work on a shell() function to do exec() via a shell -[ other contributions - thank you! ] - -+ Add install/uninstall scripts for Linux and correct mime types for the PDE +[ other contributions - thank you! ] + ++ Add install/uninstall scripts for Linux and correct mime types for the PDE https://github.com/processing/processing/pull/5106 + IO library updates for ARM https://github.com/processing/processing/pull/5044 - + + Check $SUDO_USER on Linux for locating the sketchbook folder https://github.com/processing/processing/pull/5055 https://github.com/processing/processing/pull/5054 @@ -499,7 +644,7 @@ Several useful bug fixes and improvements. Some big, many small. + Still more updates to the change detector https://github.com/processing/processing/pull/5075 - + + Warn user to use L when creating a number constant that won't fit into an int https://github.com/processing/processing/issues/4878 https://github.com/processing/processing/pull/5077 @@ -520,7 +665,7 @@ Let's celebrate with a couple of bug fixes: + Image tint() was broken in 3.3.x https://github.com/processing/processing/issues/5040 https://github.com/processing/processing/pull/5042 - + + Deal with loadBytes() regressions introduced by their rewrite (was breaking p5jsMode because of its use of loadBytes(File) @@ -538,7 +683,7 @@ This version takes care of a handful of revisions. + ArrayIndexOutOfBoundsException when using tint() or loadFont() https://github.com/processing/processing/issues/5028 https://github.com/processing/processing/pull/5029 - + + createInput() wasn't returning null for files that were not found https://github.com/processing/processing/issues/5026 @@ -548,7 +693,7 @@ This version takes care of a handful of revisions. [ useful updates, that hopefully aren't regressions ] -+ Improve loadBytes() performance ++ Improve loadBytes() performance https://github.com/processing/processing/pull/5027 + Add (far) more efficient file loading for loadBytes(File) @@ -592,7 +737,7 @@ And now on with the countdown: + Fix small tooltip text on high-dpi screens https://github.com/processing/processing/issues/4914 - + + Ugly button images at 125% and 150% scaling on Windows https://github.com/processing/processing/issues/4901 https://github.com/processing/processing/pull/4906 @@ -603,18 +748,18 @@ And now on with the countdown: + Fix preprocessing of code with double backslash in string or char literal https://github.com/processing/processing/issues/4903 https://github.com/processing/processing/pull/4907 - + + Fix breakpoints in inner classes https://github.com/processing/processing/pull/5008 https://github.com/processing/processing/issues/2946 - + + Fix preprocessor skipping one char after a block comment https://github.com/processing/processing/issues/4995 https://github.com/processing/processing/pull/4999 - + + Synchronize input event processing https://github.com/processing/processing/pull/4998 - + + Scrub comments: skip the second chracter in the escape sequence https://github.com/processing/processing/pull/5019 https://github.com/processing/processing/issues/5016 @@ -633,9 +778,9 @@ And now on with the countdown: + Add another warning for yet another a bad NVIDIA driver https://github.com/processing/processing/issues/4997 - + + Make the Error Table extend white to the bottom - + + Use built-in font for any non-Roman or CJK language @@ -652,33 +797,33 @@ And now on with the countdown: + createInput() and createOutput() now both use buffered streams by default createInputRaw() does not, however - + + Don't derive the font again if the size is unchanged https://github.com/processing/processing/issues/4956 - + + fix temporary file handling for saveBytes(), saveStream(), etc wasn't handling gzip output properly also could have problems w/ names under length 3 -[ gottfried's arms ] +[ gottfried's arms ] + Add support for 64-bit ARM boards https://github.com/processing/processing/pull/5002 - + + Hardware I/O updates for ARM https://github.com/processing/processing/pull/4931 + Fix MeshTweening vertex shader https://github.com/processing/processing-docs/issues/523 https://github.com/processing/processing-docs/pull/524 - + + ARM: Allow Raspberry Pi's Mesa GL driver to use up to 8 lights https://github.com/processing/processing/pull/4915 ...and revert it back again https://github.com/processing/processing/pull/4922 - -+ Retry with multisampling disabled if creating a framebuffer + ++ Retry with multisampling disabled if creating a framebuffer fails because of INCOMPLETE_MULTISAMPLE https://github.com/processing/processing/pull/4921 @@ -712,14 +857,14 @@ never been able to reproduce, but that should now be fixed. Please confirm at the links listed to let me know if it's working. This is release 3.3 instead of 3.2.5 due to the huge change to the PDE -for scaling, as well as minor API modifications (see below). +for scaling, as well as minor API modifications (see below). [ big fixes ] + PDE was too small on high-res Windows and Linux machines. If you're having trouble with this, change the "Interface scaling" option in - the Preferences window. On Windows, it will attempt to auto-detect. + the Preferences window. On Windows, it will attempt to auto-detect. https://github.com/processing/processing/issues/2411 https://github.com/processing/processing/issues/4183 @@ -728,7 +873,7 @@ for scaling, as well as minor API modifications (see below). + Visual artifacts on Windows 10 when using menus https://github.com/processing/processing/issues/4700 - + + Broken characters in the Welcome Page and the Contribution Manager https://github.com/processing/processing/issues/4747 @@ -755,7 +900,7 @@ for scaling, as well as minor API modifications (see below). + StringDict(TableRow) constructor to create a dictionary from a table row + Allow lone double quotes in the midst of CSV strings. This improves - compatibility with spreadsheets exported from Google Sheets. + compatibility with spreadsheets exported from Google Sheets. + Return null (rather than NullPointerException) for PApplet.trim(null) @@ -787,7 +932,7 @@ The majority of these are from Jakub Valtar, plus a handful of other contributors are noted below. Read all the way to the end for fun new features. - + [ the pde & the editor ] + Detect changes to 'hosts' file in case users modify/remove localhost. @@ -809,28 +954,28 @@ new features. + println(int(byte(245))) throwing error https://github.com/processing/processing/issues/4652 https://github.com/processing/processing/pull/4744 - + + 'web colors' next to each other fail to parse in certain situations https://github.com/processing/processing/issues/4752 https://github.com/processing/processing/pull/4753 - + + Pasting code from editor to empty editor produces Exception https://github.com/processing/processing/issues/4522 https://github.com/processing/processing/pull/4761 - + + possible infinite loop on modified externally https://github.com/processing/processing/issues/3965 https://github.com/processing/processing/pull/4762 - + + Report missing brace in correct tab, suppress other errors until fixed https://github.com/processing/processing/pull/4777 - + + Improvements to sketch launching and stopping https://github.com/processing/processing/pull/4848 + Syntax highlighting issues (fixed with #4761) https://github.com/processing/processing/issues/4286 - + + Sketchbook window wasn't updating when sketches added, renamed, etc https://github.com/processing/processing/issues/2944 https://github.com/processing/processing/pull/4842 @@ -852,7 +997,7 @@ new features. + Contribution Manager does not show all libraries until filter cleared https://github.com/processing/processing/pull/4843 https://github.com/processing/processing/issues/4840 - + + Mode, requiring update, appears in Updates tab but not in Modes tab https://github.com/processing/processing/issues/4822 also fixed w/ https://github.com/processing/processing/pull/4843 @@ -868,7 +1013,7 @@ new features. + Split GUI and non-GUI portions of console for earlier startup. (Otherwise System.err/out not going to a file unless we have a GUI, which means we couldn't debug before the GUI shows up) - + + Fix JRE download failure during ant build due to Oracle change https://github.com/processing/processing/issues/4823 @@ -884,11 +1029,11 @@ new features. + Adding missing docs and keywords for TableRow https://github.com/processing/processing/pull/4333 - + + PShape in Java2D wasn't respecting 'kind' https://github.com/processing/processing/issues/4826 https://github.com/processing/processing/pull/4834 - + + Sketches still running in the background after closing https://github.com/processing/processing/issues/4831 (needed to allow JAVA2D to terminate when animation thread dies) @@ -897,16 +1042,16 @@ new features. [ closing bugs in opengl ] -+ PShape array index out of bounds when using P3D ++ PShape array index out of bounds when using P3D https://github.com/processing/processing/issues/4773 - + + Disable modelX/Y/Z() in P2D because they don't exist in 2D https://github.com/processing/processing/issues/4813 - + + Fix typo in GLSL preprocessor https://github.com/processing/processing/issues/4810 https://github.com/processing/processing/pull/4816 - + + Keep Windows timer resolution high for OpenGL sketches. Prevents frame rate in OpenGL hovering around 30 instead of 60. https://github.com/processing/processing/pull/4847 @@ -918,22 +1063,22 @@ new features. + FX: Prevent matrix stack overflow https://github.com/processing/processing/pull/4799 https://github.com/processing/processing/issues/4206 - + + FX: Reset transform to identity before drawing background https://github.com/processing/processing/pull/4795 - + + FX: Implement mouse wheel event https://github.com/processing/processing/issues/4169 https://github.com/processing/processing/pull/4796 - + + FX: Fix curveVertex drawing all curves together as one long curve https://github.com/processing/processing/pull/4800 https://github.com/processing/processing/issues/4382 - + + FX: Add exception handler which reports exceptions from user code https://github.com/processing/processing/pull/4798 https://github.com/processing/processing/issues/4339 - + + Unify mouse pressed/released events across renderers https://github.com/processing/processing/issues/4361 https://github.com/processing/processing/pull/4797 @@ -943,11 +1088,11 @@ new features. + Add listPaths(), listFiles() https://github.com/processing/processing/issues/4622 - + + Add increment() method that takes IntDict to merge another dictionary. Calling this increment() since it doesn't make sense in practice for the other dictionary types, even though it's technically an add(). - + + Added Entry class for iterating StringDict, IntDict, FloatDict + Added XML.print() method (prints with indent of 2) @@ -977,7 +1122,7 @@ Lots of fixes to the Contribution Manager and a couple OpenGL tweaks. https://github.com/processing/processing-docs/issues/478 https://github.com/processing/processing/issues/4696 https://github.com/processing/processing/pull/4712 - + + Major clean-ups to the Contribution Manager code @@ -985,11 +1130,11 @@ Lots of fixes to the Contribution Manager and a couple OpenGL tweaks. + Up-to-date status disappears after filter is removed (contributed) https://github.com/processing/processing/issues/4084 - + + Updates tab blank after adding, removing, updating a contribution https://github.com/processing/processing/issues/4082 https://github.com/processing/processing/issues/4704 - + + Fixes the removal of redundant contribution and update related issues https://github.com/processing/processing/pull/4086 @@ -1004,7 +1149,7 @@ Lots of fixes to the Contribution Manager and a couple OpenGL tweaks. + Automatic detection of POINT and LINE shaders fails https://github.com/processing/processing/issues/4725 - + + Show warning when frameRate() less than 1 is called with P2D and P3D https://github.com/processing/processing/issues/4716 @@ -1017,7 +1162,7 @@ PROCESSING 3.2.2 (REV 0254) - 30 October 2016 Lots of bug fixes. -[ fixes ] +[ fixes ] + Find in reference for size() opens StringList.size() https://github.com/processing/processing/issues/4224 @@ -1032,10 +1177,10 @@ Lots of bug fixes. + Errant "Could not open the URL" when clicking on error messages https://github.com/processing/processing/issues/4695 - + + Fix extensions handling in CFBundleDocument code from appbundler https://github.com/processing/processing/issues/4615 - + + Update launch4j to 3.9, fixing a problem with exported applications on Windows reporting "This application requires a Java Runtime Environment 1.8.0_74", when 1.8.0_101 or later were installed. @@ -1048,30 +1193,30 @@ Lots of bug fixes. + Add getRenderer() to SurfaceInfo for Andres https://github.com/processing/processing/issues/4441 - + + Exceptions thrown in OpenGL apps when hitting the window's close box https://github.com/processing/processing/issues/4690 - + + Add getRowMap() function to Table + Go back to textMode(MODEL) is native font not available for textMode(SHAPE) https://github.com/processing/processing/issues/4680 - + + NPE thrown when using textMode(SHAPE) with a .vlw font https://github.com/processing/processing/issues/4680 - + + Add toJSON() method to the data classes (IntDict, FloatDict, StringDict, IntList, FloatList, and StringList). Returns an object of one of those six types as a JSON-formatted String. For something more like the old toString() behavior, use print(). -[ gottfried's goodness ] +[ gottfried's goodness ] + Simplify font situation to make it possible to use vanilla JRE trees https://github.com/processing/processing/pull/4639 https://github.com/processing/processing/pull/4641 - + + Updates for ARM https://github.com/processing/processing/pull/4640 @@ -1080,40 +1225,40 @@ Lots of bug fixes. + Automatic handling of screen FBOs breaks readPixels() for user-provided FBO https://github.com/processing/processing/issues/4643 - + + PGraphicsOpenGL: camera info not updated https://github.com/processing/processing/issues/4609 - + + Fix PShape, updateTessellation, matrix transformations https://github.com/processing/processing/issues/4662 - + + QUAD_STRIP as child shape draws extra lines https://github.com/processing/processing/issues/4656 - + + Remove extra glClear() calls https://github.com/processing/processing/issues/4694 - + + PShapes do not show up in PDF with P2D renderer https://github.com/processing/processing/issues/4647 - + + Some semi-transparent edges of sphere() meshes rendered in higher density https://github.com/processing/processing/issues/4720 - + + P2D and P3D not stopping with empty draw() blocks https://github.com/processing/processing/issues/4722 -[ other contributed fixes ] +[ other contributed fixes ] + Chinese translation updates https://github.com/processing/processing/pull/4661 - + + Spanish translation updates https://github.com/processing/processing/pull/4697 - + + Spanish "open sketch folder" fix https://github.com/processing/processing/pull/4710 - + + Contribution Manager showing 'null' for PeasyCam version https://github.com/processing/processing/pull/4712 https://github.com/processing/processing/issues/4696 @@ -1121,7 +1266,7 @@ Lots of bug fixes. + Call glGetProgramiv to retrieve program log length https://github.com/processing/processing/issues/4659 https://github.com/processing/processing/pull/4660 - + + JSONObject get() method is private https://github.com/processing/processing/issues/4334 https://github.com/processing/processing/pull/4336 @@ -1137,7 +1282,7 @@ Fixes for a couple major bugs that showed up in the last release. [ fixes ] -+ "Could not replace preferences.old" error message on startup ++ "Could not replace preferences.old" error message on startup when using Processing for the first time. https://github.com/processing/processing/issues/4626 @@ -1158,14 +1303,14 @@ Fixes for a couple major bugs that showed up in the last release. PROCESSING 3.2 (REV 0252) - 16 August 2016 -This release includes a handful of fixes to deal with startup bugs, +This release includes a handful of fixes to deal with startup bugs, plus several internal changes for how Modes are implemented. For those semantic versioning enthusiasts keeping track at home, the version has been bumped from 3.1.x to 3.2.x to denote the internal API changes. -[ bug fixes ] +[ bug fixes ] + Processing .jar files in CLASSPATH can cause startup crash https://github.com/processing/processing/issues/4128 @@ -1201,7 +1346,7 @@ has been bumped from 3.1.x to 3.2.x to denote the internal API changes. https://github.com/processing/processing/issues/4555 https://github.com/processing/processing/pull/4547 https://github.com/processing/processing/pull/4596 - + + Error checker now adds 'public' to all default access methods https://github.com/processing/processing/pull/4597 https://github.com/processing/processing/issues/4583 @@ -1238,35 +1383,35 @@ has been bumped from 3.1.x to 3.2.x to denote the internal API changes. + Move general PDE code out of JavaMode and into general base classes https://github.com/processing/processing/issues/4606 - + + Change default PdeInputHandler constructor slightly (added another copy so that older Modes will still work properly) - -+ Change PdeKeywords to PdeTokenMarker (please notify us if this + ++ Change PdeKeywords to PdeTokenMarker (please notify us if this breaks anything). + Added Mode.requireExampleCompatibility() so that Modes can specify whether example packages should specifically mention their Mode in order to be visible when that Mode is in use. -+ Mode.getTokenMarker(SketchCode code) passes through to ++ Mode.getTokenMarker(SketchCode code) passes through to no arg version if not overridden. [ input method work from Tsuyoshi Fukuda (tyfkda) ] - + + Enable input method support by default on Japanese/Korean/Chinese systems https://github.com/processing/processing/pull/4598 - + + Set text color for InputMethod https://github.com/processing/processing/pull/4593 - + + Set sketch as modified when any character committed using input method https://github.com/processing/processing/pull/4599 - + + Insert characters by InputMethod at one time https://github.com/processing/processing/pull/4594 - + + Insert string when it is committed https://github.com/processing/processing/pull/4602 @@ -1279,12 +1424,12 @@ has been bumped from 3.1.x to 3.2.x to denote the internal API changes. PROCESSING 3.1.2 (REV 0251) - 29 July 2016 -Happy Fathom Fiesta Day! We'll be taking the afternoon off to enjoy -the summer, maybe you should take the afternoon off and dive into +Happy Fathom Fiesta Day! We'll be taking the afternoon off to enjoy +the summer, maybe you should take the afternoon off and dive into a new Processing release? -[ pde fixes ] +[ pde fixes ] + NullPointerException in LanguageBundle.read() on startup that prevented Processing from starting up on Windows machines. Network drive issue. @@ -1292,7 +1437,7 @@ a new Processing release? https://github.com/processing/processing/pull/4582 https://github.com/processing/processing/issues/4476 -+ Bring back preference to hide the error checking. Error checking will ++ Bring back preference to hide the error checking. Error checking will continue in the background because it's needed for parsing/preprocessing, but some were complaining about the error checker messages. https://github.com/processing/processing/pull/4491 @@ -1310,10 +1455,10 @@ a new Processing release? + Update to Java 8u102 build 14 -[ api fixes ] +[ api fixes ] + Rewrite CSV handling to take care of some parsing bugs and improve - performance. Note that the 'newlines' option is no longer necessary + performance. Note that the 'newlines' option is no longer necessary when loading files that contain newline characters mid-field. + Prevent random(low, high) from returning 'high' @@ -1326,12 +1471,12 @@ a new Processing release? https://github.com/processing/processing/pull/4520 -[ graphics ] +[ graphics ] + Disable asynchronous saveFrame() by default. This can really improve performance, but can cause weird glitches. Bring it back by using hint(ENABLE_ASYNC_SAVEFRAME) in your code to blissfully and speedily - create image sequences. + create image sequences. https://github.com/processing/processing/issues/4578 + Prevent NPE in loadImage() when called before setup() @@ -1358,11 +1503,11 @@ a new Processing release? + Add a temporary workaround for the CHIP to deal with cursor problems https://github.com/processing/processing/pull/4554 -+ Fix GLExceptions on Raspberry Pi when using offscreen PGraphics ++ Fix GLExceptions on Raspberry Pi when using offscreen PGraphics https://github.com/processing/processing/pull/4524 -[ fixed earlier ] +[ fixed earlier ] + Debugger deadlocks when choosing "Step Into" on println() https://github.com/processing/processing/issues/3923 @@ -1388,7 +1533,7 @@ Happy Day-after-my-Mother-in-Law's-birthday! (After the last two releases happened on holidays, I'm just gonna keep pushing the festive thing. Hard.) Most importantly, this release fixes a handful of bug fixes for regressions -(a smart-sounding word for making dumb mistakes) in the last release, +(a smart-sounding word for making dumb mistakes) in the last release, plus a handful of other improvements we picked up along the way. @@ -1403,9 +1548,9 @@ plus a handful of other improvements we picked up along the way. https://github.com/processing/processing/pull/4465 -[ the editor ] +[ the editor ] -+ Out of date Modes no longer hand Processing 3 on startup, ++ Out of date Modes no longer hand Processing 3 on startup, and will cause less trouble when changing Modes https://github.com/processing/processing/issues/4467 @@ -1448,7 +1593,7 @@ plus a handful of other improvements we picked up along the way. https://github.com/processing/processing/pull/4454 -[ the core ] +[ the core ] + Implement support for encoding= option in loadTable() @@ -1461,7 +1606,7 @@ plus a handful of other improvements we picked up along the way. https://github.com/processing/processing/commit/9f1d2988dc80ca7d5ee861b944cb59020ff771c5 -[ you'll never notice ] +[ you'll never notice ] + Fix 'ant clean' so that it actually... cleans. @@ -1470,7 +1615,7 @@ plus a handful of other improvements we picked up along the way. https://github.com/processing/processing/issues/1492 -[ fixed but forgot to tell you ] +[ fixed but forgot to tell you ] + Complex text input issues (fixed in 3.0.2) https://github.com/processing/processing/issues/3860 @@ -1486,18 +1631,18 @@ plus a handful of other improvements we picked up along the way. PROCESSING 3.1 (REV 0249) - 8 May 2016 -Happy Mother's Day! I celebrated by kicking off a Processing release +Happy Mother's Day! I celebrated by kicking off a Processing release while my beautiful wife and daughter took a well-deserved nap. -This release includes several bug fixes, while some of your donation dollars -were fed through Jakub Valtar to produce bug fixes and code improvements, -including some serious reworking of the error checker. Meanwhile, the rest -of the community pitched in with several additional fixes to keep this -caravan rolling, and Gottfried brought up the rear with fistfuls of +This release includes several bug fixes, while some of your donation dollars +were fed through Jakub Valtar to produce bug fixes and code improvements, +including some serious reworking of the error checker. Meanwhile, the rest +of the community pitched in with several additional fixes to keep this +caravan rolling, and Gottfried brought up the rear with fistfuls of improvements for Raspberry Pi and ARM support. -[ contributed pde fixes ] +[ contributed pde fixes ] + Grab bag of smaller, mainly ARM-related updates https://github.com/processing/processing/pull/4300 @@ -1546,7 +1691,7 @@ improvements for Raspberry Pi and ARM support. https://github.com/processing/processing/pull/4402 -[ jakub edits the editor ] +[ jakub edits the editor ] + Update app to Java 8 https://github.com/processing/processing/pull/4383 @@ -1604,7 +1749,7 @@ improvements for Raspberry Pi and ARM support. https://github.com/processing/processing/pull/4449 -[ gohaiv6 ] +[ gohaiv6 ] + Add automatic mipmap support to GLES2 https://github.com/processing/processing/pull/4416 @@ -1674,11 +1819,11 @@ improvements for Raspberry Pi and ARM support. PROCESSING 3.0.2 (REV 0248) - 13 February 2016 Happy Valentine's Day! Nothing says "I LOVE YOU" like a bouquet of bug fixes. -And nothing says, "I LOVE YOU TOO" like the sampler box of contributed fixes +And nothing says, "I LOVE YOU TOO" like the sampler box of contributed fixes and pull requests that the community has put together for me since 3.0.1. -[ editor contributions ] +[ editor contributions ] + Add "full screen" option to the Editor on OS X https://github.com/processing/processing/issues/3993 @@ -1687,8 +1832,8 @@ and pull requests that the community has put together for me since 3.0.1. + Add install script for site for ARM https://github.com/processing/processing/pull/4110 -+ Search/replace shouldn't include the string being replaced, - otherwise it can get into an infinite loop. ++ Search/replace shouldn't include the string being replaced, + otherwise it can get into an infinite loop. https://github.com/processing/processing/issues/4270 https://github.com/processing/processing/pull/4271 @@ -1713,7 +1858,7 @@ and pull requests that the community has put together for me since 3.0.1. + Add Turkish to the list of languages https://github.com/processing/processing/pull/4073 -+ Make the error message for stack overflows clearer ++ Make the error message for stack overflows clearer https://github.com/processing/processing/pull/4152 + Get rid of dt_socket message, making command line run a little better @@ -1751,16 +1896,16 @@ and pull requests that the community has put together for me since 3.0.1. https://github.com/processing/processing/issues/4105 -[ more editor ] +[ more editor ] + Move to Java 8u74, also fixes JavaFX issue. -+ Actually require OS X 10.8.5 (was set to 10.7). The Wiki said 10.8.3 - was required for 3.0 (it is), but has since been updated to 10.8.5. ++ Actually require OS X 10.8.5 (was set to 10.7). The Wiki said 10.8.3 + was required for 3.0 (it is), but has since been updated to 10.8.5. If you're gonna run Mountain Lion, at least make sure he's patched. -[ graphics contributions ] +[ graphics contributions ] + Fill out the Javadoc for PMatrix https://github.com/processing/processing/pull/4155 @@ -1772,7 +1917,7 @@ and pull requests that the community has put together for me since 3.0.1. https://github.com/processing/processing/pull/4171 -[ moar graphics ] +[ moar graphics ] + Fix another "Zero length string passed to TextLayout constructor" error @@ -1815,13 +1960,13 @@ and pull requests that the community has put together for me since 3.0.1. + exit() is not called in P2D/P3D https://github.com/processing/processing/issues/4156 -+ attrib*() function does not work well with PShape ++ attrib*() function does not work well with PShape https://github.com/processing/processing/issues/4048 [ "Jakub" is just Czech for "cupid" ] -+ Initialize sketch args before calling settings() ++ Initialize sketch args before calling settings() https://github.com/processing/processing/issues/4219 https://github.com/processing/processing/pull/4220 @@ -1862,7 +2007,7 @@ Lots and lots of bug fixes. + curveVertex() does not work with FX2D renderer https://github.com/processing/processing/issues/3960 - + + Hide menu bar on OS X when FX2D is running full screen + Add quotes to the necessary parameters in the size() error messages @@ -1871,65 +2016,65 @@ Lots and lots of bug fixes. https://github.com/processing/processing/issues/3913 https://github.com/processing/processing/pull/3999 https://github.com/processing/processing/pull/3992 - + + Add a patch for FX2D menubar not hiding, root cause not sorted out + Fix depth sorter ordering when two triangles in a plane share vertices https://github.com/processing/processing/pull/4010 - + + Turn off fixed rate scheduling in OpenGL https://github.com/processing/processing/pull/4004 - + + Fix GLSL preprocessing issues with variable name mangling https://github.com/processing/processing/pull/4052 https://github.com/processing/processing/issues/3961 https://github.com/processing/processing/issues/3968 -+ cursor() fails to work as expected with P2D/P3D ++ cursor() fails to work as expected with P2D/P3D https://github.com/processing/processing/issues/3955 - + + Topics/Shader/Convay broken https://github.com/processing/processing/issues/3947 https://github.com/processing/processing/issues/3973 - + + Regressions wrt GLES2 support between b4 and b7 https://github.com/processing/processing/issues/3976 - + + stroke glitches in P3D https://github.com/processing/processing/issues/4007 https://github.com/processing/processing/issues/4027 https://github.com/processing/processing/issues/4012 - + + Line loops incorrectly closed in P3D https://github.com/processing/processing/issues/4031 - + + pixelDensity() not working with createGraphics() and OpenGL https://github.com/processing/processing/issues/4039 - + + GL related crashes when closing the display window on Ubuntu (Intel) https://github.com/processing/processing/issues/4041 - + + GL related crashes when closing window on MacBook Air (Intel) running 10.9.5 https://github.com/processing/processing/issues/3977 + Update to JogAmp JOGL 2.3.2 https://github.com/processing/processing/issues/3979 - + + Output window cannot be set as non-resizable with the P2D or P3D renderers https://jogamp.org/bugzilla/show_bug.cgi?id=1188 https://github.com/processing/processing/issues/3952 - + + setAlwaysOnTop() does not work in P2D and P3D on Mac https://github.com/processing/processing/issues/3793 - + + P2D and P3D windows behave strangely when larger than the screen size https://github.com/processing/processing/issues/3401 - + + Remove Gluegen & JOGL sources https://github.com/processing/processing/pull/3982 -[ not graphics fixes ] +[ not graphics fixes ] + NullPointerException in ContributionManager.deleteTemp() https://github.com/processing/processing/issues/4026 @@ -1937,54 +2082,54 @@ Lots and lots of bug fixes. + Tweak Mode sometimes freezes while running, require a force quit https://github.com/processing/processing/issues/3928 https://github.com/processing/processing/pull/4014 - + + Tweak Mode: Some numbers ignored in second tab https://github.com/processing/processing/issues/4017 https://github.com/processing/processing/pull/4023 - + + Update Japanese translation https://github.com/processing/processing/pull/3956 https://github.com/processing/processing/pull/3971 - + + processing-java stealing focus even with --build flag https://github.com/processing/processing/issues/3996 https://github.com/processing/processing/pull/3998 - + + Documentation updates and other serial fixes https://github.com/processing/processing/pull/4015 + Include Example packs into update count https://github.com/processing/processing/pull/3932 - + + Editor objects are staying in memory https://github.com/processing/processing/issues/3930 https://github.com/processing/processing/pull/3934 https://github.com/processing/processing/issues/3929 - + + Library path for Error Checker and Suggestions https://github.com/processing/processing/pull/3989 https://github.com/processing/processing/issues/3924 - + + A serious error occurred while trying to create a new editor window https://github.com/processing/processing/issues/3974 https://github.com/processing/processing/pull/4001 - + + Export - fix Java not being embedded on 64bit https://github.com/processing/processing/pull/4005 - + + Add error checker document listeners to all tabs https://github.com/processing/processing/pull/4009 - + + Fix memory leak in Recent menu https://github.com/processing/processing/pull/4044 - + + Error checker update (also enables switch on String objects) https://github.com/processing/processing/issues/4034 https://github.com/processing/processing/pull/4042 - + + Fix occasional exception while editing text https://github.com/processing/processing/pull/4043 - + + Prevent preprocessor from crashing when setup() has no body https://github.com/processing/processing/pull/4045 @@ -1998,18 +2143,18 @@ Lots and lots of bug fixes. PROCESSING 3.0 (REV 0246) - 30 September 2015, 3pm ET -This one is huge. +This one is huge. -This document covers (in detail) the individual changes between releases. +This document covers (in detail) the individual changes between releases. For an overview abut what's new, different, and exceptional in 3.0, read: https://github.com/processing/processing/wiki/Changes-in-3.0 Most of the changes from the previous beta involve the final beautification of the GUI, and the beatification of the error checker and auto-completion -features. +features. -[ gui updates and fixes ] +[ gui updates and fixes ] + "Saving" messages never clear on "Save As" https://github.com/processing/processing/issues/3861 @@ -2070,7 +2215,7 @@ features. https://github.com/processing/processing/pull/3907 -[ contribution manager ] +[ contribution manager ] + Contributions filter ignored after clicking Install https://github.com/processing/processing/issues/3826 @@ -2088,7 +2233,7 @@ features. + ArrayIndexOutOfBoundsException freak out when clicking the header line -[ plumbing ] +[ plumbing ] + Fix nasty file counting problem in the change detector https://github.com/processing/processing/pull/3917 @@ -2108,19 +2253,19 @@ features. PROCESSING 3.0b7 (REV 0245) - 22 September 2015 It's 8:57pm and Jakub and Ben are still holed up at Fathom's studio in Boston. -Ben is wishing he was Jakub's age, as his wrists, neck, and back all feel -like a bag of broken pretzels after several hours/days/weeks/months of coding. -A bleary-eyed Jakub emerges from deep inside the error checker and completion +Ben is wishing he was Jakub's age, as his wrists, neck, and back all feel +like a bag of broken pretzels after several hours/days/weeks/months of coding. +A bleary-eyed Jakub emerges from deep inside the error checker and completion code, removes his headphones and grunts, "I think it's working." -[ changes and additions ] +[ changes and additions ] + Changed the Tool API to pass Base instead of Editor https://github.com/processing/processing/wiki/Tool-Basics -[ error checking and auto-completion fixes ] +[ error checking and auto-completion fixes ] + Huge rewrite of auto-complete and error checking code https://github.com/processing/processing/issues/3812 @@ -2135,7 +2280,7 @@ code, removes his headphones and grunts, "I think it's working." https://github.com/processing/processing/issues/3759 https://github.com/processing/processing/pull/3848 -+ Using "new color()" instead of "color()" results in "color type detected" ++ Using "new color()" instead of "color()" results in "color type detected" https://github.com/processing/processing/issues/3739 https://github.com/processing/processing/pull/3850 @@ -2143,7 +2288,7 @@ code, removes his headphones and grunts, "I think it's working." https://github.com/processing/processing/issues/3732 -[ watcher bug fixes ] +[ watcher bug fixes ] + "Your sketch has been modified externally" with encrypted OS X volumes https://github.com/processing/processing/issues/3650 @@ -2158,12 +2303,12 @@ code, removes his headphones and grunts, "I think it's working." + Cleaning up the logic in the watcher -[ contribution manager fixes ] +[ contribution manager fixes ] + Contributions Manager UI design https://github.com/processing/processing/issues/3482 -+ CM selected tabs are too tall ++ CM selected tabs are too tall https://github.com/processing/processing/issues/3598 + CM: Clicking item in Libraries list throws exception @@ -2174,7 +2319,7 @@ code, removes his headphones and grunts, "I think it's working." + Clean up the header for the scrolling lists -+ Use real version of bold font, rather than the fake version, ++ Use real version of bold font, rather than the fake version, in several locations. + Remove the "v" from the version numbers in the updates tab @@ -2261,7 +2406,7 @@ code, removes his headphones and grunts, "I think it's working." https://github.com/processing/processing/issues/3825 https://github.com/processing/processing/commit/42c0150da0f400637de916db1f94a687a7bc4288 -+ surface.setLocation() with OpenGL causing a freeze on Windows ++ surface.setLocation() with OpenGL causing a freeze on Windows https://github.com/processing/processing/commit/4c0f9234c0a48f62363233cafc9c9951ee351d3e + selectInput/Output() is behind the drawing window (Windows) @@ -2276,25 +2421,25 @@ code, removes his headphones and grunts, "I think it's working." PROCESSING 3.0b6 (REV 0244) - 11 September 2015 -And I beheld when he had released the sixth beta, and, lo, there was -a great earthquake; and the sun became black as sackcloth of hair, +And I beheld when he had released the sixth beta, and, lo, there was +a great earthquake; and the sun became black as sackcloth of hair, and the moon became as blood. -Aside from bug fixes, the FX2D renderer has received a lot of attention. +Aside from bug fixes, the FX2D renderer has received a lot of attention. On the plus side, it's working really well. On the minus side, we're giving up on making it the default for 3.0. The underlying JavaFX technology it uses is just not ready for our use. It is, however, super fast and makes great looking 2D sketches on retina devices. But it can be a little balky so we don't want it to be the first experience that beginners have with Processing. -Especially if you're doing 2D on a retina Mac, you should definitely try FX2D. -We're at the limit of what we can do performance-wise with the default -(JAVA2D) renderer, so if you're having performance problems, try FX2D. +Especially if you're doing 2D on a retina Mac, you should definitely try FX2D. +We're at the limit of what we can do performance-wise with the default +(JAVA2D) renderer, so if you're having performance problems, try FX2D. -[ bug fixes and improvements ] +[ bug fixes and improvements ] -+ Deal with ConcurrentModificationException in Editor - "Error repainting line range" and ConcurrentModificationException ++ Deal with ConcurrentModificationException in Editor + "Error repainting line range" and ConcurrentModificationException https://github.com/processing/processing/issues/3726 + Major surgery performed to drastically reduce the memory footprint @@ -2327,7 +2472,7 @@ We're at the limit of what we can do performance-wise with the default https://github.com/processing/processing/issues/3554 + Change value of constants PRIMITIVE, PATH, and GEOMETRY constants in PShape - This avoids a collision with entries in PConstants which causes + This avoids a collision with entries in PConstants which causes confusing errors or no errors to be thrown at all https://github.com/processing/processing/issues/3776 @@ -2335,7 +2480,7 @@ We're at the limit of what we can do performance-wise with the default https://github.com/processing/processing/issues/3472 -[ Jakub won't be here forever, but his contributions are eternal ] +[ Jakub won't be here forever, but his contributions are eternal ] + Error/warning location visualisation not updating when editor resizes https://github.com/processing/processing/issues/3619 @@ -2356,7 +2501,7 @@ We're at the limit of what we can do performance-wise with the default + FX - fix rad-deg conversion in rotate() https://github.com/processing/processing/pull/3711 -+ FX - basic pixel operations (get, set, load, update) ++ FX - basic pixel operations (get, set, load, update) https://github.com/processing/processing/pull/3709 + FX - align to pixel grid when drawing 1 px strokes @@ -2414,7 +2559,7 @@ X JOGL - normalize enter key + move createFont() to PGraphics -+ Fix PShape creation in P3D ++ Fix PShape creation in P3D https://github.com/processing/processing/pull/3781 + keyTyped() not firing with P2D and P3D @@ -2426,8 +2571,8 @@ X JOGL - normalize enter key hint(ENABLE_KEY_REPEAT) will turn it back on https://github.com/processing/processing/issues/1622 -+ With the P2D and P3D renderers, a generic set of cursors are - used because the OpenGL renderer doesn't have access to the ++ With the P2D and P3D renderers, a generic set of cursors are + used because the OpenGL renderer doesn't have access to the default cursor images for each platform. https://github.com/processing/processing/issues/3791 @@ -2438,7 +2583,7 @@ X JOGL - normalize enter key https://github.com/processing/processing/issues/3720 -[ Google Summer of Contribution Manager ] +[ Google Summer of Contribution Manager ] + CM: Category dropdown alignment https://github.com/processing/processing/issues/3644 @@ -2449,7 +2594,7 @@ X JOGL - normalize enter key https://github.com/processing/processing/issues/3613 https://github.com/processing/processing/pull/3714 -+ Several of those below were in beta 5... ++ Several of those below were in beta 5... + CM - Focus is shifted out of the filter field when something is searched https://github.com/processing/processing/issues/3682 @@ -2522,9 +2667,9 @@ Fixing a handful of regressions in beta 4, and clearing out some of the nooks and crannies as people report issues with the default download. -[ changes ] +[ changes ] -+ Removed support for fixed-function pipeline in OpenGL. I'm told ++ Removed support for fixed-function pipeline in OpenGL. I'm told this "brings us out of the 90s" and gets things a bit more up-to-date and compatible across many platforms and varying device types. https://github.com/processing/processing/issues/3505 @@ -2541,7 +2686,7 @@ nooks and crannies as people report issues with the default download. https://github.com/processing/processing-docs/pull/289 -[ bug fixes ] +[ bug fixes ] + Line selected for errors is off by one or two https://github.com/processing/processing/issues/3654 @@ -2570,7 +2715,7 @@ nooks and crannies as people report issues with the default download. https://github.com/processing/processing/issues/3704 -[ foundation $$ = bug fixe$ + improvement$ ] +[ foundation $$ = bug fixe$ + improvement$ ] + keyTyped() not firing with P2D and P3D https://github.com/processing/processing/issues/3582 @@ -2601,7 +2746,7 @@ nooks and crannies as people report issues with the default download. https://github.com/processing/processing/issues/3655 -[ contributed fixes ] +[ contributed fixes ] + Undo does not move to the correct location in the editor window https://github.com/processing/processing/issues/707 @@ -2616,7 +2761,7 @@ nooks and crannies as people report issues with the default download. https://github.com/processing/processing/pull/3700 -[ google summer of code ] +[ google summer of code ] + Foundation libraries disapear from CM after restart https://github.com/processing/processing/issues/3659 @@ -2659,10 +2804,10 @@ nooks and crannies as people report issues with the default download. PROCESSING 3.0b4 (REV 0242) - 17 August 2015 -Fixes for several long-standing bugs, plus some internal changes -to make the code slightly more usable by contributors. +Fixes for several long-standing bugs, plus some internal changes +to make the code slightly more usable by contributors. -For Tool and Mode developers, several functions have moved out of +For Tool and Mode developers, several functions have moved out of processing.app.Base and into the Messages and Platform classes. For instance, Base.isWindows() has moved to Platform.isWindows() (seems almost logical, right?) We're not keeping deprecated versions @@ -2677,7 +2822,7 @@ Meanwhile, Jakub Valtar is holed up at Fathom in Boston, fixing all of the bugs. See "your contributions are funding graphics fixes," below. -[ bug fixes ] +[ bug fixes ] + Fix NullPointerException with some sketches that have no size() command https://github.com/processing/processing/issues/3585 @@ -2708,7 +2853,7 @@ the bugs. See "your contributions are funding graphics fixes," below. https://github.com/processing/processing/issues/3623 -[ api/implementation changes ] +[ api/implementation changes ] + Several platform-oriented features have moved to Platform i.e. Platform.isWindows(), Platform.openURL(), Platform.getJavaPath() @@ -2740,10 +2885,10 @@ the bugs. See "your contributions are funding graphics fixes," below. + Contribution Manager GUI updates https://github.com/processing/processing/pull/3596 - + + Sorting CM by the author name inplemented https://github.com/processing/processing/pull/3615 - + + CM needs minimum window size enforced https://github.com/processing/processing/issues/3600 https://github.com/processing/processing/pull/3607 @@ -2784,7 +2929,7 @@ the bugs. See "your contributions are funding graphics fixes," below. + Export unsaved sketch > agree to save prompt > export doesn't finish https://github.com/processing/processing/issues/2724 -+ Add disconnectEvent() to Server ++ Add disconnectEvent() to Server https://github.com/processing/processing/issues/2133 + False positive for mixing active/static mode in Tweak Mode 3.0 alpha 5 @@ -2842,7 +2987,7 @@ PROCESSING 3.0b3 (REV 0241) - 11 August 2015 You get a beta! YOU get a beta! *YOU* get a beta! Everybody gets a beta! -[ bug fixes & changes ] +[ bug fixes & changes ] + Prevent 'examples' from showing as a folder in the sketchbook window (instead only show it in the Examples window) @@ -2862,7 +3007,7 @@ You get a beta! YOU get a beta! *YOU* get a beta! Everybody gets a beta! + Library names not showing up correctly ("pdf" instead of "PDF Export") https://github.com/processing/processing/issues/3574 -+ Contributed Examples were using their folder name, not the 'name' field ++ Contributed Examples were using their folder name, not the 'name' field from their properties file when shown in the Examples window. + Include name of sketch when asking user "Save sketch before closing?" @@ -2909,7 +3054,7 @@ beta release. Please keep the reports & code coming and help us get to 3.0. + Make size(displayWidth, displayHeight) still run in a window. Fixes "fullScreen() cannot be used here" message on startup. https://github.com/processing/processing/issues/3545 - In the past we were auto-detecting if it was the screen size, + In the past we were auto-detecting if it was the screen size, and switching to full screen mode. But that's now removed because fullScreen() is so easy, and full screen may not be wanted. @@ -2921,14 +3066,14 @@ beta release. Please keep the reports & code coming and help us get to 3.0. + Remove "pair is" debug messages from Welcome screen + Save Export to Application settings between uses - + + Fix NullPointerException in setVertex() https://github.com/processing/processing/pull/3553 https://github.com/processing/processing/issues/3550 + Toggling between noLights and PointLight in draw() behaving strangely https://github.com/processing/processing/issues/3546 - + + NullPointerException in Planets demo https://github.com/processing/processing/issues/3551 @@ -2949,7 +3094,7 @@ beta release. Please keep the reports & code coming and help us get to 3.0. it would report "done exporting!" but nothing had actually happened. + Prevent Export with examples and untitled/unsaved sketches - + + Links in error bar are not selectable nor clickable https://github.com/processing/processing/issues/3471 @@ -2962,7 +3107,7 @@ beta release. Please keep the reports & code coming and help us get to 3.0. https://github.com/processing/processing/issues/3433 + Cleaned up the advanced OpenGL wiki page - + + cursor(CROSS) breaks when using surface.setTitle() https://github.com/processing/processing/issues/3472 @@ -2992,11 +3137,11 @@ an author of these, see the notes in the link above. We're also planning some sort of online Q & A / office hours / talk to Ben about what's changed session to help folks along. We want to help, we just need to find the time. -And for those into the nitty gritty, or who enjoy lame jokes about esoteric +And for those into the nitty gritty, or who enjoy lame jokes about esoteric technical details, the detailed changes since 3.0 alpha 11 are below. -[ bug fixes ] +[ bug fixes ] + The new Welcome screen! was... completely broken https://github.com/processing/processing/issues/3474 @@ -3032,7 +3177,7 @@ technical details, the detailed changes since 3.0 alpha 11 are below. https://github.com/processing/processing/pull/3514 -[ changes, because not everything is a bug ] +[ changes, because not everything is a bug ] + Add new console/errors icons to the tabs in the footer @@ -3045,7 +3190,7 @@ technical details, the detailed changes since 3.0 alpha 11 are below. is coming soon that will be better-integrated with the editor. -[ internal changes you'll probably never notice ] +[ internal changes you'll probably never notice ] + Add message that says it's safe to ignore the tools.jar warning @@ -3054,7 +3199,7 @@ technical details, the detailed changes since 3.0 alpha 11 are below. + Update to launch4j 3.8 -[ contributions by our fine community ] +[ contributions by our fine community ] + Fix contribution compatibility check https://github.com/processing/processing/pull/3479 @@ -3084,10 +3229,10 @@ technical details, the detailed changes since 3.0 alpha 11 are below. https://github.com/processing/processing/pull/3522 -[ Jakub joins Andres in a battle of wits and test of wills against OpenGL ] +[ Jakub joins Andres in a battle of wits and test of wills against OpenGL ] + Implement depth sorting! Use hint(ENABLE_DEPTH_SORT) and say goobye - to your 3D transparency woes! + to your 3D transparency woes! https://github.com/processing/processing/issues/90 https://github.com/processing/processing/issues/2235 https://github.com/processing/processing/pull/3507 @@ -3154,7 +3299,7 @@ technical details, the detailed changes since 3.0 alpha 11 are below. PROCESSING 3.0a11 (REV 0238) - 16 July 2015 -Hopefully the last release before we go to beta. +Hopefully the last release before we go to beta. [ new additions ] @@ -3172,11 +3317,11 @@ Hopefully the last release before we go to beta. Our hope is that this will be the last round of changes for the 3.x series, and that it's now safe to update your Modes and Tools to be compatible with the final 3.x release. Changes in this release: - + - Several classes have been moved to a new processing.app.ui package. The processing.app package was much too unwieldy and made it difficult for people to hack on the PDE code. - + - Several functions have moved out of Base and into Util (or Toolkit). Most of these are file-related (removeDir() and others), but the Base class had simply grown to a ridiculous size. It remains enormous @@ -3194,10 +3339,10 @@ Hopefully the last release before we go to beta. + Resize children[] so that getChildren() returns a correctly-sized array https://github.com/processing/processing/issues/3347 - + + clear() was broken (maybe related to #3317) https://github.com/processing/processing/issues/3378 - + + PGraphic ignores PNG transparency (regression from 3.0a5, same as #3378) https://github.com/processing/processing/issues/3317 @@ -3207,16 +3352,16 @@ Hopefully the last release before we go to beta. + Sketches with new fullScreen() method should grab focus by default https://github.com/processing/processing/issues/3380 - + + Sketches not getting focus with Java2D https://github.com/processing/processing/issues/3389 - + + draw() executes twice when noLoop() called in setup() https://github.com/processing/processing/issues/3310 + displayDensity() not functioning properly https://github.com/processing/processing/issues/3436 - + + surface.setXxx() handling https://github.com/processing/processing/issues/3388 Methods for setResizable(), setVisible(), setTitle(), setIconImage() @@ -3225,31 +3370,31 @@ Hopefully the last release before we go to beta. + ArithmeticException: / by zero when using fonts opened with loadFont() https://github.com/processing/processing/issues/3413 - + + SVG briefly broken for Java2D https://github.com/processing/processing/issues/3417 - + + Change how font metrics are pulled to fix text width issues + Check alpha when image extension is "unknown" https://github.com/processing/processing/issues/3442 - + + Add support for more Image types (BGR) with PImage(java.awt.Image) + Move Java2D and JavaFX classes to their own packages -[ multithreading is hard ] +[ multithreading is hard ] + Sketch not always showing with empty draw() https://github.com/processing/processing/issues/3363 - + + Static mode broken with Java2D on Windows and Linux https://github.com/processing/processing/issues/3315 - + + Sketch sometimes doesn't show with noLoop() on Linux https://github.com/processing/processing/issues/3316 - + + Window never shows with exported application on 64-bit Linux https://github.com/processing/processing/issues/3303 @@ -3260,13 +3405,13 @@ Hopefully the last release before we go to beta. + sketch.isReadOnly returns false for examples coming from multiple modes https://github.com/processing/processing/issues/773 - + + Drag and Drop & "Add File" broken for .pde files in 3.0a10 https://github.com/processing/processing/issues/3383 + Show "not compatible" error message in the manager https://github.com/processing/processing/issues/3386 - + + Add more code for handling low-level errors on startup + Update the "Supported Platforms" wiki page with current status @@ -3276,14 +3421,14 @@ Hopefully the last release before we go to beta. + Error message caused by curly bracket in a println string https://github.com/processing/processing/issues/3394 - + + Tweak mode broken (re: new settings() function) https://github.com/processing/processing/issues/3435 + Add build.xml prompt for OS X developers to download the JDK update -[ contribution manager ] +[ contribution manager ] + Change the .properties file syntax a little bit: compatibleModesList -> modes @@ -3292,7 +3437,7 @@ Hopefully the last release before we go to beta. + Send list of installed Libraries, Modes, Tools, and Examples on update https://github.com/processing/processing/issues/3365 - + + Disable contrib manager updates when "check for updates" is turned off in Preferences. Also updated the FAQ to cover the changes. @@ -3301,11 +3446,11 @@ Hopefully the last release before we go to beta. + Use correct localized strings in JavaEditor.java https://github.com/processing/processing/pull/3376 - + + Dim edit menus as appropriate during selection/no selection/etc https://github.com/processing/processing/issues/53 https://github.com/processing/processing/pull/3419 - + + Internationalize MovieMaker.java https://github.com/processing/processing/pull/3424 @@ -3315,24 +3460,24 @@ Hopefully the last release before we go to beta. + Re-enable export to application with command line https://github.com/processing/processing/pull/3451 https://github.com/processing/processing/issues/2760 - + + Change undefined constructor error message for clarity https://github.com/processing/processing/issues/3434 + Mode problems window wasn't doing line breaks https://github.com/processing/processing/issues/3369 https://github.com/processing/processing/pull/3370 - + + Add missing internationalization in app/Sketch.java https://github.com/processing/processing/pull/3392 + Examples window shows contributed examples https://github.com/processing/processing/pull/3421 https://github.com/processing/processing/pull/3421 - + + Reworking the Contribution Manager according to Scott's redesign https://github.com/processing/processing/pull/3423 - + + Finish adding 'examples' contribs https://github.com/processing/processing/issues/2953 @@ -3353,7 +3498,7 @@ Hopefully the last release before we go to beta. https://github.com/processing/processing/pull/3410 -[ retina/hidpi fixes ] +[ retina/hidpi fixes ] + Make g.pixelDensity public inside PApplet (so accessible by sketches) @@ -3364,22 +3509,22 @@ Hopefully the last release before we go to beta. + Text not getting the correct font in Retina2D https://github.com/processing/processing/issues/2617 - + + Text is half size in PGraphicsRetina2D https://github.com/processing/processing/issues/2738 -[ andres loves opengl ] +[ andres loves opengl ] + Add attrib() method https://github.com/processing/processing/issues/2963 + The ortho() function seems broken https://github.com/processing/processing/issues/1278 - + + Errors with loading SVGs in P3D/P2D https://github.com/processing/processing/issues/3379 - + + Sketch window briefly appears on top left corner when using OpenGL https://github.com/processing/processing/issues/3308 @@ -3391,16 +3536,16 @@ Hopefully the last release before we go to beta. + Sketch window is not placed at correct location when running a second time https://github.com/processing/processing/issues/3125 - + + Full screen needs to ignore prev location setting for frame? https://github.com/processing/processing/issues/3305 - + + save() and saveFrame() with 2X renderers fails https://github.com/processing/processing/issues/3255 - + + NPE when using image() created with createGraphics(PGraphicsRetina2D) https://github.com/processing/processing/issues/2510 - + + Closing OpenGL sketch from the PDE doesn't stop java.exe process https://github.com/processing/processing/issues/2335 @@ -3411,13 +3556,13 @@ Hopefully the last release before we go to beta. PROCESSING 3.0a10 (REV 0237) - 9 June 2015 Huge release! Knocking on the door for beta, this includes many changes -and improvements for how displays of all kinds (single, multiple, retina, -high dpi) are handled, plus smoothing, full screen, etc etc. +and improvements for how displays of all kinds (single, multiple, retina, +high dpi) are handled, plus smoothing, full screen, etc etc. -[ breaking things for the future ] +[ breaking things for the future ] -+ Added fullScreen() method to make it far easier to run sketches ++ Added fullScreen() method to make it far easier to run sketches using the full screen. Reference notes and explanation here: https://github.com/processing/processing-docs/issues/250 https://github.com/processing/processing/issues/3296 @@ -3429,14 +3574,14 @@ high dpi) are handled, plus smoothing, full screen, etc etc. + Re-opened the Gates of Hell by adding chaining operations to PVector https://github.com/processing/processing/issues/257 - + + Changed exec() and open() to use varargs. Changed open() to launch() to prevent problems with Python Mode. + Replaced --full-screen command line option with --present to untangle full screen versus the "Present" command that places blanks the rest of the screen around a sketch. - + + ortho() function is being reworked to make it compliant https://github.com/processing/processing/issues/1278 @@ -3467,7 +3612,7 @@ high dpi) are handled, plus smoothing, full screen, etc etc. + Full screen doesn't work on second window w/o present mode https://github.com/processing/processing/issues/3271 - + + Full screen on OS X 10.9 has incorrect placement https://github.com/processing/processing/issues/3305 @@ -3476,19 +3621,19 @@ high dpi) are handled, plus smoothing, full screen, etc etc. + Comments influencing code (preproc issues in parsing) https://github.com/processing/processing/issues/3326 - + + Sketch not appearing depending on arangement of external display on OS X https://github.com/processing/processing/issues/3118 - + + Sketch launching on second display that's not currently in use https://github.com/processing/processing/issues/3082 - + + strokeWeight() in setup() not working for default renderer https://github.com/processing/processing/issues/3331 + Retain original java.awt.Frame when it's available from PSurfaceAWT -+ Set frame icon images for Java2D (dock and cmd-tab) ++ Set frame icon images for Java2D (dock and cmd-tab) https://github.com/processing/processing/issues/257 + Debug message showing up in 3.0a9 when dragging and dropping files @@ -3496,7 +3641,7 @@ high dpi) are handled, plus smoothing, full screen, etc etc. + Rolled back to 3.0a5 version of appbundler due to crash on startup https://github.com/processing/processing/issues/3359 https://github.com/processing/processing/issues/3360 - This re-introduces a few bugs related to the serial library and + This re-introduces a few bugs related to the serial library and scrolling and any other changes later than 16 November 2015 https://github.com/processing/processing/commits/master/build/macosx/appbundler.jar https://github.com/processing/processing/commits/master/build/macosx/appbundler/native/main.m @@ -3506,39 +3651,39 @@ high dpi) are handled, plus smoothing, full screen, etc etc. + set(0, 0, image) does not set alpha channel to opaque in P2D/P3D https://github.com/processing/processing/issues/2125 - + + GROUP shapes are broken in 3.0a9 https://github.com/processing/processing/issues/3336 - + + Only a quarter of the sketch is appearing in 2x mode https://github.com/processing/processing/issues/3332 https://github.com/processing/processing/issues/3327 - + + Single transparent pixel at end of textures in OpenGL https://github.com/processing/processing/issues/115 - + + Implement setImpl() instead of set() inside PGraphicsOpenGL https://github.com/processing/processing/issues/160 https://github.com/processing/processing/issues/3012 - + + Strange extra lines with PShape 3D https://github.com/processing/processing/issues/3006 - + + BACKSPACE key is identified as DELETE in OpenGL renderers https://github.com/processing/processing/issues/3338 -+ More key issues in OpenGL ++ More key issues in OpenGL https://github.com/processing/processing/issues/3352 + Set icon for OpenGL windows https://github.com/processing/processing/issues/3348 - + + save() and saveFrame() with OPENGL renderer fails https://github.com/processing/processing/issues/3334 - + + Errors in glsl code are only caught when set() is used https://github.com/processing/processing/issues/2268 - + + Strips when rendering spheres with lights and anti-aliasing https://github.com/processing/processing/issues/1185 @@ -3553,7 +3698,7 @@ high dpi) are handled, plus smoothing, full screen, etc etc. + Add i18n for Archiver Tool and missing text https://github.com/processing/processing/pull/3349 - + + Fix case-related bugs in Toolkit.setMenuMnemonics() https://github.com/processing/processing/pull/3366 @@ -3565,27 +3710,27 @@ high dpi) are handled, plus smoothing, full screen, etc etc. https://github.com/processing/processing/pull/3319 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a9 (REV 0236) - 19 May 2015 -More work as we head toward beta. Mostly improvements to the GUI +More work as we head toward beta. Mostly improvements to the GUI and fixes for many bugs. So close to beta I can practically smell it. -[ changes ] +[ changes ] + Implement more of the bottom half of the editor window GUI + Show screen dimensions in the Preferences window for display selector -+ Change how the variables/debug window works. Automatically ++ Change how the variables/debug window works. Automatically show the window when debugging, hide when not. https://github.com/processing/processing/issues/3298 https://github.com/processing/processing/issues/3091 -+ Enabling and disabling the debugger toggles the Step/Continue ++ Enabling and disabling the debugger toggles the Step/Continue buttons in the toolbar + Remove techie options from the Debug menu @@ -3596,7 +3741,7 @@ and fixes for many bugs. So close to beta I can practically smell it. + Lots of internal cleaning -[ bug fixes ] +[ bug fixes ] + Implement Cmd-Q handler on Mac OS X to shut down sketches properly https://github.com/processing/processing/issues/3301 @@ -3624,7 +3769,7 @@ and fixes for many bugs. So close to beta I can practically smell it. https://github.com/processing/processing/issues/3293 -[ fixed in 3.0a8, confirmed later ] +[ fixed in 3.0a8, confirmed later ] + "Step" not working properly https://github.com/processing/processing/issues/3266 @@ -3636,7 +3781,7 @@ and fixes for many bugs. So close to beta I can practically smell it. https://github.com/processing/processing/issues/3271 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a8 (REV 0235) - 17 May 2015 @@ -3650,7 +3795,7 @@ section below, for a change in how the size() command works. [ fixes ] -+ size() sometimes erratic (i.e default size used) This was often ++ size() sometimes erratic (i.e default size used) This was often seen with large setup() functions, or on more esoteric platforms. https://github.com/processing/processing/issues/1672 @@ -3660,8 +3805,8 @@ section below, for a change in how the size() command works. + Sketchbook window requires restart of Processing before updating after sketchbook location change. https://github.com/processing/processing/issues/3214 - -+ Replace & Find was reading "Find & Replace" + ++ Replace & Find was reading "Find & Replace" https://github.com/processing/processing/issues/3247 + "One file added to sketch" message when two files added @@ -3685,12 +3830,12 @@ section below, for a change in how the size() command works. setup() and is the only place where size() can be used. If using Processing without the PDE (i.e. with another IDE like Eclipse), remove the size() method from setup() and instead place it like so: - + public void settings() { size(400, 400, P3D); // your size() command here } - - The rest of your code remains unchanged. The PDE does this + + The rest of your code remains unchanged. The PDE does this transparently, so 99% of people won't even notice this change. However, it allows us to fix (and avoid) a lot of really nasty complications that come from how Processing lets you switch @@ -3705,7 +3850,7 @@ section below, for a change in how the size() command works. implementation of the settings() method is a simpler solution. + Added SVG Export library (works like PDF Export). This has not - been tested heavily yet. + been tested heavily yet. + Replace Tweak Mode ColorSelector with JComponent version https://github.com/processing/processing/issues/3209 @@ -3729,8 +3874,8 @@ section below, for a change in how the size() command works. thiList.append(value); } -+ Inside main(), don't set 'args' to a zero-length array if no args - were passed in, instead leave 'args' null. ++ Inside main(), don't set 'args' to a zero-length array if no args + were passed in, instead leave 'args' null. [ debugger ] @@ -3740,10 +3885,10 @@ section below, for a change in how the size() command works. + Change "method" to "function" in a few error messages https://github.com/processing/processing/issues/3225 - + + Error message for incorrect function arguments is wonky https://github.com/processing/processing/issues/3268 - + + String concatenation mistakes produce odd error messages https://github.com/processing/processing/issues/3253 @@ -3753,7 +3898,7 @@ section below, for a change in how the size() command works. + Window size not passing into Tweak Mode https://github.com/processing/processing/issues/3208 https://github.com/processing/processing/pull/3227 - + + Keep the tab menu at the right-hand side https://github.com/processing/processing/pull/3236 @@ -3762,7 +3907,7 @@ section below, for a change in how the size() command works. + Prevent breakpoints from causing a reload prompt https://github.com/processing/processing/pull/3263 - + + Added buffer to file detection time https://github.com/processing/processing/pull/3262 @@ -3772,15 +3917,15 @@ section below, for a change in how the size() command works. + Preferences window fixes for Linux https://github.com/processing/processing/pull/3232 https://github.com/processing/processing/issues/3231 - + + Clear error message in Contribution Manager after retrying https://github.com/processing/processing/pull/3240 https://github.com/processing/processing/issues/3239 - + + Add SOCKS proxy support to the PDE https://github.com/processing/processing/issues/2643 https://github.com/processing/processing/pull/3260 - + + Use system proxy by default https://github.com/processing/processing/issues/1476 https://github.com/processing/processing/pull/3251 @@ -3793,18 +3938,18 @@ section below, for a change in how the size() command works. + OpenGL sketches work only after running a sketch with default renderer https://github.com/processing/processing/issues/3218 - + + static mode - no setup() / draw() - broken in OpenGL https://github.com/processing/processing/issues/3163 - + + Deal with some performance issues https://github.com/processing/processing/issues/3210 - + + Can't run sketches with offscreen PGraphics https://github.com/processing/processing/issues/3259 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a7 (REV 0234) - 26 April 2015 @@ -3813,7 +3958,7 @@ Read the notes in 3.0a6 for major changes! This is only a minor bug fix release to take care of a few things that were broken in 3.0a6. -[ fixes ] +[ fixes ] + Fix bug that prevented the Preferences window from opening https://github.com/processing/processing/issues/3215 @@ -3833,9 +3978,9 @@ release to take care of a few things that were broken in 3.0a6. + Avoid minor memory leak in StringList.pop() -[ known issues ] +[ known issues ] -+ OpenGL sketches work on Windows (32- and 64-bit) only after running ++ OpenGL sketches work on Windows (32- and 64-bit) only after running a sketch that uses the default renderer https://github.com/processing/processing/issues/3218 @@ -3846,14 +3991,14 @@ release to take care of a few things that were broken in 3.0a6. https://github.com/processing/processing/issues?q=is%3Aopen+label%3Ahigh+-label%3Aenhancement -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a6 (REV 0233) - 25 April 2015 This is the big one! We've jettisoned PApplet as the base class so that we can improve performance, reduce flicker, and have a better base from -which to build better, more modern graphics rendering. More of the +which to build better, more modern graphics rendering. More of the gory details for the PApplet/PGraphics changes can be found here: https://github.com/processing/processing/tree/master/core @@ -3862,26 +4007,26 @@ https://github.com/processing/processing/issues/3072 and that means all Modes and some Tools will need to be updated: https://github.com/processing/processing/issues/3080 -We've also made major changes to better integrate PDE X, Tweak Mode, +We've also made major changes to better integrate PDE X, Tweak Mode, and other nice features for the default "Java" Mode. These will be the -center of the changes for 3.x, which is focused on improving the editing -and debugging experience in general. +center of the changes for 3.x, which is focused on improving the editing +and debugging experience in general. Suffice to say, this is truly an ALPHA quality release. We're pushing it out so that we can get more people testing it. If you want something more -stable, we recommend 3.0a5 (not 2.2.1, that thing is old!) +stable, we recommend 3.0a5 (not 2.2.1, that thing is old!) Library/Mode/Tool authors: Please help us get 3.0 ready by getting your code ready for 3.0! Because 2.x and 3.x contributions are separate, you -can maintain separate versions if you like (or only support 3.x). You -can also specify the earliest and latest revisions of Processing that -your code supports, so that it's only installed with the correct version. +can maintain separate versions if you like (or only support 3.x). You +can also specify the earliest and latest revisions of Processing that +your code supports, so that it's only installed with the correct version. If anything is unclear, please file an issue. I've not had time to write up all the changes yet (and some are still in progress), but what you see in this release is representative of where we're headed for 3.0. -[ known issues ] +[ known issues ] The full list is here: https://github.com/processing/processing/issues/ but a few that you might be likely to run across: @@ -3896,11 +4041,11 @@ but a few that you might be likely to run across: https://github.com/processing/processing/issues/3125 -[ general fixes and changes ] +[ general fixes and changes ] + Merge experimental into the main Java mode, move Java Mode to its own area -+ Deal with ctrl-alt-n regression ++ Deal with ctrl-alt-n regression https://github.com/processing/processing/issues/2979 + Don't add a ^M to files when writing @@ -3964,7 +4109,7 @@ but a few that you might be likely to run across: https://github.com/processing/processing/pull/2922 -[ who loves pull requests? I do. ] +[ who loves pull requests? I do. ] + Splash screen for Linux https://github.com/processing/processing/pull/3005 @@ -4046,7 +4191,7 @@ but a few that you might be likely to run across: + Fix ColorChooser cursor https://github.com/processing/processing/pull/3186 -+ Improve Spanish localization ++ Improve Spanish localization https://github.com/processing/processing/pull/3185 + Internationalization of editor error messages and Greek translations @@ -4140,13 +4285,13 @@ but a few that you might be likely to run across: https://github.com/processing/processing/pull/3102 -[ processing.core ] +[ processing.core ] -+ Remove Applet as the base class. ++ Remove Applet as the base class. https://github.com/processing/processing/tree/master/core + Replaced JOGL with LWJGL. Ongoing JOGL support is unclear and LWJGL - seems to be more consistently maintained. Unfortunately, it trades + seems to be more consistently maintained. Unfortunately, it trades one set of quirks for another. + Renamed 2x (hidpi/retina) versions of renderers to JAVA2D_2X, P3D_2X, etc. @@ -4172,7 +4317,7 @@ but a few that you might be likely to run across: https://github.com/processing/processing/issues/2925 -[ more contributions! ] +[ more contributions! ] + saveFrame() doesn't save opaque PNG files https://github.com/processing/processing/issues/3031 @@ -4197,7 +4342,7 @@ but a few that you might be likely to run across: https://github.com/processing/processing/issues/3114 -[ processing.data ] +[ processing.data ] + Ensure # of columns and titles lines up with Table(iterator) constructor @@ -4216,11 +4361,11 @@ but a few that you might be likely to run across: [ sketch ] -+ Added E2D, an experimental/enhanced renderer that draws directly - to the Graphics context without an intermediate image. This greatly - speeds up performance (especially on retina/hidpi displays), but - prevents pixel access (no save(), saveFrame(), loadPixels(), etc). - It also causes some rendering hiccups (frame rate is not as smooth), ++ Added E2D, an experimental/enhanced renderer that draws directly + to the Graphics context without an intermediate image. This greatly + speeds up performance (especially on retina/hidpi displays), but + prevents pixel access (no save(), saveFrame(), loadPixels(), etc). + It also causes some rendering hiccups (frame rate is not as smooth), but that's why it's experimental. + Remove isGL(), is2D(), is3D(), displayable() from PApplet @@ -4253,27 +4398,27 @@ but a few that you might be likely to run across: https://github.com/processing/processing/issues/2641 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a5 (REV 0232) - 16 November 2014 -Hello from the University of Denver! I'm here with Casey, Dan, Andres, -and Manindra working on 3.0. Chris Coleman and Laleh Mehran have been +Hello from the University of Denver! I'm here with Casey, Dan, Andres, +and Manindra working on 3.0. Chris Coleman and Laleh Mehran have been hosting us on behalf of the EDP program. It all looks a bit like this: https://twitter.com/digitalcoleman/status/533784122179596288 [ changes ] -+ Removed the sound library. It's now available as its own library ++ Removed the sound library. It's now available as its own library from the Library Manager. + Change how languages are loaded, adding a local override. + Update to use JRE/JDK 7u72 -+ Implement the active() method for Serial and Server ++ Implement the active() method for Serial and Server https://github.com/processing/processing/issues/2364 https://github.com/processing/processing/pull/2588 @@ -4304,7 +4449,7 @@ https://twitter.com/digitalcoleman/status/533784122179596288 [ bug fixes ] -+ Remove debug message printed to the console when the control key ++ Remove debug message printed to the console when the control key is pressed, when using the new editor. + size(640,360 , P3D) doesn't work properly (strange spacing) @@ -4325,7 +4470,7 @@ https://twitter.com/digitalcoleman/status/533784122179596288 https://github.com/processing/processing/issues/2930 -[ contributed fixes ] +[ contributed fixes ] + Cmd + H runs sketch instead of hiding the PDE (OS X) https://github.com/processing/processing/issues/2881 @@ -4424,7 +4569,7 @@ https://twitter.com/digitalcoleman/status/533784122179596288 https://github.com/processing/processing/pull/2958 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a4 (REV 0231) - 12 September 2014 @@ -4434,17 +4579,17 @@ The next alpha release will contain major changes and break a few libraries and tools, so this is an attempt at a final "stable" alpha that can be used until all those issues are sorted out. -[ changes ] +[ changes ] + Contributions (Libraries, Modes, Tools) are now read from their own listing that's specific to Processing 3. https://github.com/processing/processing/issues/2850 https://github.com/processing/processing/issues/2849 -+ Made the new editor the default. ++ Made the new editor the default. + The OS X default File menu (shown when no windows are open) now has the - order/naming changes found in the sketch window File menu. + order/naming changes found in the sketch window File menu. + Turning off file watching because of errant "this sketch has changed" messages. Hopefully this will return soon. @@ -4453,7 +4598,7 @@ until all those issues are sorted out. + Turned off code completion by default and reset its preference name. -[ bug fixes ] +[ bug fixes ] + TGAs from saveFrame() create transparent/black movies with Movie Maker https://github.com/processing/processing/issues/2851 @@ -4470,7 +4615,7 @@ until all those issues are sorted out. https://github.com/processing/processing/issues/2831 -[ internal tweaks ] +[ internal tweaks ] + Optimize creation of boxed primitives https://github.com/processing/processing/pull/2826 @@ -4482,14 +4627,14 @@ until all those issues are sorted out. https://github.com/processing/processing/pull/2844 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a3 (REV 0230) - 26 August 2014 -The 3.0 process continues as we've wrapped up a very successful +The 3.0 process continues as we've wrapped up a very successful Google Summer of Code, and have also been integrating contributions -(internationalization!) from some helpful community members. +(internationalization!) from some helpful community members. In particular, Jakub Valtar, Darius M, and Frederico Bond are my heroes: https://github.com/processing/processing/commits/master?author=jakubvaltar @@ -4507,7 +4652,7 @@ https://github.com/processing/processing/commits/master?author=voidplus [ fixes and updates ] -+ The sound library is now available for 64-bit Windows and Linux. ++ The sound library is now available for 64-bit Windows and Linux. 32-bit versions are still in the works. + Don't write sketch.properties unless it's a non-default mode @@ -4652,7 +4797,7 @@ https://github.com/processing/processing/commits/master?author=voidplus + Call applet.exit() instead of System.exit() from Present Mode's 'stop' https://github.com/processing/processing/pull/2680 - + + Drawing RECT PShape with rounded corners crashes the sketch https://github.com/processing/processing/issues/2648 @@ -4672,7 +4817,7 @@ https://github.com/processing/processing/commits/master?author=voidplus https://github.com/processing/processing/issues/2679 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a2 (REV 0229) - 31 July 2014 @@ -4680,25 +4825,25 @@ PROCESSING 3.0a2 (REV 0229) - 31 July 2014 The 3.0 train gains steam and continues to hurtle down the track. -[ changes ] +[ changes ] + Added a new sketchbook location, so that you can have separate sketchbooks - with 2.0 and 3.0 releases. The downside is that they won't stay in sync, + with 2.0 and 3.0 releases. The downside is that they won't stay in sync, but the upside is that sketches that haven't been updated, or conflicting - Libraries, Modes, or Tools won't cause trouble with the other version. + Libraries, Modes, or Tools won't cause trouble with the other version. The new preference is called sketchbook.location.three (the old preference was sketchbook.location). If you already have a 2.0 sketchbook, that will be used by default with 3.0 until you change it in the Preferences window. + Neglected to mention with the previous release that the video library has been removed from the default download. This decreases the size of the - Processing download by about 20%. In addition, it was only the video + Processing download by about 20%. In addition, it was only the video library for the platform being downloaded, and with the return of cross- platform application export, that could cause sadness. To use the video library, use the "Add Library..." menu and select it from the list. + Added a new preference for the 3.0 sketchbook location, so that a separate - sketchbook (and with it, different Modes, Tools, and Libraries) can be + sketchbook (and with it, different Modes, Tools, and Libraries) can be used with Processing 3.0 versus older versions of 2.x. + Remove default menu bar hack for OS X @@ -4706,11 +4851,11 @@ The 3.0 train gains steam and continues to hurtle down the track. + Move to native OS X full screen (supported in 10.7 and later) https://github.com/processing/processing/issues/2641 - This allows us to remove native code for hiding the menu bar. + This allows us to remove native code for hiding the menu bar. But it may introduce more quirks, we'll have to test it out. -[ fixes ] +[ fixes ] + The Examples weren't included in 3.0a1. Oops. https://github.com/processing/processing/issues/2652 @@ -4739,7 +4884,7 @@ The 3.0 train gains steam and continues to hurtle down the track. https://github.com/processing/processing/issues/2208 -[ the data classes ] +[ the data classes ] + Add copy() method to Table @@ -4784,12 +4929,12 @@ X Fixed issue where the browser wasn't opening the reference properly https://github.com/processing/processing/pull/2657 -[ you request, we pull ] +[ you request, we pull ] + Insert tabs properly when prefs set for tabs mode https://github.com/processing/processing/pull/2607 -+ Improve the appearance when using the Nimbus LAF ++ Improve the appearance when using the Nimbus LAF https://github.com/processing/processing/pull/2671 + Implement A and a (elliptical arcs) @@ -4806,7 +4951,7 @@ X Fixed issue where the browser wasn't opening the reference properly https://github.com/processing/processing/pull/2324 -[ fixed in earlier releases ] +[ fixed in earlier releases ] + maxHeapSize typo in the build scripts https://github.com/processing/processing/issues/2603 @@ -4828,7 +4973,7 @@ X Fixed issue where the browser wasn't opening the reference properly https://github.com/processing/processing/issues/5 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 3.0a1 (REV 0228) - 26 July 2014 @@ -4837,14 +4982,14 @@ Kicking off the 3.0 release process. The focus for Processing 3 is improving the editor and the coding process, so we'll be integrating what was formerly PDE X as the main editor. -This release also includes a number of bug fixes and changes, based on +This release also includes a number of bug fixes and changes, based on in-progress Google Summer of Code projects and a few helpful souls on Github. Please contribute to the Processing 3 release by testing and reporting bugs. Or better yet, helping us fix them and submitting pull requests. -[ contributed fixes! ] +[ contributed fixes! ] + Fix blendMode() problems in the default renderer (thanks Jakub Valtar!) https://github.com/processing/processing/issues/2012 @@ -4875,7 +5020,7 @@ Or better yet, helping us fix them and submitting pull requests. https://github.com/processing/processing/issues/2630 -[ summer of code ] +[ summer of code ] + Line coloring incorrect for filtered contribution listings https://github.com/processing/processing/issues/2583 @@ -4899,7 +5044,7 @@ Or better yet, helping us fix them and submitting pull requests. + Add preference to set the present color https://github.com/processing/processing/pull/2568 -+ Fix a problem where mode menu selection would change even if ++ Fix a problem where mode menu selection would change even if the change was canceled due to the sketch being modified https://github.com/processing/processing/issues/2615 @@ -4907,12 +5052,12 @@ Or better yet, helping us fix them and submitting pull requests. https://github.com/processing/processing/pull/2651 -[ more bug fixes ] +[ more bug fixes ] + Prevent the current Mode from being de-selected https://github.com/processing/processing/issues/2545 -+ Prevent ArrayIndexOutOfBoundsException when calling min/maxValue() ++ Prevent ArrayIndexOutOfBoundsException when calling min/maxValue() on a FloatDict that only contains NaN values + Last row was being skipped on tables with the 'newlines' option set @@ -4929,10 +5074,10 @@ Or better yet, helping us fix them and submitting pull requests. Formerly, this was throwing a NullPointerException. -[ changes ] +[ changes ] + A new sound library has been added, and Minim has been removed. Minim - will now available via the Contributions Manager. + will now available via the Contributions Manager. + Add copy() method to PVector @@ -4941,13 +5086,13 @@ Or better yet, helping us fix them and submitting pull requests. + add getColumnTitle(int) and getColumnTitles() to TableRow interface -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.2.1 (REV 0227) - 19 May 2014 A handful of bug fixes, the most prominent rolls back a change that broke -PDE X and other Modes and Tools. +PDE X and other Modes and Tools. + Bring back setIcon(Frame) for PDE X and others https://github.com/processing/processing-experimental/issues/64 @@ -4955,7 +5100,7 @@ PDE X and other Modes and Tools. + Add additional code for crashing when the Mode is changed or new editor windows opened. -+ Use mouseReleased() instead of mousePressed() in the color selector, ++ Use mouseReleased() instead of mousePressed() in the color selector, otherwise it registers the release as a click in the color window https://github.com/processing/processing/issues/2514 @@ -4985,7 +5130,7 @@ PDE X and other Modes and Tools. + Updated reference files included in the download. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.2 (REV 0226) - 12 May 2014 @@ -4994,7 +5139,7 @@ Major changes to, and improvements upon, how "Export to Application" works. Plus dozens of bug fixes for all manner of atrocities. -[ bug fixes and additions ] +[ bug fixes and additions ] + Sketches only starting once, or half-starting and hanging on Mac OS X. A major problem on OS X, thanks to David Fokkema for tracking down a fix. @@ -5040,7 +5185,7 @@ Plus dozens of bug fixes for all manner of atrocities. [ export to application ] + The return of multi-platform export! Create applications for Windows - and Linux while using OS X. Create a Linux application from Windows. + and Linux while using OS X. Create a Linux application from Windows. Against my better judgement, we're supporting it again. It's extremely difficult, but was disappointing to remove it earlier. @@ -5048,7 +5193,7 @@ Plus dozens of bug fixes for all manner of atrocities. https://github.com/processing/processing/issues/2349 + Change Windows export to use launch4j instead of our custom launcher. - This will fix many, many problems, but may introduce some new ones. + This will fix many, many problems, but may introduce some new ones. + Windows (64-bit) now creates a proper .exe instead of a .bat file https://github.com/processing/processing/issues/923 @@ -5089,7 +5234,7 @@ Plus dozens of bug fixes for all manner of atrocities. + Bug in relative moveto commands for SVG https://github.com/processing/processing/issues/2377 -+ Add a constructor to bind Server to a specific address ++ Add a constructor to bind Server to a specific address https://github.com/processing/processing/issues/2356 + Fonts from loadFont() show up as blocks in P3D (regression) @@ -5099,16 +5244,16 @@ Plus dozens of bug fixes for all manner of atrocities. https://github.com/processing/processing/issues/2493 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.1.2 (REV 0225) - 15 April 2014 -Lots of small bug fixes plus some additional changes to support +Lots of small bug fixes plus some additional changes to support the new Python Mode, coming soon: https://github.com/jdf/processing.py -[ the pde ] +[ the pde ] + The PDE was using 15% of CPU while just sitting idle. Thanks to David Fokkema for the fix (and pull request). @@ -5135,7 +5280,7 @@ the new Python Mode, coming soon: https://github.com/jdf/processing.py https://github.com/processing/processing/issues/2453 -[ the core ] +[ the core ] + sketchPath() was returning user.home in exported apps on OS X https://github.com/processing/processing/issues/2181 @@ -5150,15 +5295,15 @@ the new Python Mode, coming soon: https://github.com/jdf/processing.py + PGraphics.colorCalcARGB(int, float) wasn't properly capping alpha values https://github.com/processing/processing/issues/2439 -+ Make sure that the window background color isn't the same as the default - sketch background color (otherwise the sketch area isn't clear). ++ Make sure that the window background color isn't the same as the default + sketch background color (otherwise the sketch area isn't clear). https://github.com/processing/processing/issues/2297 + Fix for occasional NullPointerException in paint() https://github.com/processing/processing/issues/2354 -[ andres vs opengl, episode 225 ] +[ andres vs opengl, episode 225 ] + copy() under OPENGL uses upside-down coordinates for cropping https://github.com/processing/processing/issues/2345 @@ -5192,7 +5337,7 @@ the new Python Mode, coming soon: https://github.com/jdf/processing.py https://github.com/processing/processing/issues/2424 -[ fixed in earlier releases ] +[ fixed in earlier releases ] + draw() called again before finishing on OS X (retina issue) https://github.com/processing/processing/issues/1709 @@ -5204,7 +5349,7 @@ the new Python Mode, coming soon: https://github.com/jdf/processing.py https://github.com/processing/processing/issues/2252 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.1.1 (REV 0224) - 21 January 2014 @@ -5228,7 +5373,7 @@ Still a number of known issues, but this cleans up several of the biggies. https://github.com/processing/processing/issues/2202 -[ windows ] +[ windows ] + Export to Application was broken on Windows https://github.com/processing/processing/issues/2219 @@ -5274,7 +5419,7 @@ Still a number of known issues, but this cleans up several of the biggies. https://github.com/processing/processing/pull/2266 -[ core fixes ] +[ core fixes ] + PImage resize() causes PImage not to be rendered in JAVA2D https://github.com/processing/processing/issues/2179 @@ -5321,24 +5466,24 @@ Still a number of known issues, but this cleans up several of the biggies. https://github.com/processing/processing/issues/2233 -[ missing in the 2.1 release notes ] +[ missing in the 2.1 release notes ] -+ init() not called on tools until later ++ init() not called on tools until later https://github.com/processing/processing/issues/1859 + Finish changes so the PDE can use an unmodified JRE https://github.com/processing/processing/issues/1840 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.1 (REV 0223) - 27 October 2013 -There have been major changes since 2.0.3, most of them are outlined in +There have been major changes since 2.0.3, most of them are outlined in the release notes for 2.1 beta 1 (look down a few dozen lines). -This release includes a few updates to fix problems introduced in the beta +This release includes a few updates to fix problems introduced in the beta release, as well as additional general bug fixes, especially for OpenGL. + Added an option to not embed the Java runtime into an exported application. @@ -5346,8 +5491,8 @@ release, as well as additional general bug fixes, especially for OpenGL. Java 7u45 or later. Details on the same page that nobody read last time: http://wiki.processing.org/w/Export_Info_and_Tips -+ The new println() (see the beta 1 notes) makes some old code behave a - little differently. In the past, println() with an array would write ++ The new println() (see the beta 1 notes) makes some old code behave a + little differently. In the past, println() with an array would write out the array, one element per line, with the index in the front. i.e.: PFont.list()) would write something like this to the console: @@ -5364,18 +5509,18 @@ release, as well as additional general bug fixes, especially for OpenGL. Serif SansSerif Monospaced Dialog DialogInput ACaslonPro-Bold... - To get the old behavior, use printArray(). It's the price of progress, + To get the old behavior, use printArray(). It's the price of progress, and shouldn't really "break" anyone's code since it's just writing to the - console. We think the new syntax outweighs the downside of the change. + console. We think the new syntax outweighs the downside of the change. With arrays of primitive types (int[], float[], anything that's not an object), we've added code so that println() works as before. But we - can't do the same for arrays of objects, such as String. + can't do the same for arrays of objects, such as String. + The preference for font smoothing (anti-aliasing) in the editor has been - reset in this release. Fonts are unusably gross on OS X (and Linux) + reset in this release. Fonts are unusably gross on OS X (and Linux) without smoothing and Oracle's version of Java (now in use with 2.1), - and many longtime users have anti-aliasing turned off. You can still + and many longtime users have anti-aliasing turned off. You can still turn off smoothing in the Preferences window, but the results may be poor. https://github.com/processing/processing/issues/2164 https://github.com/processing/processing/issues/2160 @@ -5398,7 +5543,7 @@ release, as well as additional general bug fixes, especially for OpenGL. https://github.com/processing/processing/issues/2135 -[ OpenGL updates ] +[ OpenGL updates ] + Using sketchQuality() does not work properly with P3D, OPENGL, P2D https://github.com/processing/processing/pull/2157 @@ -5431,21 +5576,21 @@ release, as well as additional general bug fixes, especially for OpenGL. https://github.com/processing/processing/commit/cca2f08a24ef892c494f5a75aa0e4b01de7e5d8a -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.1 beta 1 (REV 0222) - 20 October 2013 This release contains major changes. The big ones: -+ Java 7 is now used across all platforms. On Mac OS X, ++ Java 7 is now used across all platforms. On Mac OS X, we're now embedding Java 7u45. More info here: http://wiki.processing.org/w/Supported_Platforms#Java_Versions -+ Major changes have been made to Export to Application. ++ Major changes have been made to Export to Application. Read here: http://wiki.processing.org/w/Export_Info_and_Tips -+ print() and println() now make debugging fun! They can now take any ++ print() and println() now make debugging fun! They can now take any number of parameters, which means that code like: println(x, y, mouseX, mouseY); will print out @@ -5456,13 +5601,13 @@ This release contains major changes. The big ones: + A new serial library has been added! The results of Gottfried Haider's Google Summer of Code project now replaces the old serial library. -And everyone should wish Casey Reas happy birthday today! +And everyone should wish Casey Reas happy birthday today! This release is my birthday present for him. What did you get him? Here's a more detailed rundown of what else is in this release: -[ new features and additions ] +[ new features and additions ] + For people using Eclipse, the new print() and println() methods add some quirks because of how println() works for arrays in previous @@ -5473,9 +5618,9 @@ Here's a more detailed rundown of what else is in this release: https://github.com/processing/processing/issues/2056 + Update the JavaDoc, remove java.* package prefix ugliness. Also link - out to the online version of the Oracle documentation. + out to the online version of the Oracle documentation. -+ Major work on the source and the build scripts as we completed the ++ Major work on the source and the build scripts as we completed the transition to Java 7, and away from Apple's deprecated Java 6. http://wiki.processing.org/w/Supported_Platforms#Mac_OS_X @@ -5488,7 +5633,7 @@ Here's a more detailed rundown of what else is in this release: + Remove unused/outdated 'Mangler' Tool example -+ Remove video library for other platforms in download. This saves ++ Remove video library for other platforms in download. This saves significant space because we're not doing cross-platform export anymore. + Update apple.jar file with new version @@ -5508,7 +5653,7 @@ Here's a more detailed rundown of what else is in this release: Java 7 on OS X only supports 64-bit, so 32-bit is no longer available. -[ editor fixes ] +[ editor fixes ] + Deal with null/missing folders for Tools and Modes https://github.com/processing/processing/issues/2068 @@ -5548,8 +5693,8 @@ Here's a more detailed rundown of what else is in this release: + Java2D images crash after being resized https://github.com/processing/processing/issues/2113 -+ Constrain lerpColor() between 0 and 1. Unlike lerp(), where it might - make mathematical sense, going outside the boundary colors produces ++ Constrain lerpColor() between 0 and 1. Unlike lerp(), where it might + make mathematical sense, going outside the boundary colors produces really messy results. + JSONObject/Array.format(-1) not working on embedded JSONObjects @@ -5595,7 +5740,7 @@ Here's a more detailed rundown of what else is in this release: https://github.com/processing/processing/issues/2151 -[ new serial library ] +[ new serial library ] + Incorporate the new serial library. Woohoo! https://github.com/processing/processing/pull/2093 @@ -5613,9 +5758,9 @@ Here's a more detailed rundown of what else is in this release: https://github.com/processing/processing/issues/1374 -[ font fixes and changes ] +[ font fixes and changes ] -+ Add ability to change the editor (and console) font from a menu ++ Add ability to change the editor (and console) font from a menu in the Preferences window. https://github.com/processing/processing/issues/2078 @@ -5625,9 +5770,9 @@ Here's a more detailed rundown of what else is in this release: + Allow editor and console font changes without restart. -+ Anti-aliasing fix for the editor line status. ++ Anti-aliasing fix for the editor line status. -+ Change to bold instead of semibold version of Source Code Pro. ++ Change to bold instead of semibold version of Source Code Pro. The semibold wasn't mapping properly as the same family. + Use the same font in the console as the editor. @@ -5648,12 +5793,12 @@ Here's a more detailed rundown of what else is in this release: + Add support for many other image file types to Movie Maker -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0.3 (REV 0221) - 5 September 2013 -Lots of bug fixes, primarily a ton of work by Andres to improve +Lots of bug fixes, primarily a ton of work by Andres to improve OpenGL rendering with P2D and P3D. @@ -5662,7 +5807,7 @@ OpenGL rendering with P2D and P3D. + blendMode() change causes OpenGL renderer to be very slow https://github.com/processing/processing/issues/2021 -+ Serious OpenGL performance issues on OS X, this was fixed ++ Serious OpenGL performance issues on OS X, this was fixed with the JOGL update in 2.0.2, but we neglected to note it. https://github.com/processing/processing/issues/1714 @@ -5717,7 +5862,7 @@ OpenGL rendering with P2D and P3D. https://github.com/processing/processing/issues/2061 -[ other bug fixes ] +[ other bug fixes ] + Fix options parsing on loadTable() to handle spaces. @@ -5726,18 +5871,18 @@ OpenGL rendering with P2D and P3D. https://github.com/processing/processing/pull/2046 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0.2 (REV 0220) - 14 August 2013 -Many small bug fixes and lots of work on the Library/Tool/Mode Manager. +Many small bug fixes and lots of work on the Library/Tool/Mode Manager. Full screen is back for Windows, and lots more. -[ bug fixes ] +[ bug fixes ] -+ Fix Windows issues with associating .pde files ++ Fix Windows issues with associating .pde files https://github.com/processing/processing/issues/286 http://code.google.com/p/processing/issues/detail?id=247 @@ -5753,7 +5898,7 @@ Full screen is back for Windows, and lots more. + Setting an INT4 uniform in PShader causes an out of bounds exception https://github.com/processing/processing/issues/1994 -+ Fix "less less" typo ++ Fix "less less" typo https://github.com/processing/processing/issues/1928 + Slash breaks syntax highlighting when spaces are involved @@ -5780,7 +5925,7 @@ Full screen is back for Windows, and lots more. https://github.com/processing/processing/issues/1962 -[ contribution managers ] +[ contribution managers ] + Support multiple categories for libraries https://github.com/processing/processing/issues/1970 @@ -5795,7 +5940,7 @@ Full screen is back for Windows, and lots more. + Restrict library categories to the ones in the document. If it's not correct, shows up as 'other'. -+ Catch Errors (not just Exceptions) when loading libraries, modes, ++ Catch Errors (not just Exceptions) when loading libraries, modes, and tools. Handles UnsupportedClassVersionError and other quirks. + Redo handling of "old" versions of contributions. @@ -5805,7 +5950,7 @@ Full screen is back for Windows, and lots more. https://github.com/processing/processing/pull/1925 -[ data, data, data ] +[ data, data, data ] + Error in IntList and FloatList insert() https://github.com/processing/processing/issues/1929 @@ -5824,7 +5969,7 @@ Full screen is back for Windows, and lots more. https://github.com/processing/processing/issues/1893 + When using increment() on IntList, make sure the index exists and - automatically resize the list if necessary. This is more in keeping + automatically resize the list if necessary. This is more in keeping with increment() in the Dict classes. + getSubset() broken in IntList, StringList, and missing from FloatList @@ -5841,7 +5986,7 @@ Full screen is back for Windows, and lots more. https://github.com/processing/processing/issues/2007 -[ internal changes you'll never notice... unless I broke something ] +[ internal changes you'll never notice... unless I broke something ] + Add an exception wrapper for startup, hopefully we can catch/debug more "Processing can't start!" issues with this. @@ -5869,17 +6014,17 @@ Full screen is back for Windows, and lots more. https://github.com/processing/processing/issues/2010 -[ changes ] +[ changes ] -+ Experimental Mode has been removed from the default download, - so that it can be updated more frequently. Install it and help us ++ Experimental Mode has been removed from the default download, + so that it can be updated more frequently. Install it and help us test what will become the 3.0 release of Processing! + Add "Processing Foundation" to the Help menu. https://github.com/processing/processing/issues/1908 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0.1 (REV 0219) - 21 June 2013 @@ -5887,7 +6032,7 @@ PROCESSING 2.0.1 (REV 0219) - 21 June 2013 Bug fixes for some of what ailed the Processing 2.0 release, including two contributed from Josh Giesbrecht. Thanks Josh! -[ bug fixes ] +[ bug fixes ] + Modes, Tools, Libraries not moving properly on Windows https://github.com/processing/processing/issues/1781 @@ -5896,7 +6041,7 @@ two contributed from Josh Giesbrecht. Thanks Josh! https://github.com/processing/processing/issues/707 http://code.google.com/p/processing/issues/detail?id=668 -+ Fix a problem with exporting Windows applications from OS X and Linux. ++ Fix a problem with exporting Windows applications from OS X and Linux. https://github.com/processing/processing/issues/1890 + getVertex() trying to get three values when no Z-coord is available @@ -5906,7 +6051,7 @@ two contributed from Josh Giesbrecht. Thanks Josh! + Fix typo in default printProjection() method https://github.com/processing/processing/issues/1863 -[ additions ] +[ additions ] + Add error message for that reports what line was bad while parsing a table. (Otherwise confusing ArrayIndexOutOfBoundsException while parsing bad CSV.) @@ -5914,19 +6059,19 @@ two contributed from Josh Giesbrecht. Thanks Josh! + Added option to remove the background image at the top of the window. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0 (REV 0218) - 3 June 2013 -And just like that, here we are at 2.0. +And just like that, here we are at 2.0. -[ bug fixes ] +[ bug fixes ] + Example window has the Java application icon https://github.com/processing/processing/issues/1800 -+ The update checker sometimes insisted there were updates, ++ The update checker sometimes insisted there were updates, even though there were not, due to a build problem. https://github.com/processing/processing/issues/1792 @@ -5957,33 +6102,33 @@ And just like that, here we are at 2.0. + P2D/P3D sketches don't get focus until clicked https://github.com/processing/processing/issues/1700 -[ changes ] +[ changes ] -+ A handful of tweaks to smooth out the 2.0 user interface. - Incorporates some of the feedback suggested here: ++ A handful of tweaks to smooth out the 2.0 user interface. + Incorporates some of the feedback suggested here: https://github.com/processing/processing/pull/1822 while trying to preserve the look & feel of our PDE design. + Added built-in fonts (Source Sans and Source Code from Adobe) - as the default font for the UI and editor. As usual, the editor - font can be changed in preferences.txt. And if you already have + as the default font for the UI and editor. As usual, the editor + font can be changed in preferences.txt. And if you already have a preferences.txt file, the new font won't override it. Fonts for GUI elements can be modified in lib/theme.txt, but be careful with those, and don't complain if/when they break. -+ Added several additional functions for data classes. More details ++ Added several additional functions for data classes. More details in the reference and coming soon. + Changed how null values were handled with binary tables. If anyone - was using the (undocument) .bin format for Table, you'll need to + was using the (undocument) .bin format for Table, you'll need to re-save your data. -+ Changed XML.toString() (what's called when you print() or println() - an XML object) to just send a single line of text instead of a full ++ Changed XML.toString() (what's called when you print() or println() + an XML object) to just send a single line of text instead of a full XML document with a header. Use format(numSpaces) if you want a properly formatted document with declaration at the top. -[ andres on the attack ] +[ andres on the attack ] + PImage not drawn after resize()/get() in P2D/P3D https://github.com/processing/processing/issues/1830 @@ -6028,17 +6173,17 @@ And just like that, here we are at 2.0. https://github.com/processing/processing/issues/1515 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b9 (REV 0217) - 18 May 2013 The 2.0 interface has arrived! Mmm... pretty. -We've removed Android and JavaScript modes from the default download. You +We've removed Android and JavaScript modes from the default download. You can easily install them by selected "Add Mode" from the Mode menu. They've -been removed because the changes have not kept pace with the rest of -Processing, and it was holding up the release of 2.0. As separate projects, +been removed because the changes have not kept pace with the rest of +Processing, and it was holding up the release of 2.0. As separate projects, we hope it'll be easier for volunteers to get involved, rather than our tiny, worn out development team. View the projects here: https://github.com/fjenett/javascript-mode-processing @@ -6051,13 +6196,13 @@ inside Processing. More documentation coming soon! We're hoping this is the last beta before 2.0, but we're still haggling with one or two issues that could require a beta 10. That's a lot of beta. -[ fixes ] +[ fixes ] + Major OutOfMemoryError problem with images fixed by Andres! http://code.google.com/p/processing/issues/detail?id=1353 https://github.com/processing/processing/issues/1391 -+ Lots of fixes for the library/mode/tool manager. ++ Lots of fixes for the library/mode/tool manager. Repairing colors, layout, etc. along with lots of internal fixes. + Fix MovieMaker, it was completely broken @@ -6066,7 +6211,7 @@ with one or two issues that could require a beta 10. That's a lot of beta. + processing-java dialog window was huge https://github.com/processing/processing/issues/1748 -+ Library with bad version number in version causes stack trace to print. ++ Library with bad version number in version causes stack trace to print. Added warning message about it with a pointer to the remedy. + "New version available" mesage is showing HTML tags around it @@ -6100,7 +6245,7 @@ with one or two issues that could require a beta 10. That's a lot of beta. + New images for modes. New design! -+ Added loadJSONArray(), loadJSONObject. ++ Added loadJSONArray(), loadJSONObject. + Hundreds of changes to the new data classes, sorting out their API, etc. @@ -6113,11 +6258,11 @@ with one or two issues that could require a beta 10. That's a lot of beta. + Change error message for libraries (especially serial) for 32- vs 64-bit to clarify that the 32- or 64-bit version of Processing can be used instead. -+ Rebuilt the internal Runner to use SocketAttach... This may bring up ++ Rebuilt the internal Runner to use SocketAttach... This may bring up a firewall message on some machines. Don't worry, it's safe (as long as the message is showing up when you hit Run, that's expected). -+ Add set(x, y) to PVector. ++ Add set(x, y) to PVector. + Removed div() and mult() from PVector, since not a legit math operation. https://code.google.com/p/processing/issues/detail?id=1506 @@ -6141,16 +6286,16 @@ with one or two issues that could require a beta 10. That's a lot of beta. only requires a JRE (and is therefore much smaller!) -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b8 (REV 0216) - 24 February 2013 -Dead bugs on the windscreen as we head down the road to 2.0. +Dead bugs on the windscreen as we head down the road to 2.0. (The fact that we're still in bad metaphor territory suggests we're still a little ways off from 2.0 final.) -[ bugs fixed ] +[ bugs fixed ] + "Find in Reference" broken in 2.0b7 http://code.google.com/p/processing/issues/detail?id=1456 @@ -6172,7 +6317,7 @@ we're still a little ways off from 2.0 final.) + Color coding for if/else in Processing IDE doesn't match http://code.google.com/p/processing/issues/detail?id=1457 -+ Ignore ArrayIndexOutOfBoundsException in JEditTextArea.xToOffset() ++ Ignore ArrayIndexOutOfBoundsException in JEditTextArea.xToOffset() + Fix IllegalStateException on Windows/Linux in Save prompt happened when hitting ESC or otherwise closing the window @@ -6189,7 +6334,7 @@ we're still a little ways off from 2.0 final.) http://code.google.com/p/processing/issues/detail?id=1533 + Fix "Bounds out of range" when outdenting a block of text - Exception in thread "AWT-EventQueue-0" + Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Bounds out of range: 5374,5376 [5375] at processing.app.syntax.JEditTextArea.select(JEditTextArea.java:1214) at processing.app.Editor.handleIndentOutdent(Editor.java:1819) @@ -6204,7 +6349,7 @@ we're still a little ways off from 2.0 final.) + Fix table loading quirk with extensions -+ PImage.resize() greater than image size hangs ++ PImage.resize() greater than image size hangs http://code.google.com/p/processing/issues/detail?id=1463 + loadBytes() does not close input stream @@ -6221,11 +6366,11 @@ we're still a little ways off from 2.0 final.) [ improvements, updates, and changes ] -+ Add basic retina support (text/labels, buttons not yet updated) ++ Add basic retina support (text/labels, buttons not yet updated) to the Mac OS X version. + Clean up the code and interface for the Movie Maker tool - http://code.google.com/p/processing/issues/detail?id=836 + http://code.google.com/p/processing/issues/detail?id=836 + Suggest possible import statements for common Java classes http://code.google.com/p/processing/issues/detail?id=1550 @@ -6252,7 +6397,7 @@ we're still a little ways off from 2.0 final.) + Add clear() to replace background(0, 0, 0, 0) http://code.google.com/p/processing/issues/detail?id=1446 -+ Change heading2D() to just heading() ++ Change heading2D() to just heading() http://code.google.com/p/processing/issues/detail?id=987 + Remove hint(ENABLE_NATIVE_FONTS) @@ -6271,7 +6416,7 @@ we're still a little ways off from 2.0 final.) + Miscellaneous XML fixes and cleanups -[ tool/mode/library manager ] +[ tool/mode/library manager ] + General cleanup of the visuals/layout @@ -6294,7 +6439,7 @@ we're still a little ways off from 2.0 final.) https://github.com/processing/processing/issues/1425 http://code.google.com/p/processing/issues/detail?id=1387 -[ android ] +[ android ] + Update documentation and tools for Android SDK Tools revision 21 http://code.google.com/p/processing/issues/detail?id=1398 @@ -6309,7 +6454,7 @@ we're still a little ways off from 2.0 final.) + Remove mouseEvent and keyEvent variables (deprecated on desktop) -[ table ] +[ table ] + Added lastRowIndex() @@ -6330,7 +6475,7 @@ we're still a little ways off from 2.0 final.) + Added getColumnCount() to TableRow -[ andres assault ] +[ andres assault ] + P3D sketches failing to run http://code.google.com/p/processing/issues/detail?id=1500 @@ -6405,7 +6550,7 @@ we're still a little ways off from 2.0 final.) + P2D, P3D drawing errors in static mode, gray screen https://github.com/processing/processing/issues/1648 - Still seeing a few of these in some cases, but hopefully + Still seeing a few of these in some cases, but hopefully this is fixed for the most part. [ manindra magic ] @@ -6423,24 +6568,24 @@ we're still a little ways off from 2.0 final.) http://code.google.com/p/processing/issues/detail?id=1504 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b7 (REV 0215) - 7 December 2012 -475,382 bug fixes in this release as we work on finalizing 2.0. +475,382 bug fixes in this release as we work on finalizing 2.0. -[ changes ] +[ changes ] -+ Removed all imports that aren't covered in the Processing reference. ++ Removed all imports that aren't covered in the Processing reference. If you use java.awt, java.util, or other classes in your sketch, you will need to add an import line to the beginning of your sketch. - Only the classes that are covered in the reference (HashMap, ArrayList, + Only the classes that are covered in the reference (HashMap, ArrayList, and some others) are now imported by default. This has been done to improve - overall cross-platform parity and to avoid users unknowingly adding + overall cross-platform parity and to avoid users unknowingly adding Java classes, and then the sadness that comes when switching to Android - or JavaScript modes. + or JavaScript modes. The list of imports is now hard-coded (no longer read from preferences.txt) and includes the following: @@ -6452,11 +6597,11 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 import java.io.OutputStream; import java.io.IOException; - If we're missing anything that's covered in the reference, please let us + If we're missing anything that's covered in the reference, please let us know via the bugs database. + A new "experimental" mode has been added. It's the start of combining two - of our Google Summer of Code projects (DebugMode and XQMode) to enable + of our Google Summer of Code projects (DebugMode and XQMode) to enable a debugger and on-the-fly error checking. We're including it in the release so that folks can test it out and let us know how it's doing. The interface still needs work and its innards may be a bit buggy, but it represents @@ -6478,16 +6623,16 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 http://code.google.com/p/processing/issues/detail?id=1354 http://guides.macrumors.com/Keyboard_shortcuts§ion=10#Text_Shortcuts -+ Set quality level higher when exporting JPEG images. This will result - in larger JPEG files with save() and saveFrame(), but the default quality - setting in the past was unacceptable for many/most projects. ++ Set quality level higher when exporting JPEG images. This will result + in larger JPEG files with save() and saveFrame(), but the default quality + setting in the past was unacceptable for many/most projects. http://code.google.com/p/processing/issues/detail?id=58 - See the bug report link for how to implement in case you want to set + See the bug report link for how to implement in case you want to set the quality lower (or even higher) than the new default. + Table row iterating syntax has changed. This code: for (TableRow row : table) { ... } - has now changed to + has now changed to for (TableRow row : table.getRows()) { ... } (This may change to rows() on the next round, pending other API tweaks) @@ -6528,10 +6673,10 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 + Change output from processing-java to be UTF-8 encoded. http://code.google.com/p/processing/issues/detail?id=1418 -+ Disable Quartz renderer to fix line blending problem on OS X. ++ Disable Quartz renderer to fix line blending problem on OS X. This older renderer was faster but had some bugs, like one that - caused lines to composite incorrectly when alpha was used. - Add "PApplet.useQuartz = true;" into your PApplet.main() + caused lines to composite incorrectly when alpha was used. + Add "PApplet.useQuartz = true;" into your PApplet.main() function to switch back to the old method: http://processing.googlecode.com/svn/trunk/processing/build/javadoc/core/processing/core/PApplet.html#useQuartz @@ -6539,7 +6684,7 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 http://code.google.com/p/processing/issues/detail?id=613 -[ bug fixes ] +[ bug fixes ] + mouseButton not being set properly in mouseClicked. http://code.google.com/p/processing/issues/detail?id=1350 @@ -6550,17 +6695,17 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 + mousePressed() coloring now different from mousePressed http://code.google.com/p/processing/issues/detail?id=41 Still not necessarily perfect, but it's a big improvement. - Note for people implementing their own Modes: FUNCTION1 and + Note for people implementing their own Modes: FUNCTION1 and FUNCTION2 have now been added for functions with parens. + 32-bit mode / 64-bit mode preference was ignored on OS X. http://code.google.com/p/processing/issues/detail?id=1426 -+ Prevent errors on first line of a new tab from highlighting the last - line of the previous tab. In particular, a single letter on a new tab ++ Prevent errors on first line of a new tab from highlighting the last + line of the previous tab. In particular, a single letter on a new tab was highlighting the last line of the tab to its left. -+ Android debug information wasn't being passed through to the console. ++ Android debug information wasn't being passed through to the console. In addition, on Windows, error reporting wasn't working properly (couldn't find the right line or report the error correctly). http://code.google.com/p/processing/issues/detail?id=1440 @@ -6573,7 +6718,7 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 + P2D/P3D PGraphics buffer failing to draw if larger than main surface. http://code.google.com/p/processing/issues/detail?id=1255 -+ Fix double error report when textMode(SCREEN) was used: ++ Fix double error report when textMode(SCREEN) was used: textMode(SCREEN) has been removed from Processing 2.0. textMode(256) is not supported by this renderer. @@ -6666,7 +6811,7 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 + Using a PGraphics as a texture produces visual artifacts. http://code.google.com/p/processing/issues/detail?id=1420 -[ android ] +[ android ] + Like the desktop release, removed default imports. This includes: android.view.MotionEvent, android.view.KeyEvent,android.graphics.Bitmap @@ -6674,17 +6819,17 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 cross-platform compatibility between Java, JavaScript, and Android modes. + Changed event handling to hopefully clean up some inconsistencies. - Removed motionX/Y/Pressure... these need to be handled separately. + Removed motionX/Y/Pressure... these need to be handled separately. More here: http://wiki.processing.org/w/Android -+ mouseX/Y no longer include history with moves, which reduces fidelity ++ mouseX/Y no longer include history with moves, which reduces fidelity a bit, but will hopefully prevent us overdoing it for future releases. + Fix how pmouseX/Y are set. http://code.google.com/p/processing/issues/detail?id=238 http://code.google.com/p/processing/issues/detail?id=1018 -[ fixed earlier / cleaning ] +[ fixed earlier / cleaning ] + When turning smoothing on, internal lines of shapes are visible. http://code.google.com/p/processing/issues/detail?id=53 @@ -6753,15 +6898,15 @@ PROCESSING 2.0b7 (REV 0215) - 7 December 2012 http://code.google.com/p/processing/issues/detail?id=929 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b6 (REV 0214) - 2 November 2012 -Patching up command line issues that went backwards in the last release, -a number of OpenGL fixes, and more internal changes and updates. +Patching up command line issues that went backwards in the last release, +a number of OpenGL fixes, and more internal changes and updates. -[ bug fixes ] +[ bug fixes ] + Command line support was broken in 2.0b5, with an error about processing-java ClassNotFoundException: BatchCompiler @@ -6775,31 +6920,31 @@ a number of OpenGL fixes, and more internal changes and updates. http://code.google.com/p/processing/issues/detail?id=911 + Editor not responding properly if the "External Editor" preference - had been enabled with a previous release. + had been enabled with a previous release. http://code.google.com/p/processing/issues/detail?id=1355 + A number of OpenGL fixes to better handle older chipsets, like the - GMA 950 (found on lots of older Mac Minis and similar hardware). + GMA 950 (found on lots of older Mac Minis and similar hardware). + Reverted back to an older version of the JOGL library to prevent - issues with sketches locking up. In particular, this should fix - sketches that use the video library: + issues with sketches locking up. In particular, this should fix + sketches that use the video library: http://code.google.com/p/processing/issues/detail?id=1338 http://code.google.com/p/processing/issues/detail?id=1364 + Icon loading was causing an error if you used a package for your code. http://code.google.com/p/processing/issues/detail?id=1346 -+ No longer using --request on OS X 10.6, since it's not available. ++ No longer using --request on OS X 10.6, since it's not available. Avoids a harmless warning message on the console when running a sketch. -[ changes/additions ] +[ changes/additions ] + Added an option to Preferences to enable/disable advanced input method support to handle complex scripts like Japanese, Korean, or Chinese. http://code.google.com/p/processing/issues/detail?id=526 -+ Add option for blinking and/or block caret in the editor. To disable ++ Add option for blinking and/or block caret in the editor. To disable caret blinking in the text editor, add this line to preferences.txt: editor.caret.blink = true Or to just a block caret, use this: @@ -6808,7 +6953,7 @@ a number of OpenGL fixes, and more internal changes and updates. [ internal ] -+ Removed applet-related preferences, and the 'applet' subfolder in the ++ Removed applet-related preferences, and the 'applet' subfolder in the source/distribution. + Removed the old 'cmd' folder from the source/distribution @@ -6816,11 +6961,11 @@ a number of OpenGL fixes, and more internal changes and updates. + Preferences are now written in sorted order to make it easier to handle comparisons or other debugging. -+ Major change to handle how the 'lib' folder is found, hopefully does a ++ Major change to handle how the 'lib' folder is found, hopefully does a better job with command line support. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b5 (REV 0213) - 22 October 2012 @@ -6828,7 +6973,7 @@ PROCESSING 2.0b5 (REV 0213) - 22 October 2012 Fixes for a few regressions that showed up in 2.0b4, plus some internal changes to simplify how modes are handled. -[ bug fixes ] +[ bug fixes ] + Libraries not installed through IDE had blank names. http://code.google.com/p/processing/issues/detail?id=1331 @@ -6839,17 +6984,17 @@ changes to simplify how modes are handled. + Console disappearing with increased editor font size. http://code.google.com/p/processing/issues/detail?id=1275 -[ changes/internal ] +[ changes/internal ] + Change how modes are set up so that XQMode, our Google Summer of Code project can work properly. -+ Implement multiple sizes of icons for PDE and core. This improves ++ Implement multiple sizes of icons for PDE and core. This improves the quality of the icon seen on Windows and Linux attached to frames. http://code.google.com/p/processing/issues/detail?id=632 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b4 (REV 0212) - 21 October 2012 @@ -6857,11 +7002,11 @@ PROCESSING 2.0b4 (REV 0212) - 21 October 2012 Command line support is back! Find and Replace works over multiple tabs! The Mac OS X version should work again in spite of Apple's best efforts! -[ additions & removals ] +[ additions & removals ] -+ Command line support is now available for Java mode. On Windows and Linux, - use the processing-java program. On Mac OS X, there's an option in the - Tools menu to install the command line tool. ++ Command line support is now available for Java mode. On Windows and Linux, + use the processing-java program. On Mac OS X, there's an option in the + Tools menu to install the command line tool. http://code.google.com/p/processing/issues/detail?id=142 Build and export options should even work in headless mode when enabled @@ -6871,21 +7016,21 @@ The Mac OS X version should work again in spite of Apple's best efforts! Android and JavaScript mode are not supported, contributions are welcome: http://code.google.com/p/processing/issues/detail?id=1323 -+ Added a Tool for Mac OS X to help set up serial port. Using serial on ++ Added a Tool for Mac OS X to help set up serial port. Using serial on OS X requires some incantations on the command line, and this prompts for an administrator password and takes care of them for you. The commands - involve creating a folder and setting a few permissions. If everything + involve creating a folder and setting a few permissions. If everything is already set properly, the Tool will not be present in the Tools menu. + With the arrival of command line support, the misunderstood and sometimes - maligned "Use External Editor" option has been removed. + maligned "Use External Editor" option has been removed. http://code.google.com/p/processing/issues/detail?id=515 + Fix several problems introduced by Apple's recent Java "update". Apple's most recent Java update may render older versions of Processing - completely unusable, it's not quite clear yet. + completely unusable, it's not quite clear yet. -[ bug fixes ] +[ bug fixes ] + Fix the exceptionally slow startup (a 5 second delay) in recent releases. @@ -6907,30 +7052,30 @@ The Mac OS X version should work again in spite of Apple's best efforts! + mouseButton wasn't getting set on mouseReleased() http://code.google.com/p/processing/issues/detail?id=1294 -[ technical updates ] +[ technical updates ] + JOGL has been updated, which may help iron out some GL quirks. + Change all build.xml files to use Java 6 as both source and target (avoids Java 7 warnings during build). -+ Updated ecj.jar to use jdt-core.jar... This is a larger file but were ++ Updated ecj.jar to use jdt-core.jar... This is a larger file but were hoping that this would get our GSoC project "XQMode" working without the need for patches. Sadly that's not the case, but stay tuned. -[ known issues ] +[ known issues ] + Fewer exclamation points will be used to introduce future releases. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b3 (REV 0211) - 10 September 2012 Shaking out the beta bugs. -[ major fixes ] +[ major fixes ] + registerMethod("keyEvent", ...) not calling key event methods. http://code.google.com/p/processing/issues/detail?id=1225 @@ -6940,13 +7085,13 @@ Shaking out the beta bugs. http://code.google.com/p/processing/issues/detail?id=1226 + Restore deprecated versions of getFont() and getImage() to address - library compatibility issues. The similar getBitmap() and getTypeface() + library compatibility issues. The similar getBitmap() and getTypeface() methods on Android will not be restored. http://code.google.com/p/processing/issues/detail?id=1223 -[ minor fixes ] +[ minor fixes ] -+ Changing the default display in Preferences does not reset editor ++ Changing the default display in Preferences does not reset editor location, so it appears to have no effect. http://code.google.com/p/processing/issues/detail?id=1162 @@ -6955,7 +7100,7 @@ Shaking out the beta bugs. + Make Mode menu into a radio button, so it cannot be de-selected http://code.google.com/p/processing/issues/detail?id=1227 -[ changes and additions ] +[ changes and additions ] + Show error message when using createGraphics() with P2D, P3D, or OPENGL and the main drawing surface is not an OpenGL renderer. @@ -6972,19 +7117,19 @@ Shaking out the beta bugs. Fingers crossed that these don't give us last-minute regressions. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b2 (REV 0210) - 7 September 2012 -One major fix for libraries that use key events, and a number of minor -fixes that we've found along the way. +One major fix for libraries that use key events, and a number of minor +fixes that we've found along the way. -[ fixes and updates ] +[ fixes and updates ] + Libraries with using key events were reporting: "java.lang.IllegalArgumentException: argument type mismatch" - in beta 1, this is now fixed. + in beta 1, this is now fixed. + Added hint(ENABLE_STROKE_PURE) to deal with Java 2D regression. http://code.google.com/p/processing/issues/detail?id=1137 @@ -6992,13 +7137,13 @@ fixes that we've found along the way. + Fix for stroke with beginShape(TRIANGLE_FAN) http://code.google.com/p/processing/issues/detail?id=1137 -+ hint() documentation now updated (except for the hint above). ++ hint() documentation now updated (except for the hint above). http://code.google.com/p/processing/issues/detail?id=1144 + Using ortho() breaks stroke rendering http://code.google.com/p/processing/issues/detail?id=1207 -[ fixed earlier ] +[ fixed earlier ] + POINTS mode vertices are huge http://code.google.com/p/processing/issues/detail?id=1037 @@ -7006,7 +7151,7 @@ fixes that we've found along the way. + Potentially insufficient ellipse detail with P3D/OPENGL when scaled http://code.google.com/p/processing/issues/detail?id=87 -+ Implement support for complex shapes when using the OpenGL renderer ++ Implement support for complex shapes when using the OpenGL renderer http://code.google.com/p/processing/issues/detail?id=122 + modelX/Y/Z broken when aiming a camera @@ -7021,18 +7166,18 @@ fixes that we've found along the way. + Memory improvements for updatePixels() with OpenGL (P2D and P3D) http://code.google.com/p/processing/issues/detail?id=77 -+ Text characters showing up as opaque rectangles ++ Text characters showing up as opaque rectangles http://code.google.com/p/processing/issues/detail?id=80 + Changing framerate causes program to crash with P2D in 2.0a6 http://code.google.com/p/processing/issues/detail?id=1116 -[ android ] +[ android ] + Updated examples from Andres and categories in the examples browser. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0b1 (REV 0209) - 3 September 2012 @@ -7040,16 +7185,16 @@ PROCESSING 2.0b1 (REV 0209) - 3 September 2012 Bug fixes, new registered methods for libraries, updated keywords, and we're beta! -[ changes ] +[ changes ] -+ Require 10.6.8 as minimum Mac OS X system version. ++ Require 10.6.8 as minimum Mac OS X system version. + Change name from "Standard" to "Java" mode. + Save opened/closed state of entries in the examples browser http://code.google.com/p/processing/issues/detail?id=827 -+ Lots of internal changes to loadShape() and PShape. ++ Lots of internal changes to loadShape() and PShape. + Work on making API more generic and consistent for cross-platform use. Font PFont.getFont() -> Object PFont.getNative() @@ -7057,15 +7202,15 @@ and we're beta! Image PImage.getImage() -> Object PImage.getNative() Bitmap PImage.getBitmap() -> Object PImage.getNative() -+ beginGL() and endGL() are gone, and beginPGL() and endPGL() exist - in their place. The PGL class is a layer that lets us talk to ++ beginGL() and endGL() are gone, and beginPGL() and endPGL() exist + in their place. The PGL class is a layer that lets us talk to OpenGL in a way that's cross-platform and consistent. It also has many GL calls for people who want to access GL directly. -+ New syntax introduced for libraries and registered methods. ++ New syntax introduced for libraries and registered methods. Documentation coming soon. -[ bug fixes ] +[ bug fixes ] + Handle dimming the Find/Replace buttons. http://code.google.com/p/processing/issues/detail?id=1056 @@ -7086,33 +7231,33 @@ and we're beta! + GL Android sketches halting after rotation. http://code.google.com/p/processing/issues/detail?id=1146 -[ known issues ] +[ known issues ] + createShape() is not implemented with the default 2D renderer. -+ See the Changes page on the Wiki for more. ++ See the Changes page on the Wiki for more. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a9 (REV 0208) - 1 September 2012 -As we inch closer to beta, a quick release for testing. +As we inch closer to beta, a quick release for testing. Plenty of video and OpenGL graphics fixes from Andres, and some functions -disappearing due to cleanups by Ben. (Andres giveth, Ben taketh away). +disappearing due to cleanups by Ben. (Andres giveth, Ben taketh away). -Consider this one to be 'nightly build' quality. +Consider this one to be 'nightly build' quality. -[ general ] +[ general ] + Help menu broken when Processing has spaces in its path name in 2.0a8 http://code.google.com/p/processing/issues/detail?id=1164 + We now have repeating textures. Use textureWrap(CLAMP) (the usual version) or textureWrap(REPEAT). If this feature is used for evil - and cheesiness, it will be removed in future releases. + and cheesiness, it will be removed in future releases. http://code.google.com/p/processing/issues/detail?id=94 + Fix lights in GL renderers on low-end android devices. @@ -7121,7 +7266,7 @@ Consider this one to be 'nightly build' quality. + Pixels for createGraphics() now transparent for P2D, P3D. http://code.google.com/p/processing/issues/detail?id=1156 -[ video ] +[ video ] + GettingStartedCapture in 2.0a8 launches X11 in Mountain Lion http://code.google.com/p/processing/issues/detail?id=1191 @@ -7144,7 +7289,7 @@ Consider this one to be 'nightly build' quality. + Wrong resolutions reported by Capture.list() http://code.google.com/p/processing/issues/detail?id=1192 -[ advanced ] +[ advanced ] + Several constants moved out of PConstants and into PGraphics. @@ -7155,16 +7300,16 @@ Consider this one to be 'nightly build' quality. + Removed several video functions that weren't approved. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a8 (REV 0207) - 5 August 2012 -A handful of bug fixes. Not as large a release as 2.0a7, but I decided +A handful of bug fixes. Not as large a release as 2.0a7, but I decided it best to get the updates out there and in use rather than waiting for -beta 1 since I'm not sure when we'll be able to get that out. +beta 1 since I'm not sure when we'll be able to get that out. -[ miscellaneous ] +[ miscellaneous ] + Make sure smooth() is the default with both renderers http://code.google.com/p/processing/issues/detail?id=1157 @@ -7186,10 +7331,10 @@ beta 1 since I'm not sure when we'll be able to get that out. + Added 'empty sketchbook' indicator when the sketchbook menus are empty -+ Prevent users from deleting the last tab on the only sketch that is - currently open on Windows and Linux. ++ Prevent users from deleting the last tab on the only sketch that is + currently open on Windows and Linux. -[ serial ] +[ serial ] + Added 64-bit RXTX for Mac OS X serial from this page: http://blog.iharder.net/2009/08/18/rxtx-java-6-and-librxtxserial-jnilib-on-intel-mac-os-x/ @@ -7201,7 +7346,7 @@ beta 1 since I'm not sure when we'll be able to get that out. + bufferUntil() with values above 127 do not work properly http://code.google.com/p/processing/issues/detail?id=1079 -[ plumbing ] +[ plumbing ] + Switch to using java.awt.Desktop classes for opening folders, links, etc. @@ -7216,31 +7361,31 @@ beta 1 since I'm not sure when we'll be able to get that out. + Added notes about "color(0, 0, 0, 0) produces black" to the Wiki. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a7 (REV 0206) - 29 July 2012 -Hopefully the last alpha before we hit 2.0 beta. +Hopefully the last alpha before we hit 2.0 beta. The big change is that we're dropping support for applets in 2.0, and in this release. See the Changes section of the Wiki for details. We've not updated all of the documentation to reflect this yet. -OS X 10.8 Mountain Lion support has also been added, by virtue of our +OS X 10.8 Mountain Lion support has also been added, by virtue of our paying $99/year for the privilege of releasing our free and open source application on OS X. When run on 10.8, versions prior to 2.0a7 would report -that they were corrupt, invalid, or not trusted. Which is definitely us. +that they were corrupt, invalid, or not trusted. Which is definitely us. -[ editor ] +[ editor ] -+ Implemented a "Recent Sketches" menu. This replaces re-opening - sketches on startup, which behaved inconsistently anyway. ++ Implemented a "Recent Sketches" menu. This replaces re-opening + sketches on startup, which behaved inconsistently anyway. http://code.google.com/p/processing/issues/detail?id=188 + Use Swing file choosers by default on Linux. The default open/save - dialogs provided by Java are pretty gruesome, so we're switching to - the Swing JFileChooser instead. To swap the behavior, set + dialogs provided by Java are pretty gruesome, so we're switching to + the Swing JFileChooser instead. To swap the behavior, set 'chooser.files.native' in your preferences.txt file. + Suppress "invalid context 0x0" and "invalid drawable" because they're @@ -7256,13 +7401,13 @@ that they were corrupt, invalid, or not trusted. Which is definitely us. updates for 32/64-bit support in general. http://code.google.com/p/processing/issues/detail?id=955 -+ Replace processing.exe with a more standard version from launch4j, ++ Replace processing.exe with a more standard version from launch4j, which should hopefully clean up some launcher issues. http://code.google.com/p/processing/issues/detail?id=943 http://code.google.com/p/processing/issues/detail?id=176 + Change how sketches open so that there's no longer differences between - the File menu 'Open' and the way it worked from the toolbar. Simplifies + the File menu 'Open' and the way it worked from the toolbar. Simplifies additional code that was quirky. http://code.google.com/p/processing/issues/detail?id=1034 @@ -7274,18 +7419,18 @@ that they were corrupt, invalid, or not trusted. Which is definitely us. + Instead of prompting for sketchbook location on Linux, just default to a folder named 'sketchbook' in the user's home directory. This can easily - be changed later but simplifies things internally a bit. + be changed later but simplifies things internally a bit. -+ No longer allow underscore at beginning of sketch name (causes problems ++ No longer allow underscore at beginning of sketch name (causes problems with Android, and also with applets, though we care less about those...) http://code.google.com/p/processing/issues/detail?id=1047 -+ Fixed a problem where sanitized names (underscores replacing unusable ++ Fixed a problem where sanitized names (underscores replacing unusable characters) could potentially overwrite existing folders. -[ core ] +[ core ] -+ Major changes to selectInput(), selectOutput(), and selectFolder(). ++ Major changes to selectInput(), selectOutput(), and selectFolder(). See the Wiki: http://wiki.processing.org/w/Changes#Change_and_Removed The changes are there to prevent a threading bug: http://code.google.com/p/processing/issues/detail?id=173 @@ -7294,9 +7439,9 @@ that they were corrupt, invalid, or not trusted. Which is definitely us. http://code.google.com/p/processing/issues/detail?id=233 + Change 'appletViewer' back to 'online'. Still deprecated, especially - because applets are going away. + because applets are going away. -+ Add begin/endGL added to PGraphics/PApplet. ++ Add begin/endGL added to PGraphics/PApplet. + Add hasChildren() to XML library. http://code.google.com/p/processing/issues/detail?id=1045 @@ -7304,8 +7449,8 @@ that they were corrupt, invalid, or not trusted. Which is definitely us. + Fix where displayWidth/Height not being set properly before setup() http://code.google.com/p/processing/issues/detail?id=1120 -+ XML now throws exceptions in its constructor (for advanced users). - Use loadXML() instead of "new XML(this, ....)" ++ XML now throws exceptions in its constructor (for advanced users). + Use loadXML() instead of "new XML(this, ....)" http://code.google.com/p/processing/issues/detail?id=1138 + loadXML() returns null when the file did not open properly @@ -7315,11 +7460,11 @@ that they were corrupt, invalid, or not trusted. Which is definitely us. http://code.google.com/p/processing/issues/detail?id=1143 + Add some extra options for PApplet.main() for advanced users: - PApplet.main("SketchName") and PApplet.main("SketchName", args) + PApplet.main("SketchName") and PApplet.main("SketchName", args) -[ android ] +[ android ] -+ Add full PAppletMethods implementation to Android, so that PGraphics ++ Add full PAppletMethods implementation to Android, so that PGraphics and PImage methods are brought into PApplet. + Swap Run on Device and Run on Emulator @@ -7332,7 +7477,7 @@ that they were corrupt, invalid, or not trusted. Which is definitely us. http://code.google.com/p/processing/issues/detail?id=1054 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a6 (REV 0205) - 1 June 2012 @@ -7349,9 +7494,9 @@ http://wiki.processing.org/w/Changes + Added an option for selecting the default display inside Preferences. -+ P2D and P3D are now variations of the OpenGL renderer. ++ P2D and P3D are now variations of the OpenGL renderer. -+ XML and Table are now part of the processing.data.* package. ++ XML and Table are now part of the processing.data.* package. There's also new loadTable() and loadXML() methods in PApplet. [ bug fixes ] @@ -7377,7 +7522,7 @@ http://wiki.processing.org/w/Changes + When internal tools crash, don't add them to the menu (prevents the PDE from locking up on startup). -[ fixed earlier ] +[ fixed earlier ] + Export reports "Could not copy source file" (even though it works) http://code.google.com/p/processing/issues/detail?id=638 @@ -7410,19 +7555,19 @@ http://wiki.processing.org/w/Changes + Make displayWidth/Height work properly with multiple screen. (In the past, screen.width and screen.height just returned the default - display size, not necessarily the display being used.) + display size, not necessarily the display being used.) + Built in Hansi's full screen API for OS X, so that sketches can use full screen without exclusive mode. See the Wiki for details. http://wiki.processing.org/w/Window_Size_and_Full_Screen -+ Now attempts detect when a sketch's size is the full screen, ++ Now attempts detect when a sketch's size is the full screen, and if so removes the frame border, etc. + --display option now works properly (on OS X and elsewhere) http://code.google.com/p/processing/issues/detail?id=71 -[ OpenGL by Andres ] +[ OpenGL by Andres ] + polygon shapes without fill slowdown render progressively http://code.google.com/p/processing/issues/detail?id=1028 @@ -7457,11 +7602,11 @@ http://wiki.processing.org/w/Changes + OpenGL noSmooth() does not work http://code.google.com/p/processing/issues/detail?id=328 -[ android ] +[ android ] + Android SDK Tools revision 19 (later may work too) are required. -+ Android mode no longer broken on Windows. Google has fixed the bug, ++ Android mode no longer broken on Windows. Google has fixed the bug, but you'll need to use the latest SDK. http://code.google.com/p/processing/issues/detail?id=1022 @@ -7478,32 +7623,32 @@ http://wiki.processing.org/w/Changes http://code.google.com/p/processing/issues/detail?id=751 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a5 (REV 0204) - 23 March 2012 Major updates in this release include a huge revamp of the OpenGL library -by Andres, fixes to get Android Mode working again, and a number of bug +by Andres, fixes to get Android Mode working again, and a number of bug fixes and additions as we head toward 2.0. Unfortunately, however, Android mode is still broken on Windows. http://code.google.com/p/processing/issues/detail?id=1022 -On the OpenGL front, we're working to have a single library that works -across both desktop and mobile, which is good news because it means we have -a fighting chance of making it work (rather than maintaining two entire sets -of a very complicated set of code), but the downside is that it requires -newer versions of OpenGL on both the desktop and mobile, so it may cause -problems with old OSes, mediocre graphics drivers, etc that worked with +On the OpenGL front, we're working to have a single library that works +across both desktop and mobile, which is good news because it means we have +a fighting chance of making it work (rather than maintaining two entire sets +of a very complicated set of code), but the downside is that it requires +newer versions of OpenGL on both the desktop and mobile, so it may cause +problems with old OSes, mediocre graphics drivers, etc that worked with earlier releases. -[ bug fixes ] +[ bug fixes ] + OpenGL applets are working again. http://code.google.com/p/processing/issues/detail?id=845 -+ Abnormal high Java CPU usage at empty sketch with draw() ++ Abnormal high Java CPU usage at empty sketch with draw() http://code.google.com/p/processing/issues/detail?id=729 + "Framingham" example has BufferOverflowException @@ -7515,7 +7660,7 @@ earlier releases. + Doc comments not being properly terminated in export of applet http://code.google.com/p/processing/issues/detail?id=877 -+ Tweaks to the code to prevent multiple copies of Processing from ++ Tweaks to the code to prevent multiple copies of Processing from running at once. + Fix bug with 'base' not getting set in the Mac OS X platform class. @@ -7534,7 +7679,7 @@ earlier releases. + Several bug fixes inside Table as they relate to inserting/adding columns. -[ changes/additions ] +[ changes/additions ] + Enable smooth() by default. @@ -7545,7 +7690,7 @@ earlier releases. + Update to Java 6u29 for Linux and Windows (OS X now updated). -+ Don't show library conflict warning until someone tries to build ++ Don't show library conflict warning until someone tries to build with code that actually calls on one of those packages. + urlEncode() and urlDecode() added (docs coming later). @@ -7553,9 +7698,9 @@ earlier releases. + delay() is back again. F*king delay(). + Added anti-alias methods so that FSAA can set up properly. The API for - these is not set yet. + these is not set yet. -[ in earlier releases ] +[ in earlier releases ] + Commenting via menu or shortcut does not set sketch to "need save". http://code.google.com/p/processing/issues/detail?id=860 @@ -7573,7 +7718,7 @@ earlier releases. + Closing applet window in Processing 1.5 causes serial crash. http://code.google.com/p/processing/issues/detail?id=635 -[ javascript ] +[ javascript ] + Finalize JavaScript mode export folder name. http://code.google.com/p/processing/issues/detail?id=848 @@ -7582,7 +7727,7 @@ earlier releases. http://code.google.com/p/processing/issues/detail?id=936 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a4 (REV 0203) - 10 November 2011 @@ -7590,7 +7735,7 @@ PROCESSING 2.0a4 (REV 0203) - 10 November 2011 This is just a quick release so that I can procrastinate on packing for Chicago a little longer. A handful of bug fixes here: -+ Video capture was broken in 2.0a3 on OS X due to an issue with the build ++ Video capture was broken in 2.0a3 on OS X due to an issue with the build process. Should be all set now. + Fixed incessant "inefficient font rendering" debug message on Android. @@ -7603,7 +7748,7 @@ Chicago a little longer. A handful of bug fixes here: messages when natives aren't available for the platform--just an UnsatisfiedLinkError when you try to run. Will fix.) -[ andres' bug victims ] +[ andres' bug victims ] + Multiple calls to curve() connect subsequent curves with lines in P3D/OPENGL http://code.google.com/p/processing/issues/detail?id=865 @@ -7612,18 +7757,18 @@ Chicago a little longer. A handful of bug fixes here: http://code.google.com/p/processing/issues/detail?id=890 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a3 (REV 0202) - 5 November 2011 Some weekend bug fixing and regression repair for the recent alpha releases. -Also several Android fixes to get things working again with more recent -updates from Google. You'll need to upgrade to this version of Processing +Also several Android fixes to get things working again with more recent +updates from Google. You'll need to upgrade to this version of Processing in order to continue using Android mode. -[ environment ] +[ environment ] + Fix problem with serial not loading on Mac OS X. @@ -7641,14 +7786,14 @@ in order to continue using Android mode. + IDE Export Application button exports applet (fixed in 2.0a2) http://code.google.com/p/processing/issues/detail?id=863 -[ core ] +[ core ] + Fix for video frames not showing up in 3D. + Rounded rect() does not have a maximum length for corner radius http://code.google.com/p/processing/issues/detail?id=813 -[ android ] +[ android ] + Fix libraries when used with Android. Libraries can also specify an Android version by including an 'android' subfolder. @@ -7672,7 +7817,7 @@ in order to continue using Android mode. http://code.google.com/p/processing/issues/detail?id=864 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a2 (REV 0201) - 31 October 2011 @@ -7680,12 +7825,12 @@ PROCESSING 2.0a2 (REV 0201) - 31 October 2011 Happy Halloween! I'll be dressing up as an ArrayIndexOutOfBoundsException. This release is primarily focused on the new video library and making it -usable across platforms. It also has some changes for how applications +usable across platforms. It also has some changes for how applications are exported, and a number of other bug fixes and tweaks. -[ platforms ] +[ platforms ] -+ With this release, Java 1.6 is now required. We will no longer be ++ With this release, Java 1.6 is now required. We will no longer be supporting Java 1.5. + In perhaps related news, we are no longer supporting Mac OS X 10.5. @@ -7698,21 +7843,21 @@ are exported, and a number of other bug fixes and tweaks. 64-bit. Library support has changed significantly to get things working, more on this coming soon. -+ Serial on Mac OS X and Windows is currently only available for 32-bit. - Hoping someone can help us support a 64-bit version sometime soon. ++ Serial on Mac OS X and Windows is currently only available for 32-bit. + Hoping someone can help us support a 64-bit version sometime soon. + When exporting a 64-bit application for Windows, a .bat file is created, because our .exe doesn't yet support 64-bit. Assuming you have a 64-bit JVM installed, the .bat file should load things properly. -+ Because serial only supports 32-bit on OS X, exporting an application - that uses serial will only create a application.macosx32 folder, which - is a 32-bit app for Mac OS X. No application.macosx64 will be created, - nor will a universal application.macosx folder. This is also the case ++ Because serial only supports 32-bit on OS X, exporting an application + that uses serial will only create a application.macosx32 folder, which + is a 32-bit app for Mac OS X. No application.macosx64 will be created, + nor will a universal application.macosx folder. This is also the case for other libraries that have only 32- or 64-bit support. See earlier note that 32- and 64-bit support is an f*ing nightmare. -[ video ] +[ video ] + The most significant change in this release is that the new video library from Andres (based on his old gsvideo library) is nearing fully fucntional. @@ -7723,10 +7868,10 @@ are exported, and a number of other bug fixes and tweaks. [ other changes ] -+ Application is now the default export (instead of Applet). ++ Application is now the default export (instead of Applet). + Change to how dataPath() and dataFile() work. This is an undocumented - function, but for those using it, here's the skinny: + function, but for those using it, here's the skinny: dataPath() is only available with applications, not applets or Android. On Windows and Linux, this is simply the data folder, which is located @@ -7741,26 +7886,26 @@ are exported, and a number of other bug fixes and tweaks. works with an applet, you should use other methods such as createInput(), createReader(), or loadStrings(). -+ Additional library files included with application exports are now placed ++ Additional library files included with application exports are now placed in the 'lib' folder on Linux and Windows, or buried inside the OS X app. This helps prevent the unsightly mess of DLLs that were crowding the root folder of exported applications on Windows and Linux. -+ If noLoop() has been called but a sketch is resized, redraw() will be ++ If noLoop() has been called but a sketch is resized, redraw() will be called to update the screen. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 2.0a1 (REV 0200) - 2 September 2011 -First alpha release as we head toward 2.0. Please read the changes page +First alpha release as we head toward 2.0. Please read the changes page to learn about what's different: http://wiki.processing.org/w/Changes -[ since we last spoke ] +[ since we last spoke ] -+ Lots of video work from Andres. ++ Lots of video work from Andres. + Updated to Java 6u26 on Windows and Linux. @@ -7779,16 +7924,16 @@ to learn about what's different: http://wiki.processing.org/w/Changes + PImage.save() with full path raises exception http://code.google.com/p/processing/issues/detail?id=808 -+ Fix problem where loading data from an http:// stream would - run out of memory on Android. ++ Fix problem where loading data from an http:// stream would + run out of memory on Android. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0199 - 27 June 2011 -Handful of bug fixes, primarly to deal with issues introduced in 0198. +Handful of bug fixes, primarly to deal with issues introduced in 0198. + Remove error messages for UpdateCheck w/o internet connection. @@ -7804,15 +7949,15 @@ Handful of bug fixes, primarly to deal with issues introduced in 0198. + Fix broken loadNode() and XML usage in general. + Fix problem with save() writing multiple image files with an extra .tif - at the end. + at the end. + Added no-op orientation() method to the desktop version so that code will work unchanged between Android and desktop. -+ Add warning for missing glyphs in PFont. ++ Add warning for missing glyphs in PFont. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0198 - 23 June 2011 @@ -7823,15 +7968,15 @@ covered on the changes page in the Wiki: http://wiki.processing.org/w/Changes This is an interim release so that Andres can do a workshop. Not recommended for casual use. Hostile or belligerent whiners need not apply. -Android mode has received zero testing, so XML, SVG, 3D, and other major +Android mode has received zero testing, so XML, SVG, 3D, and other major features may be broken. See statement directly above. -[ bugs fixed ] +[ bugs fixed ] + Examples window placed off-screen when PDE window is maximized http://code.google.com/p/processing/issues/detail?id=669 -+ Make examples window respond to ESC, and double-click events to ++ Make examples window respond to ESC, and double-click events to expand/collapse nodes. + Launch script for Linux fails to open a sketches with relative paths @@ -7849,7 +7994,7 @@ features may be broken. See statement directly above. + Make sketch.properties usable elsewhere by loading/reloading http://code.google.com/p/processing/issues/detail?id=722 -+ Export to Application reports "Could not copy source file:" ++ Export to Application reports "Could not copy source file:" http://code.google.com/p/processing/issues/detail?id=638 + Automatically insert the 'import processing.opengl' when P3D used. @@ -7873,10 +8018,10 @@ features may be broken. See statement directly above. + Removed the delay() method. It was awful. -+ Addded thread() method that takes a function name as a parameter, ++ Addded thread() method that takes a function name as a parameter, and runs it on its own thread. No more classes! -+ PImage.save() returns a success boolean (rather than throwing an ++ PImage.save() returns a success boolean (rather than throwing an exception when it fails). [ core bugs fixed ] @@ -7887,7 +8032,7 @@ features may be broken. See statement directly above. + problem with destroy() calling System.exit() http://code.google.com/p/processing/issues/detail?id=698 -+ post() is called after setup() ++ post() is called after setup() http://code.google.com/p/processing/issues/detail?id=455 + Remove auto-sizing from binary() (was inconsistent with hex() method). @@ -7944,19 +8089,19 @@ features may be broken. See statement directly above. + removed A2D and A3D constants -+ colorMode() error ++ colorMode() error http://code.google.com/p/processing/issues/detail?id=223 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.5.1 (REV 0197) - 15 May 2011 This release fixes a handful of regressions and quirks that were found in -the Processing 1.5 release last month. +the Processing 1.5 release last month. -[ editor ] +[ editor ] + Windows splash screen for version 1.5 says "1.2" http://code.google.com/p/processing/issues/detail?id=631 @@ -7975,13 +8120,13 @@ the Processing 1.5 release last month. + File > New and Command-N stop working on OS X after running a sketch http://code.google.com/p/processing/issues/detail?id=664 -[ core ] +[ core ] + Reverted to the old createFont() behavior, where native fonts will be used with createFont() in more situations. http://code.google.com/p/processing/issues/detail?id=662 -[ svg ] +[ svg ] + Improve handling of transformations in SVG files. http://code.google.com/p/processing/issues/detail?id=388 @@ -7994,7 +8139,7 @@ the Processing 1.5 release last month. + Fix misshapen quadratic bezier curves when drawing SVG files. -[ examples ] +[ examples ] + HsvSpace example sketch in 1.5 download requires additional import http://code.google.com/p/processing/issues/detail?id=661 @@ -8003,7 +8148,7 @@ the Processing 1.5 release last month. http://code.google.com/p/processing/issues/detail?id=655 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.5 (REV 0196) - 17 April 2011 @@ -8013,7 +8158,7 @@ being the introduction of "modes" for the editor, allowing you to switch between Android development or the classic desktop/web mode. More modes are coming in future releases. -Another significant change is a fix for applets that were stuttering or +Another significant change is a fix for applets that were stuttering or appearing to run very, very slowly in Firefox 4 and Chrome. That's the major reason that we're releasing this version in advance on 2.0 later this summer. @@ -8027,7 +8172,7 @@ eventually replacing the built-in OpenGL library for 2.0. Meanwhile, here are the changes since revision 0195, the last pre-release: -[ pde ] +[ pde ] + A new version of the reference and examples have been posted online. @@ -8040,7 +8185,7 @@ Meanwhile, here are the changes since revision 0195, the last pre-release: http://dev.processing.org/bugs/show_bug.cgi?id=810 http://code.google.com/p/processing/issues/detail?id=100 -+ Fixed a bug in the LoadFile2 example ++ Fixed a bug in the LoadFile2 example http://code.google.com/p/processing/issues/detail?id=522 + Shift-indent without selection increases indention @@ -8090,9 +8235,9 @@ Mac software developer hero of my youth, Peter N Lewis. + Fix minor native fonts issue. -[ android ] +[ android ] -+ Workaround for loadImage(url) bug in Google's Android source. ++ Workaround for loadImage(url) bug in Google's Android source. Issue tracked down by psoden. (Thanks!) http://code.google.com/p/processing/issues/detail?id=629 @@ -8106,21 +8251,21 @@ Mac software developer hero of my youth, Peter N Lewis. http://code.google.com/p/processing/issues/detail?id=518 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0195 - 10 April 2011 -Bug fixes and several Android updates. Working to close in on a proper +Bug fixes and several Android updates. Working to close in on a proper Processing 1.5 release. -This release has several changes to renaming sketches, using Save As, +This release has several changes to renaming sketches, using Save As, and how untitled sketches are handled. Please help test! Note that on the Android side, this release once again requires installation of the Google APIs. See the Android Wiki page for details. -[ general ] +[ general ] + Sketch restarts automatically after pressing stop button on PDE http://code.google.com/p/processing/issues/detail?id=561 @@ -8168,11 +8313,11 @@ of the Google APIs. See the Android Wiki page for details. + Remove version number from splash image http://code.google.com/p/processing/issues/detail?id=324 -+ Subfolders in /libraries folder not supported in 0194, ++ Subfolders in /libraries folder not supported in 0194, bring them back for toxi and the toxiclibs folks. http://code.google.com/p/processing/issues/detail?id=578 -[ core ] +[ core ] + Deal with bad screen updates for sketches running < 60 fps in JAVA2D @@ -8185,7 +8330,7 @@ of the Google APIs. See the Android Wiki page for details. + save() and other pixel operations no longer working with JAVA2D in 0194 http://code.google.com/p/processing/issues/detail?id=594 -[ android ] +[ android ] + point() doesn't render in A3D http://code.google.com/p/processing/issues/detail?id=592 @@ -8206,21 +8351,21 @@ of the Google APIs. See the Android Wiki page for details. + Better error handling when certain SDK components are not installed. -+ Canceling an attempt to find the Android SDK leaves no window open, ++ Canceling an attempt to find the Android SDK leaves no window open, or crash when trying to change to Android mode w/ no Android SDK http://code.google.com/p/processing/issues/detail?id=605 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0194 - 9 March 2011 Lots of fixes for late-breaking problems in release 0193. -[ fixes ] +[ fixes ] -+ The Auto Format command went missing in 0193. It's back for 0194, but is ++ The Auto Format command went missing in 0193. It's back for 0194, but is now located in the Edit menu, where it will stay for the rest of its long and happy life. @@ -8235,7 +8380,7 @@ Lots of fixes for late-breaking problems in release 0193. + Fix for flicker problem in the default renderer. http://code.google.com/p/processing/issues/detail?id=558 -+ The examples menu wasn't completely removed in 0193. ++ The examples menu wasn't completely removed in 0193. + Remove "temporarily skipping deletion of" debugging message on export. @@ -8246,7 +8391,7 @@ Lots of fixes for late-breaking problems in release 0193. + Fix problem with Sketch Permissions for Android. http://code.google.com/p/processing/issues/detail?id=559 -[ notes ] +[ notes ] + Because both OpenGL and OpenGL2 are present, there may be conflicts if you implement any OpenGL-specific code outside the Processing API. If your sketch @@ -8256,7 +8401,7 @@ Lots of fixes for late-breaking problems in release 0193. import javax.media.opengl.glu.*; then you should remove one of the OpenGL libraries, depending on which you - would like to use. + would like to use. + OpenGL is built-in on Android. You don't need to add it as a library, the way you do with the desktop. A "import processing.opengl.*" line won't @@ -8269,48 +8414,48 @@ Lots of fixes for late-breaking problems in release 0193. [ additions ] -+ Added a new icon for "Export to Application", along the lines of the - icons used on the Android side. ++ Added a new icon for "Export to Application", along the lines of the + icons used on the Android side. + Remove warning about the broken build. http://code.google.com/p/processing/issues/detail?id=519 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0193 - 8 March 2011 -The PDE is receiving a major overhaul. The most obvious change is that +The PDE is receiving a major overhaul. The most obvious change is that there's now a menu that allows you to switch between "modes". "Standard" -is the Java-based mode that we're all used to, and "Android" compiles -things for Android devices. +is the Java-based mode that we're all used to, and "Android" compiles +things for Android devices. -Basically it's all pre-releases from here until 2.0. +Basically it's all pre-releases from here until 2.0. -With the mode support, it will soon be possible to embed other projects, -like the Python version, or the JS exporter, directly inside the PDE. +With the mode support, it will soon be possible to embed other projects, +like the Python version, or the JS exporter, directly inside the PDE. More on this later. This release also fixes a handful of Android problems, like the use of libraries, the code folder, and so on. -[ core ] +[ core ] + Fix problem that made applets suck in Google Chrome and Firefox 4. + Fix java.lang.OutOfMemoryError using get() and image() inside a tight loop. http://code.google.com/p/processing/issues/detail?id=42 -+ Changed default font to Lucida Sans, available on all platforms. ++ Changed default font to Lucida Sans, available on all platforms. This means that your text may be a slightly different size if you haven't - used textFont(), but hey, you probably don't use the default font, right? + used textFont(), but hey, you probably don't use the default font, right? A fella (or gal) like you? + textAlign() incorrect with default font on Mac OS X 10.6 http://code.google.com/p/processing/issues/detail?id=362 -+ Clean up how PDF fonts are handled. Default to writing fonts as shapes, ++ Clean up how PDF fonts are handled. Default to writing fonts as shapes, which makes PDF files larger, but is likely to work in more cases. If you want editable/real text, you can call textMode(MODEL) right after creating the PDF renderer (directly below size() or beginRecord()). @@ -8321,7 +8466,7 @@ libraries, the code folder, and so on. + Fix bizarre window placement when using Present mode on OS X. -[ pde changes/fixes ] +[ pde changes/fixes ] + Added support for separate 32 and 64 bit versions of libraries. @@ -8335,7 +8480,7 @@ libraries, the code folder, and so on. library into a newer, faster, more amazinger OpenGL that will eventually be the default. -+ Added a *lot* of examples. This has also had the effect of making the ++ Added a *lot* of examples. This has also had the effect of making the download enormous. It's currently obese. We'll sort that out later. + Code folder oddity on application export (in SVN) @@ -8356,7 +8501,7 @@ libraries, the code folder, and so on. http://code.google.com/p/processing/issues/detail?id=529 + Console, preferences cleanup: removed build.path, as well as - console.output.file, and console.error.file. Also removed 'console' + console.output.file, and console.error.file. Also removed 'console' true/false from preferences. + Change console to write to the 'console/' folder in settings. @@ -8366,7 +8511,7 @@ libraries, the code folder, and so on. + Add splash image on OS X. + Added window for examples. It's a bit ugly, but the menu was too much - and we should be able to clean this feller up later. Also makes the + and we should be able to clean this feller up later. Also makes the examples a bit more obvious. + Updated the serial library for Mac OS X @@ -8381,7 +8526,7 @@ libraries, the code folder, and so on. http://dev.processing.org/bugs/show_bug.cgi?id=54 http://code.google.com/p/processing/issues/detail?id=17 -[ fixed in 0192 ] +[ fixed in 0192 ] + Auto-format screws up if/else/else if blocks http://code.google.com/p/processing/issues/detail?id=325 @@ -8391,7 +8536,7 @@ libraries, the code folder, and so on. [ android edits ] -+ Add better icons from Casey for exported applications. ++ Add better icons from Casey for exported applications. + Remove the need to download the android core.jar separately http://code.google.com/p/processing/issues/detail?id=421 @@ -8416,10 +8561,10 @@ libraries, the code folder, and so on. http://dev.processing.org/bugs/show_bug.cgi?id=1379 http://code.google.com/p/processing/issues/detail?id=201 -+ With mode support, "Run on Device" and "Run in Emulator" instead of ++ With mode support, "Run on Device" and "Run in Emulator" instead of "Run" and "Present". -[ internal changes ] +[ internal changes ] + Removed build.path from preferences.txt. Not really used anywhere, just trying to clean things up. @@ -8427,8 +8572,8 @@ libraries, the code folder, and so on. + Removed 'console.output.file' and 'console.error.file'. These weren't respected as paths, no reason for them. -+ Change console to write to the 'console/' folder in settings. - This may eventually create a problem with logs that need to be cleaned, ++ Change console to write to the 'console/' folder in settings. + This may eventually create a problem with logs that need to be cleaned, but we'll keep an eye on it for now. + Removed 'console' true/false from preferences. @@ -8437,19 +8582,19 @@ libraries, the code folder, and so on. http://code.google.com/p/processing/issues/detail?id=197 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0192 - 18 December 2010 This release contains a roll-up of lots of bug fixes. However, it's being released before it's ready, so it should only be used by people who are having -trouble with the new Android SDK release (revision 8) from Google, which +trouble with the new Android SDK release (revision 8) from Google, which broke Android support last week. -This version of Processing for Android *requires* Android SDK Tools Release 8. -If you're not using release 8, and don't have the necessary components -installed, you'll get (confusing) error messages saying that the SDK location +This version of Processing for Android *requires* Android SDK Tools Release 8. +If you're not using release 8, and don't have the necessary components +installed, you'll get (confusing) error messages saying that the SDK location is not set, and that it could not find an SDK in the location that you specify. As for this being an early release, the problem is that major changes were @@ -8459,11 +8604,11 @@ support is somewhat broken. So with that caveat, no whining, please. On a happier note, the changes: -[ android fixes ] +[ android fixes ] + Compile android-core with Java 5 as the target so that it works on OS X 10.5. -[ additions from andres ] +[ additions from andres ] + A3D should use lower color depth on older devices. http://code.google.com/p/processing/issues/detail?id=391 @@ -8509,7 +8654,7 @@ On a happier note, the changes: + AutoFormat unecessarily adds spaces to function with multiple args http://code.google.com/p/processing/issues/detail?id=462 -[ edits from Lonnen ] +[ edits from Lonnen ] + Fix for disappearing horizontal scroll bar regression http://code.google.com/p/processing/issues/detail?id=316 @@ -8562,19 +8707,19 @@ On a happier note, the changes: + shearX and shearY not properly implemented with P2D and JAVA2D http://code.google.com/p/processing/issues/detail?id=452 -+ frame.setResizable(true) does not enable maximize button. ++ frame.setResizable(true) does not enable maximize button. Thanks to Christian Thiemann for a workaround. http://code.google.com/p/processing/issues/detail?id=467 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0191 - 30 September 2010 Bug fix release. Contains major fixes to 3D for Android. -[ changes ] +[ changes ] + Added option to preferences panel to enable/disable smoothing of text inside the editor. @@ -8582,7 +8727,7 @@ Bug fix release. Contains major fixes to 3D for Android. + Added more anti-aliasing to the Linux interface. Things were downright ugly in places where defaults different from Windows and Mac OS X. -[ bug fixes ] +[ bug fixes ] + Fix a problem with Linux permissions in the download. http://code.google.com/p/processing/issues/detail?id=343 @@ -8595,7 +8740,7 @@ Bug fix release. Contains major fixes to 3D for Android. + Remove extraneous console messages on export. -+ When exporting, don't include a library multiple times. ++ When exporting, don't include a library multiple times. + Fixed a problem where no spaces in the size() command caused an error. http://code.google.com/p/processing/issues/detail?id=390 @@ -8629,34 +8774,34 @@ Bug fix release. Contains major fixes to 3D for Android. + Finish screen pixels/texture operations in A3D http://code.google.com/p/processing/issues/detail?id=298 -+ Fixed a bug in the camera handling. This was a quite urgent issue, ++ Fixed a bug in the camera handling. This was a quite urgent issue, since affected pretty much everything. It went unnoticed until now because the math error canceled out with the default camera settings. http://forum.processing.org/topic/possible-3d-bug -+ Also finished the implementation of the getImpl() method in PImage, - so it initializes the texture of the new image in A3D mode. ++ Also finished the implementation of the getImpl() method in PImage, + so it initializes the texture of the new image in A3D mode. This makes the CubicVR example to work fine. -[ core ] +[ core ] + Fix background(PImage) for OpenGL http://code.google.com/p/processing/issues/detail?id=336 -+ Skip null entries with trim(String[]) ++ Skip null entries with trim(String[]) + Fix NaN with PVector.angleBetween http://code.google.com/p/processing/issues/detail?id=340 + Fix missing getFloat() method in XML library -+ Make sure that paths are created with saveStream(). ++ Make sure that paths are created with saveStream(). (saveStream() wasn't working when intermediate directories didn't exist) -+ Make createWriter() use an 8k buffer by default. ++ Make createWriter() use an 8k buffer by default. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0190 - 18 August 2010 @@ -8666,18 +8811,18 @@ are some problems with fonts. If you're using text, especially with PDFs, you may want to wait until the next release. Android users should read the Wiki (http://wiki.processing.org/w/Android) -which has a lot of new information. +which has a lot of new information. -[ android ] +[ android ] -+ Added a new menu to cover enabling/disabling Android mode. ++ Added a new menu to cover enabling/disabling Android mode. -+ Added a Permissions dialog, so that you can set permissions for your ++ Added a Permissions dialog, so that you can set permissions for your applications, e.g. so you can read from the internet or save files. -+ Added support for icons. Put files named icon-32.png, icon-48.png, ++ Added support for icons. Put files named icon-32.png, icon-48.png, and icon-72.png in your sketch folder, and they'll be added to your - project when it's created. Otherwise you'll get an ugly blue dot + project when it's created. Otherwise you'll get an ugly blue dot default icon. You've been warned. + Finish implementing the size() command on Android. See the Wiki for notes. @@ -8694,7 +8839,7 @@ which has a lot of new information. + Fix text ascent/descent problem, text("blah\nblah") wasn't working. -+ Fixed how the manifest file is read/written. ++ Fixed how the manifest file is read/written. http://dev.processing.org/bugs/show_bug.cgi?id=1429 http://code.google.com/p/processing/issues/detail?id=221 @@ -8713,18 +8858,18 @@ which has a lot of new information. + Fix errors showing up that .java files were duplicates. http://code.google.com/p/processing/issues/detail?id=232 -[ core ] +[ core ] + Changed skewX/Y to shearX/Y. -+ ENABLE_NATIVE_FONTS was being ignored, native fonts were always used ++ ENABLE_NATIVE_FONTS was being ignored, native fonts were always used in some cases. However, this broke some other things. But that's why this is a pre-release, not a final. -[ xml fixes and changes ] +[ xml fixes and changes ] + Changed the XML constructor to take a String for a node name, instead of - parsing a document from a String. Instead, use XMLElement.parse(String) + parsing a document from a String. Instead, use XMLElement.parse(String) if you want to read a file. + Added getBoolean() methods. @@ -8753,9 +8898,9 @@ which has a lot of new information. + Update XMLElement constructor problem. http://code.google.com/p/processing/issues/detail?id=342 -[ environment ] +[ environment ] -+ Added more specific language to Lnux/Sun/Java error messages on Linux. ++ Added more specific language to Lnux/Sun/Java error messages on Linux. Also added support for "Oracle" in the name. + Fix the New/Open buttons on the toolbar @@ -8773,7 +8918,7 @@ which has a lot of new information. http://code.google.com/p/processing/issues/detail?id=15 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.2.1 (REV 0189) - 14 July 2010 @@ -8782,43 +8927,43 @@ Fix for a problem with some static-mode programs. See below for the other changes since 1.1. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.2 (REV 0188) - 13 July 2010 -Changes too numerous to mention, see the notes below for all the +Changes too numerous to mention, see the notes below for all the revisions that followed the 1.1 release in March. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0187 - 12 July 2010 -More bug fixes, and one new treat for OS X users. Hopefully we're about +More bug fixes, and one new treat for OS X users. Hopefully we're about set to call this one 1.2. Please test and report any issues you find: http://code.google.com/p/processing/issues/list -[ additions ] +[ additions ] -+ On Mac OS X, you're no longer required to have a sketch window open at ++ On Mac OS X, you're no longer required to have a sketch window open at all times. This will make the application feel more Mac-like--a little more elegant and trendy and smug with superiority. -+ Added a warning to the Linux version to tell users that they should be ++ Added a warning to the Linux version to tell users that they should be using the official version of Java from Sun if they're not. http://wiki.processing.org/w/Supported_Platforms#Linux - There isn't a perfect way to detect whether Sun Java is in use, - so please let us know how it works or if you have a better idea. + There isn't a perfect way to detect whether Sun Java is in use, + so please let us know how it works or if you have a better idea. -[ fixes ] +[ fixes ] + "Unexpected token" error when creating classes with recent pre-releases. http://code.google.com/p/processing/issues/detail?id=292 -+ Prevent horizontal scroll offset from disappearing. - Thanks to Christian Thiemann for the fix. ++ Prevent horizontal scroll offset from disappearing. + Thanks to Christian Thiemann for the fix. http://code.google.com/p/processing/issues/detail?id=280 http://code.google.com/p/processing/issues/detail?id=10 @@ -8830,26 +8975,26 @@ http://code.google.com/p/processing/issues/list http://code.google.com/p/processing/issues/detail?id=303 + Added requestFocusInWindow() call to replace Apple's broken requestFocus(), - which should return the previous behavior of sketches getting focus + which should return the previous behavior of sketches getting focus immediately when loaded in a web browser. http://code.google.com/p/processing/issues/detail?id=279 -+ Add getDocumentBase() version of createInput() for Internet Explorer. ++ Add getDocumentBase() version of createInput() for Internet Explorer. Without this, sketches will crash when trying to find files on a web server that are not in the exported .jar file. This fix is only for IE. Yay IE! -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0186 - 26 June 2010 Minor updates following up on 0185. -[ mixed bag ] +[ mixed bag ] + Android SDK requirement is now API 7 (Android 2.1), because Google has - deprecated API 6 (2.0.1). + deprecated API 6 (2.0.1). + More Linux PDF fixes from Matthias Breuer. Thanks! @@ -8862,18 +9007,18 @@ Minor updates following up on 0185. + Updated the included examples with recent changes. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0185 - 20 June 2010 -Primarily a bug fix release. The biggest change are a couple tweaks for +Primarily a bug fix release. The biggest change are a couple tweaks for problems caused by Apple's Update 2 for Java on OS X, so this should make -Processing usable on Macs again. +Processing usable on Macs again. -[ bug fixes ] +[ bug fixes ] -+ Fix for Apple bug that caused an assertion failure when requestFocus() ++ Fix for Apple bug that caused an assertion failure when requestFocus() was called in some situations. This was causing the PDE to become unusable for opening sketches, and focus highlighting was no longer happening. http://code.google.com/p/processing/issues/detail?id=258 @@ -8898,14 +9043,14 @@ Processing usable on Macs again. also added begin/endDraw between frames http://dev.processing.org/bugs/show_bug.cgi?id=1227 -[ additions ] +[ additions ] + Add the changes for "Copy as HTML" to replace the "Copy for Discourse" function, now that we've shut down the old YaBB discourse board. http://code.google.com/p/processing/issues/detail?id=271 -+ Option to disable re-opening sketches when you start Processing. - The default will stay the same, but if you don't like the feature, ++ Option to disable re-opening sketches when you start Processing. + The default will stay the same, but if you don't like the feature, alter your preferences.txt file to change: last.sketch.restore=true to the following: @@ -8920,7 +9065,7 @@ Processing usable on Macs again. http://code.google.com/p/processing/issues/detail?id=179 Those bugs are not yet fixed, but will be addressed in future releases. -+ Option to change the default naming of sketches via preferences.txt. ++ Option to change the default naming of sketches via preferences.txt. First, you can change the prefix, which defaults to: editor.untitled.prefix=sketch_ And the suffix is handled using dates. The current default (since 1.0) is: @@ -8938,13 +9083,13 @@ Processing usable on Macs again. + Added option to launch a sketch directly w/ linux. Thanks to Larry Kyrala. http://dev.processing.org/bugs/show_bug.cgi?id=1549 -+ Pass actual exceptions from InvocationTargetException in registered ++ Pass actual exceptions from InvocationTargetException in registered methods, which improves how exceptions are reported with libraries. -+ Added loading.gif to the js version of the applet loader. Not sure ++ Added loading.gif to the js version of the applet loader. Not sure if this is actually working or not, but it's there. -[ android ] +[ android ] + Added permissions for INTERNET and WRITE_EXTERNAL_STORAGE to the default AndroidManifest.xml file. This will be addressed in greater detail here: @@ -8955,25 +9100,25 @@ Processing usable on Macs again. + Lots of work happening underneath with regards to Android, more updates soon as things start evening out a bit. -+ Defaulting to a WVGA screen for the default Processing AVD. ++ Defaulting to a WVGA screen for the default Processing AVD. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0184 - 14 April 2010 -Pre-release version with more bug fixes. Proper release notes will +Pre-release version with more bug fixes. Proper release notes will accompany an actual release. If you're curious in the meantime, look at todo.txt and done.txt from the source tree. -+ The 'Export' option now works in Android, so that you can get at ++ The 'Export' option now works in Android, so that you can get at the debug APK that's created. -+ Problems finding javac.exe on Windows should now be fixed. ++ Problems finding javac.exe on Windows should now be fixed. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0183 - 31 March 2010 @@ -8982,10 +9127,10 @@ Bug fixes for Android, should remove the API v5 requirement and make things work fine with API v6, the new minimum. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -PROCESSING REV 0182 - 29 March 2010 +PROCESSING REV 0182 - 29 March 2010 Bug fix pre-release. This updates three areas: @@ -8999,7 +9144,7 @@ A more thorough revisions update will be written for the next full release version (1.2? 1.5? 2.0?) that includes all these changes. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0181 - 19 March 2010 @@ -9007,27 +9152,27 @@ PROCESSING REV 0181 - 19 March 2010 Another update for the preprocessor changes (see below). -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0180 - 15 March 2010 -This is a interim release with a reworked preprocessor that adds Java 5 -syntax. We're releasing this interim version because we need help testing +This is a interim release with a reworked preprocessor that adds Java 5 +syntax. We're releasing this interim version because we need help testing it since it has an impact on any sketch created in the Processing environment. Basically, we mighta goofed something up big, and we wanna catch it before -we throw it to the wolves. +we throw it to the wolves. The release also fixes a number of preprocessor bugs. Those changes will -be documented a bit later. +be documented a bit later. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.1 (REV 0179) - 11 March 2010 -This is the first general-purpose release since 1.0.9. The text below merges +This is the first general-purpose release since 1.0.9. The text below merges all of the changes from all the interim revisions, with the exception of the changes for the upcoming Android tools, which are not enabled in this release. @@ -9038,15 +9183,15 @@ of release 1.0.10. Which is nice, because release 1.0.10 sounds baffling. [ font changes ] -+ It's no longer necessary to use textFont() before text() and other - text-handling functions. The default "SansSerif" font is used, which - varies by platform. ++ It's no longer necessary to use textFont() before text() and other + text-handling functions. The default "SansSerif" font is used, which + varies by platform. -+ Also in this release, the createFont() method will only load characters - as they are used, which should greatly improve the font situation on ++ Also in this release, the createFont() method will only load characters + as they are used, which should greatly improve the font situation on non-Roman systems like Japanese. This will use far less memory, and should - be all around much more efficient. Formerly, createFont() took several - seconds to run, depending on the speed of your system. + be all around much more efficient. Formerly, createFont() took several + seconds to run, depending on the speed of your system. http://dev.processing.org/bugs/show_bug.cgi?id=1111 + Fixed a problem with the Create Font tool ignoring the 'smooth' setting @@ -9055,13 +9200,13 @@ of release 1.0.10. Which is nice, because release 1.0.10 sounds baffling. + Fixed a separate problem with the createFont() method also ignoring the 'smooth' setting. -+ With the Create Font tool, you can also specify what Unicode character ++ With the Create Font tool, you can also specify what Unicode character blocks you'd like to use, making a much smaller font. + Fonts are no longer power of 2 by default. This should also make them more memory efficient. With future OpenGL updates, this will work even better. -[ other changes ] +[ other changes ] + Lots of edits to the HTML that's used for exported applets. If JavaScript is enabled, Sun's new loading functions are used, which offer the best @@ -9070,14 +9215,14 @@ of release 1.0.10. Which is nice, because release 1.0.10 sounds baffling. + Changed the OpenGL HTML template to load differently, which should fix a NullPointerException in JOGLAppletLanucher with Java 6 Update 18 on Windows, - and should also be more efficient altogether, because the JOGL libraries can + and should also be more efficient altogether, because the JOGL libraries can be downloaded just once from Sun, rather than for each sketch that uses them. http://dev.processing.org/bugs/show_bug.cgi?id=1452 + Code from Takachin that handles full input method support in the editor for Japanese and other scripts that are more complicated than Roman text. http://dev.processing.org/bugs/show_bug.cgi?id=854 - Thanks Takachin! + Thanks Takachin! + Now using iText 2.1.7. @@ -9087,14 +9232,14 @@ of release 1.0.10. Which is nice, because release 1.0.10 sounds baffling. + With great help from Hansi, moved the build scripts over to Ant. http://dev.processing.org/bugs/show_bug.cgi?id=151 Also moved the special JRE for Linux and Windows out of SVN. It'll only be - downloaded when 'ant dist' is run. + downloaded when 'ant dist' is run. + Javadoc is slowly improving. More on that later. + Deprecated 'screen', and added screenWidth and screenHeight. Discussion here: http://dev.processing.org/bugs/show_bug.cgi?id=1499 -[ bug fixes ] +[ bug fixes ] + Fix for filter(DILATE/ERODE) from Dave Bollinger http://dev.processing.org/bugs/show_bug.cgi?id=1477 @@ -9114,7 +9259,7 @@ of release 1.0.10. Which is nice, because release 1.0.10 sounds baffling. + To fix video, and some other libraries on Snow Leopard, exported applications are now explicitly set to run 32-bit on OS X. -+ Fix LITERAL_class so that blah.class syntax can be used in PDE code. ++ Fix LITERAL_class so that blah.class syntax can be used in PDE code. Found and fixed by Christian Thiemann. Thank you! http://dev.processing.org/bugs/show_bug.cgi?id=1466 @@ -9140,37 +9285,37 @@ of release 1.0.10. Which is nice, because release 1.0.10 sounds baffling. + Fixed a problem where imports inside comments were being included. -[ keys ] +[ keys ] -+ Added ctrl-ins, shift-ins, shift-delete for cut/copy/paste on Windows and ++ Added ctrl-ins, shift-ins, shift-delete for cut/copy/paste on Windows and Linux, but disabled by default on Mac OS X. You can change the setting by altering "editor.keys.alternative_cut_copy_paste" in preferences.txt. http://dev.processing.org/bugs/show_bug.cgi?id=162 -+ Added a preference to change shift-backspace to just mean backspace, ++ Added a preference to change shift-backspace to just mean backspace, rather than delete. Set this entry in preferences.txt: editor.keys.shift_backspace_is_delete = true http://dev.processing.org/bugs/show_bug.cgi?id=1463 -+ Added an option for home and end keys traveling to the start/end of the ++ Added an option for home and end keys traveling to the start/end of the current line rather than the beginning/ending of a sketch. The latter is the HIG default for Mac OS X, but drives some people nuts. Change with: editor.keys.home_and_end_travel_far = false -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0178 - 4 March 2010 Tons of Android work in this release. A2D has been tested and runs correctly for all of the examples in "Basics" and "Topics". A3D is not quite finished -yet, and the size() command is still causing crashes. +yet, and the size() command is still causing crashes. This release also contains lots of work on Android Mode for the PDE, which is being worked on by Jonathan Feinberg. -[ core ] +[ core ] + Fix for filter(DILATE/ERODE) from Dave Bollinger http://dev.processing.org/bugs/show_bug.cgi?id=1477 @@ -9180,7 +9325,7 @@ is being worked on by Jonathan Feinberg. + Added implementation for get/set methods inside PImage (w/o pixels[]) -[ fixes to android core ] +[ fixes to android core ] + Fix noLoop() and static-mode sketches. http://dev.processing.org/bugs/show_bug.cgi?id=1467 @@ -9191,7 +9336,7 @@ is being worked on by Jonathan Feinberg. + App not pausing or closing when switching to another activity http://dev.processing.org/bugs/show_bug.cgi?id=1404 -+ Bezier curves were broken in A2D (extra point is drawn connecting the ++ Bezier curves were broken in A2D (extra point is drawn connecting the shape to the corner). + Fixed other minor bugs in shape drawing. @@ -9208,7 +9353,7 @@ is being worked on by Jonathan Feinberg. + Drastically improve the performance of the time functions (minute() et al) -+ Point wasn't detecting different stroke weights. ++ Point wasn't detecting different stroke weights. + Point wasn't working with strokeWeight > 1. @@ -9230,7 +9375,7 @@ is being worked on by Jonathan Feinberg. + Remove legacy PGraphics3D class from processing.core.android http://dev.processing.org/bugs/show_bug.cgi?id=1402 -[ android mode ] +[ android mode ] + Exception handling is much improved. @@ -9244,7 +9389,7 @@ is being worked on by Jonathan Feinberg. PROCESSING REV 0177 - 21 February 2010 -Fix for the Android tools complaining "Open quote is expected for +Fix for the Android tools complaining "Open quote is expected for attribute "{1}" associated with an element type android:minSdkVersion." Just posting a new revision because it's easier than writing instructions @@ -9258,17 +9403,17 @@ below that (a tipoff being that there's no PDF library on Android...) [ android ] -+ Minimum platform support is changing to 2.0 instead of 1.6. That means ++ Minimum platform support is changing to 2.0 instead of 1.6. That means "Eclair" or later, and goodbye to my T-Mobile G1, undoubtedly the ugliest - cell phone I have ever owned. Hello to Droid and Nexus One. - Performance is very poor on pre-2.0 devices anyway. + cell phone I have ever owned. Hello to Droid and Nexus One. + Performance is very poor on pre-2.0 devices anyway. -+ Known issue: Sketches that use noLoop() are currently broken. ++ Known issue: Sketches that use noLoop() are currently broken. http://dev.processing.org/bugs/show_bug.cgi?id=1467 + Added support for libraries and the code folder. -+ Classes have moved to the processing.core package instead of ++ Classes have moved to the processing.core package instead of processing.android.core. + Slashes in the SDK path are now escaped properly on Windows. @@ -9281,7 +9426,7 @@ below that (a tipoff being that there's no PDF library on Android...) + loadFont() and text() now work properly. createFont() has not been tested. -[ changes ] +[ changes ] + Lots of edits to the HTML that's used for exported applets. If JavaScript is enabled, Sun's new loading functions are used, which offer the best @@ -9290,17 +9435,17 @@ below that (a tipoff being that there's no PDF library on Android...) + Changed the OpenGL HTML template to load differently, which should fix a NullPointerException in JOGLAppletLanucher with Java 6 Update 18 on Windows, - and should also be more efficient altogether, because the JOGL libraries can + and should also be more efficient altogether, because the JOGL libraries can be downloaded just once from Sun, rather than for each sketch that uses them. http://dev.processing.org/bugs/show_bug.cgi?id=1452 + Code from Takachin that handles full input method support in the editor for Japanese and other scripts that are more complicated than Roman text. http://dev.processing.org/bugs/show_bug.cgi?id=854 - Thanks Takachin! + Thanks Takachin! + Downgraded the PDF library to use iText 1.5.4, because later versions seem - to load slower, and don't seem to offer additional benefits. If the PDF + to load slower, and don't seem to offer additional benefits. If the PDF library gets worse, please post a bug and we'll go back to the 2.x release we were using, or upgrade to the more recent 5.x series. @@ -9310,13 +9455,13 @@ below that (a tipoff being that there's no PDF library on Android...) + With great help from Hansi, moved the build scripts over to Ant. http://dev.processing.org/bugs/show_bug.cgi?id=151 Also moved the special JRE for Linux and Windows out of SVN. It'll only be - downloaded when 'ant dist' is run. This makes the build and maintenance - more of a mess for me, but will save me from people whining about the + downloaded when 'ant dist' is run. This makes the build and maintenance + more of a mess for me, but will save me from people whining about the large files. + Javadoc is slowly improving. More on that later. -[ bug fixes ] +[ bug fixes ] + Updated JNA to version 3.2.4 to support Windows 7 64-bit http://dev.processing.org/bugs/show_bug.cgi?id=1424 @@ -9331,7 +9476,7 @@ below that (a tipoff being that there's no PDF library on Android...) + To fix video, and some other libraries on Snow Leopard, exported applications are now explicitly set to run 32-bit on OS X. -+ Fix LITERAL_class so that blah.class syntax can be used in PDE code. ++ Fix LITERAL_class so that blah.class syntax can be used in PDE code. Found and fixed by Christian Thiemann. Thank you! http://dev.processing.org/bugs/show_bug.cgi?id=1466 @@ -9342,9 +9487,9 @@ below that (a tipoff being that there's no PDF library on Android...) + If you overwrite PApplet.main(), you're responsible for what happens. http://dev.processing.org/bugs/show_bug.cgi?id=1446 -[ keys ] +[ keys ] -+ Added ctrl-ins, shift-ins, shift-delete for cut/copy/paste on Windows and ++ Added ctrl-ins, shift-ins, shift-delete for cut/copy/paste on Windows and Linux, but disabled by default on Mac OS X. You can change the setting by altering "editor.keys.alternative_cut_copy_paste" in preferences.txt. http://dev.processing.org/bugs/show_bug.cgi?id=162 @@ -9354,18 +9499,18 @@ below that (a tipoff being that there's no PDF library on Android...) editor.keys.shift_backspace_is_delete = true http://dev.processing.org/bugs/show_bug.cgi?id=1463 -+ Added an option for home and end keys traveling to the start/end of the ++ Added an option for home and end keys traveling to the start/end of the current line rather than the beginning/ending of a sketch. The latter is the HIG default for Mac OS X, but drives some people nuts. Change with: editor.keys.home_and_end_travel_far = false [ fonts ] -+ Starting in this release, the createFont() method will only load characters - as they are used, which should greatly improve the font situation on ++ Starting in this release, the createFont() method will only load characters + as they are used, which should greatly improve the font situation on non-Roman systems like Japanese. This will use far less memory, and should - be all around much more efficient. Formerly, createFont() took several - seconds to run, depending on the speed of your system. + be all around much more efficient. Formerly, createFont() took several + seconds to run, depending on the speed of your system. http://dev.processing.org/bugs/show_bug.cgi?id=1111 + Fixed a problem with the Create Font tool ignoring the 'smooth' setting @@ -9374,14 +9519,14 @@ below that (a tipoff being that there's no PDF library on Android...) + Fixed a separate problem with the createFont() method also ignoring the 'smooth' setting. -+ With the Create Font tool, you can also specify what Unicode character ++ With the Create Font tool, you can also specify what Unicode character blocks you'd like to use, making a much smaller font. + Fonts are no longer power of 2 by default. This should also make them more memory efficient. With future OpenGL updates, this will work even better. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING REV 0172 through 0175 @@ -9389,7 +9534,7 @@ PROCESSING REV 0172 through 0175 These releases are mostly about Android (listed at the top), but also contain any interim fixes that happened in the meantime. -[ android ] +[ android ] + Fix problem with Android HTML dialog box several
items showing up when first loading @@ -9411,11 +9556,11 @@ any interim fixes that happened in the meantime. + Updates for r4 version of the SDK. -[ changes ] +[ changes ] -+ In the editor toolbar, shift-new and shift-open on the toolbar open a - new window. Also, when shift is down, change text of the toolbar item - to represent what it does. ++ In the editor toolbar, shift-new and shift-open on the toolbar open a + new window. Also, when shift is down, change text of the toolbar item + to represent what it does. + Replaced com.apple.eawt.Application invocation to deal with deprecation. This may cause problems with older releases (or on 10.4 or 10.5), not sure. @@ -9423,13 +9568,13 @@ any interim fixes that happened in the meantime. + Use xdg-open as launcher on linux http://dev.processing.org/bugs/show_bug.cgi?id=1358 -+ Default wildcard imports are causing naming conflicts, changed how ++ Default wildcard imports are causing naming conflicts, changed how they're set up in the preferences file. http://dev.processing.org/bugs/show_bug.cgi?id=1103 + Changed createInputRaw() to only bother checking URLs if : present -[ bug fixes ] +[ bug fixes ] + Re-enabled hack for temporary clipping. Clipping still needs to be implemented properly, however. Please help! @@ -9447,7 +9592,7 @@ any interim fixes that happened in the meantime. + Fixed a problem where imports inside comments were being included. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.9 (REV 0171) - 20 October 2009 @@ -9456,7 +9601,7 @@ Happy birthday to Casey! [ bug fixes ] -+ Removed NPOT texture support until further testing, because it was ++ Removed NPOT texture support until further testing, because it was resulting in blurring images in OPENGL sketches. http://dev.processing.org/bugs/show_bug.cgi?id=1352 @@ -9464,12 +9609,12 @@ Happy birthday to Casey! http://dev.processing.org/bugs/show_bug.cgi?id=786 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.8 (REV 0170) - 18 October 2009 -A bonfire of bug fixes. +A bonfire of bug fixes. [ environment ] @@ -9503,26 +9648,26 @@ A bonfire of bug fixes. http://dev.processing.org/bugs/show_bug.cgi?id=1332 http://dev.processing.org/bugs/show_bug.cgi?id=1092 -+ Saving the project with the same name (but different case) ++ Saving the project with the same name (but different case) as an existing tab was deleting code on Windows and OS X. http://dev.processing.org/bugs/show_bug.cgi?id=1102 -[ core ] +[ core ] -+ filter(RGB) supposed to be filter(OPAQUE) ++ filter(RGB) supposed to be filter(OPAQUE) http://dev.processing.org/bugs/show_bug.cgi?id=1346 -+ Implement non-power-of-2 textures for OpenGL (on cards where available). ++ Implement non-power-of-2 textures for OpenGL (on cards where available). This is a partial fix for texture edge problems: http://dev.processing.org/bugs/show_bug.cgi?id=602 + Fix get() when used with save() in OpenGL mode -+ Immediately update projection with OpenGL. In the past, projection - updates required a new frame. This also prevents camera/project from ++ Immediately update projection with OpenGL. In the past, projection + updates required a new frame. This also prevents camera/project from being reset when the drawing size is changed. -+ Removed an error that caused the cameraNear value to be set to -8. ++ Removed an error that caused the cameraNear value to be set to -8. This may cause other problems with drawing/clipping however. + Removed methods from PApplet that use doubles. These were only temporarily @@ -9540,18 +9685,18 @@ A bonfire of bug fixes. + Updated Quaqua to 6.2 on Mac OS X. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.7 (REV 0169) - 4 September 2009 -Bug fixes and updates, also some tweaks for Mac OS X Snow Leopard. +Bug fixes and updates, also some tweaks for Mac OS X Snow Leopard. -[ changes ] +[ changes ] + Tweaks for Mac OS X Snow Leopard, to force it to run in 32-bit mode. This should bring back the video library (if temporarily), and hopefully - fix serial as well, though I didn't have a serial device handy to test. + fix serial as well, though I didn't have a serial device handy to test. + Fix problem where line highlighting was off in 'static' mode. http://dev.processing.org/bugs/show_bug.cgi?id=1263 @@ -9562,11 +9707,11 @@ Bug fixes and updates, also some tweaks for Mac OS X Snow Leopard. + PVector.angleDistance() returning NaN due to precision errors http://dev.processing.org/bugs/show_bug.cgi?id=1316 -+ Removed a major try/catch block from PApplet.main(), hopefully ++ Removed a major try/catch block from PApplet.main(), hopefully this will allow some exception stuff to come through properly. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.6 (REV 0168) - 12 August 2009 @@ -9574,7 +9719,7 @@ PROCESSING 1.0.6 (REV 0168) - 12 August 2009 Bug fixes and minor changes. Most important are replacement JOGL libraries so that OpenGL applets won't present an "expired certificate" error. -[ bug fixes ] +[ bug fixes ] + Replaced the faulty JOGL library that had expired certificates (Sun bug). http://dev.processing.org/bugs/show_bug.cgi?id=1271 @@ -9608,29 +9753,29 @@ so that OpenGL applets won't present an "expired certificate" error. + PDF member functions set protected instead of private http://dev.processing.org/bugs/show_bug.cgi?id=1276 -+ On OS X, update Info.plist to be 32/64 explicit and also updated ++ On OS X, update Info.plist to be 32/64 explicit and also updated JavaApplicationStub for update 4. -+ Clicking the preferences location in the Preferences window will - now open the parent folder for the preferences file. ++ Clicking the preferences location in the Preferences window will + now open the parent folder for the preferences file. http://dev.processing.org/bugs/show_bug.cgi?id=1279 + Update to Java 6 update 15 for the Windows and Linux releases. -[ fixed earlier ] +[ fixed earlier ] + Mangled menu text with Java 6u10. http://dev.processing.org/bugs/show_bug.cgi?id=1065 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.5 (REV 0167) - 7 June 2009 Bug fix release, mostly dealing with regressions from 1.0.4. -[ bug fixes ] +[ bug fixes ] + Make the tab key work again inside the editor http://dev.processing.org/bugs/show_bug.cgi?id=1267 @@ -9647,20 +9792,20 @@ Bug fix release, mostly dealing with regressions from 1.0.4. + Updated reference files. -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.4 (REV 0166) - 31 May 2009 -Bug fix release. +Bug fix release. -[ changes ] +[ changes ] + Changed the workaround for Apple's Java bug related to the menus in OS X. Rather than placing the menubar inside the sketch window, File > Sketchbook and File > Examples are simply dimmed out. Instead, use the Open button on the toolbar, which provides access to the same items. The preference - to place the menu bar inside the window is still available, in case you + to place the menu bar inside the window is still available, in case you prefer the previous workaround. http://dev.processing.org/bugs/show_bug.cgi?id=786 @@ -9668,7 +9813,7 @@ Bug fix release. [ bug fixes ] -+ Fixed IDE crash when changing color scheme on windows ++ Fixed IDE crash when changing color scheme on windows http://dev.processing.org/bugs/show_bug.cgi?id=1237 + Typo in the Linux shell script was preventing it from running @@ -9677,16 +9822,16 @@ Bug fix release. + OS X finder info on application updated to say 1.0.4 http://dev.processing.org/bugs/show_bug.cgi?id=1226 -+ Removed warning message "Non-String for 8 value in 'Properties' ++ Removed warning message "Non-String for 8 value in 'Properties' sub-dictionary in 'Java' sub-dictionary of Info.plist" on OS X + Added warning to build script for users on OS X 10.4 http://dev.processing.org/bugs/show_bug.cgi?id=1179 -+ Disable point() going to set() from PGraphicsJava2D. The set() command ++ Disable point() going to set() from PGraphicsJava2D. The set() command doesn't honor alpha consistently, and it also causes problems with PDF -+ PImage cacheMap problem when using PImage.get() ++ PImage cacheMap problem when using PImage.get() http://dev.processing.org/bugs/show_bug.cgi?id=1245 + Fix problems with > 512 points and P3D/OPENGL @@ -9706,11 +9851,11 @@ Bug fix release. + Fix significant point() and set() slowdown on OS X http://dev.processing.org/bugs/show_bug.cgi?id=1094 -[ known issues ] +[ known issues ] -+ Currently no 64-bit support for any platforms. On some platforms, you'll ++ Currently no 64-bit support for any platforms. On some platforms, you'll simply need to replace the Java folder with the distribution with something - more suitable for your operating system. + more suitable for your operating system. + Command line support is currently broken http://dev.processing.org/bugs/show_bug.cgi?id=1048 @@ -9725,12 +9870,12 @@ Bug fix release. + See dev.processing.org/bugs for much, much more! -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.3 (REV 0165) - 24 February 2009 -Bug fix release to repair a couple of regressions caused by changes in 1.0.2, +Bug fix release to repair a couple of regressions caused by changes in 1.0.2, as well as a couple other new problems encountered since. [ bug fixes ] @@ -9749,31 +9894,31 @@ as well as a couple other new problems encountered since. + ArrayIndexOutOfBoundsException with point() http://dev.processing.org/bugs/show_bug.cgi?id=1168 -[ changes ] +[ changes ] + Update to iText 2.1.4 for the PDF library -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.2 (REV 0164) - 21 February 2009 This release fixes many bugs and adds two minor functions to the XML library. -[ bug fixes ] +[ bug fixes ] + Empty "code" folder causing problems with Export http://dev.processing.org/bugs/show_bug.cgi?id=1084 -+ Sketches not loading when .pde file is opened from the Windows Explorer - on Asian Windows systems. ++ Sketches not loading when .pde file is opened from the Windows Explorer + on Asian Windows systems. http://dev.processing.org/bugs/show_bug.cgi?id=1089 + Disable copying of metadata and resource forks in OS X build http://dev.processing.org/bugs/show_bug.cgi?id=1098 -+ Suppress goofy Apple error message about JVMArchs ++ Suppress goofy Apple error message about JVMArchs + StringIndexOutOfBoundsException caused by import statements with no dots http://dev.processing.org/bugs/show_bug.cgi?id=1145 @@ -9825,7 +9970,7 @@ This release fixes many bugs and adds two minor functions to the XML library. http://dev.processing.org/bugs/show_bug.cgi?id=1099 http://dev.processing.org/bugs/show_bug.cgi?id=1144 -+ Fix algorithm for quadratic to cubic curve conversion ++ Fix algorithm for quadratic to cubic curve conversion http://dev.processing.org/bugs/show_bug.cgi?id=1122 Thanks to user bits.in.shambles for providing a fix. @@ -9837,7 +9982,7 @@ This release fixes many bugs and adds two minor functions to the XML library. + Fix for getChild() and getChildren() with XML elements that have null names -[ additions ] +[ additions ] + Added listChildren() method to XMLElement @@ -9845,7 +9990,7 @@ This release fixes many bugs and adds two minor functions to the XML library. in XMLElement -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0.1 (REV 0163) - 29 November 2008 @@ -9856,11 +10001,11 @@ in the last few months here: http://processing.org/reference/changes.html Also see the "known issues" section of the troubleshooting page: http://processing.org/reference/troubleshooting/#known -This release (1.0.1) fixes a handful of issues that only showed up once we +This release (1.0.1) fixes a handful of issues that only showed up once we had more testing, particularly with the wider audience we've received in the past week following the announcement. -[ bug fixes ] +[ bug fixes ] + ArrayIndexOutOfBoundsException with File > New http://dev.processing.org/bugs/show_bug.cgi?id=1067 @@ -9884,7 +10029,7 @@ past week following the announcement. + Fixed problem where small ellipses weren't showing up. -[ changes ] +[ changes ] + Implement multi-line tab via tab key (also outdent) http://dev.processing.org/bugs/show_bug.cgi?id=1075 @@ -9893,7 +10038,7 @@ past week following the announcement. http://dev.processing.org/bugs/show_bug.cgi?id=1064 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROCESSING 1.0 (REV 0162) - 24 November 2008 @@ -9901,22 +10046,22 @@ PROCESSING 1.0 (REV 0162) - 24 November 2008 Processing 1.0 has arrived! You can read an overview of changes introduced in the last few months here: http://processing.org/reference/changes.html -[ known issues ] +[ known issues ] -+ Sketches that size(w, h, OPENGL) and do not clear the background on each ++ Sketches that size(w, h, OPENGL) and do not clear the background on each frame can cause major flickering or problems when the screen clears anyway. There are several possible solutions: 1. You may need to disable the default 2x smoothing by using hint(DISABLE_OPENGL_2X_SMOOTH). - + 2. Update the drivers for your graphics card. 3. Get a decent graphics card -- the OpenGL renderer is for advanced - use, we don't support using it with cheaper built-in graphics hardware - like the Intel GMA 950. + use, we don't support using it with cheaper built-in graphics hardware + like the Intel GMA 950. - 4. If you're running Windows Vista, try disabling the Aero theme. + 4. If you're running Windows Vista, try disabling the Aero theme. This flickering issue is being tracked here: http://dev.processing.org/bugs/show_bug.cgi?id=1056 @@ -9926,23 +10071,23 @@ in the last few months here: http://processing.org/reference/changes.html reproduce it on any of our test machines, which has delayed a fix. http://dev.processing.org/bugs/show_bug.cgi?id=986 -+ With P2D, P3D, and OPENGL, series of connected lines (such as the stroke - around a polygon, triangle, or ellipse) produce unattractive results when ++ With P2D, P3D, and OPENGL, series of connected lines (such as the stroke + around a polygon, triangle, or ellipse) produce unattractive results when strokeWeight is set. http://dev.processing.org/bugs/show_bug.cgi?id=955 + Unlike most applications, the menu bar is inside the editor window when - Processing is used with Mac OS X 10.5. This is a workaround for an Apple - bug in Java 1.5 and 1.6 on Mac OS X 10.5 that causes the menu bar to be + Processing is used with Mac OS X 10.5. This is a workaround for an Apple + bug in Java 1.5 and 1.6 on Mac OS X 10.5 that causes the menu bar to be so excessively slow that the application appears to have crashed. http://dev.processing.org/bugs/show_bug.cgi?id=786 Please file a bug report with Apple at bugreporter.apple.com if you want - this fixed. The problem has existed since the spring, and we first filed - a bug with them in June, and we have received no indication that it when + this fixed. The problem has existed since the spring, and we first filed + a bug with them in June, and we have received no indication that it when it will be fixed, or if it will ever be fixed. - Or if you want to take your chances with the slow menu bar, + Or if you want to take your chances with the slow menu bar, you can change the default setting in the Preferences window. + Sketches that use the video library plus OpenGL have a problem on some @@ -9959,16 +10104,16 @@ in the last few months here: http://processing.org/reference/changes.html + The first few frames of OpenGL sketches on Windows run slowly. http://dev.processing.org/bugs/show_bug.cgi?id=874 -+ When used with P3D, strokeWeight does not interpolate the Z-coordinates - of the lines, which means that when rotated, these flat lines may - disappear. (Since, uh, lines are, you know, flat.) The OPENGL renderer - setting does not share this problem because it always draws lines ++ When used with P3D, strokeWeight does not interpolate the Z-coordinates + of the lines, which means that when rotated, these flat lines may + disappear. (Since, uh, lines are, you know, flat.) The OPENGL renderer + setting does not share this problem because it always draws lines perpendicular to the screen (which we hope to do in a future release). http://dev.processing.org/bugs/show_bug.cgi?id=956 -. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . in spite of their historical feel good campiness, i've removed the -notes from earlier releases because this file was getting out of hand. +notes from earlier releases because this file was getting out of hand. From 7c2fde9eea7319155d008661d6c984d60cd3bb18 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 10:15:04 -0800 Subject: [PATCH 062/172] finish writing release notes --- build/shared/revisions.txt | 75 +++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index dd0609f4ff..b63013b5ea 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,5 +1,8 @@ PROCESSING 3.5 (REV 0266) - 20 January 2019 +Hello from the flight back from Processing Community Day 2019 in LA! +How about a new release? Lots of bug fixes and updates for you. + [ api changes and additions ] @@ -67,7 +70,6 @@ PROCESSING 3.5 (REV 0266) - 20 January 2019 https://github.com/processing/processing/pull/5652 - [ jakub fixes ] + Prevent "could not find sketch size" message from freezing the app @@ -82,8 +84,42 @@ PROCESSING 3.5 (REV 0266) - 20 January 2019 + size(0, 0) just freezes instead of showing an error https://github.com/processing/processing/issues/5233 (duplicate) ++ Fix freeze when restarting sketch with variables in size + https://github.com/processing/processing/pull/5708 + ++ Make sure Ctrl+Left Mouse on MacOS is consistent + https://github.com/processing/processing/issues/5672 + https://github.com/processing/processing/pull/5674 -[ bug fixes and improvements ] ++ Stop frame rate counter from exaggerating + https://github.com/processing/processing/pull/5697 + ++ Fix vertex buffer initialized with wrong number of components + https://github.com/processing/processing/pull/5698 + ++ Recreate FBOs when offscreen PGraphicsOpenGL is resized + https://github.com/processing/processing/pull/5699 + + +[ andres with the updates ] + ++ Silence TIS/TSM warning message with P2D/P3D/OPENGL since macOS 10.13.4 + https://github.com/processing/processing/issues/5462 + ++ Improve matrix performance in P2D/P3D + https://github.com/processing/processing/issues/5685 + ++ Initializing textures loads the pixels array, even if not needed aferwards + https://github.com/processing/processing/issues/5748 + ++ Improve startup time by skipping the Android SDK folder when listing sketches + https://github.com/processing/processing/issues/5707 + ++ PShape.attrib() and PShape.setAttrib() are not working + https://github.com/processing/processing/issues/5560 + + +[ still more bug fixes and improvements ] + Improve startup time when user-specified fonts are not used. The default font will be faster, using ttf/otf is fine. @@ -97,48 +133,13 @@ PROCESSING 3.5 (REV 0266) - 20 January 2019 + If settings() present but pixelDensity() is in setup(), no error message https://github.com/processing/processing/issues/4703 - -[ minor updates ] - - + Fix several out of date links in the Help menu https://github.com/processing/processing/issues/5729 + Update the About screen to 2019 - -[ internal changes ] - + Update to Java 8u192, then to 8u202 -andres -X silence TIS/TSM warning message with P2D/P3D/OPENGL since macOS 10.13.4 -X https://github.com/processing/processing/issues/5462 -X improve matrix performance in P2D/P3D -X https://github.com/processing/processing/issues/5685 -X Initializing textures loads the pixels array, even if not needed aferwards -X https://github.com/processing/processing/issues/5748 -X Processing 3.4 takes 60 seconds before can edit file -X https://github.com/processing/processing/issues/5707 -X skip Android's SDK folder when adding sketches -X https://github.com/processing/processing/commit/5b653263cc6151f838c11a61689d756901c11e37 -X PShape.attrib() and PShape.setAttrib() are not working -X https://github.com/processing/processing/issues/5560 - -jakub -X Fix freeze when restarting sketch with variables in size -X https://github.com/processing/processing/pull/5708 -X Make sure Ctrl+Left Mouse on MacOS is consistent -X https://github.com/processing/processing/issues/5672 -X https://github.com/processing/processing/pull/5674 -X Stop frame rate counter from exaggerating -X https://github.com/processing/processing/pull/5697 -X Fix vertex buffer initialized with wrong number of components -X https://github.com/processing/processing/pull/5698 -X Recreate FBOs when offscreen PGraphicsOpenGL is resized -X https://github.com/processing/processing/pull/5699 - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . From 3dab651a91ba6e30ada5ea3ce8e25d3c83f43c74 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 10:20:01 -0800 Subject: [PATCH 063/172] notes about rolling the version --- build/shared/revisions.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index b63013b5ea..7fe0fe13e9 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -3,6 +3,9 @@ PROCESSING 3.5 (REV 0266) - 20 January 2019 Hello from the flight back from Processing Community Day 2019 in LA! How about a new release? Lots of bug fixes and updates for you. +We're rolling the minor version from 3.4 to 3.5 because of the additions +to the API and a minor (breaking) change to remove() in the Dict classes. + [ api changes and additions ] From cbfc31ccfef7cd519ec48d29d4c5f2dc6bfd0528 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 20 Jan 2019 10:28:14 -0800 Subject: [PATCH 064/172] fixing #4703 reveals another bug --- java/src/processing/mode/java/JavaBuild.java | 1 + java/src/processing/mode/java/preproc/PdePreprocessor.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/java/src/processing/mode/java/JavaBuild.java b/java/src/processing/mode/java/JavaBuild.java index 034c5b0341..85413a4eae 100644 --- a/java/src/processing/mode/java/JavaBuild.java +++ b/java/src/processing/mode/java/JavaBuild.java @@ -255,6 +255,7 @@ public String preprocess(File srcFolder, writer.close(); } } catch (RuntimeException re) { + re.printStackTrace(); throw new SketchException("Could not write " + java.getAbsolutePath()); } } catch (antlr.RecognitionException re) { diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java index a6aeb746a4..81b0008a22 100644 --- a/java/src/processing/mode/java/preproc/PdePreprocessor.java +++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java @@ -1230,7 +1230,8 @@ protected void writeFooter(PrintWriter out, String className) { if ((mode == Mode.STATIC) || (mode == Mode.ACTIVE)) { // doesn't remove the original size() method, // but calling size() again in setup() is harmless. - if (!hasMethod("settings") && sizeInfo.hasSettings()) { + if (!hasMethod("settings") && + sizeInfo != null && sizeInfo.hasSettings()) { out.println(indent + "public void settings() { " + sizeInfo.getSettings() + " }"); } From f6ae3a5237117dd729a70d6ef54e521d68026dbd Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 21 Jan 2019 08:37:40 -0500 Subject: [PATCH 065/172] starting 3.5.1 --- app/src/processing/app/Base.java | 10 +- core/done.txt | 506 +++++++++++--------- core/todo.txt | 87 +--- done.txt | 780 +++++++++++++++++-------------- todo.txt | 75 +-- 5 files changed, 733 insertions(+), 725 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 1289f3e10e..919440f4dc 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-18 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology @@ -56,9 +56,9 @@ public class Base { // Added accessors for 0218 because the UpdateCheck class was not properly // updating the values, due to javac inlining the static final values. - static private final int REVISION = 266; + static private final int REVISION = 267; /** This might be replaced by main() if there's a lib/version.txt file. */ - static private String VERSION_NAME = "0266"; //$NON-NLS-1$ + static private String VERSION_NAME = "0267"; //$NON-NLS-1$ /** Set true if this a proper release rather than a numbered revision. */ /** @@ -1706,8 +1706,8 @@ protected boolean addSketches(JMenu menu, File folder, if (expectedSDKPath.getAbsolutePath().equals(suspectSDKPath.getAbsolutePath())) { return false; // Most likely the SDK folder, skip it } - } - + } + String[] list = folder.list(); // If a bad folder or unreadable or whatever, this will come back null if (list == null) { diff --git a/core/done.txt b/core/done.txt index dbd6c00f38..e616f82f31 100644 --- a/core/done.txt +++ b/core/done.txt @@ -1,3 +1,91 @@ +0266 (3.5) +X fix javaPlatform variable for newer JDK versions +X https://github.com/processing/processing/pull/5626 +o many fonts installed causes slow startup on macos +o run that on a thread, and make sure default font doesn't need the list loaded +X can't be done, notes in the code for PFont.loadFonts() +X improve startup time when user-specified fonts are not used +X default font will be faster, using ttf/otf is fine +X only createFont("The Font Name") is still slow on macOS +X and PFont.list() +o check again whether element 0,0 in a Table is working +X https://github.com/processing/processing/issues/3011 +X was already checked, made a note and locked the issue + +api changes +X Dict.remove() should return value, not index (for consistency w/ others) +X returns the value removed, not the key, just like remove(key) +X rationale being that if you know the index, you probably know the key +X if unavailable, throw an exception; otherwise no consistent way to indicate error +X add circle() and square() +X add push() and pop() +X make JSONObject.quote() (both versions) public +X should DoubleDict create from Iterable or Map<>? +o (Map is more efficient b/c of size, Iterable more useful) +X Iterable of what, though? Map.Entry? +X sticking with just the Map<> version for now + +contrib +o make tabs into spaces, fixes pixelDensity(2) issue with tabs +o https://github.com/processing/processing/issues/5625 +o https://github.com/processing/processing/pull/5633 +X had to back this fix out again +X Fixes blend mode not being set correctly, fixing #5645 +X https://github.com/processing/processing/issues/5645 +X https://github.com/processing/processing/pull/5647 +X extended SVG support +X https://github.com/processing/processing/pull/4168 +X show a warning when a font isn't what the user expected +X https://github.com/processing/processing/issues/5481 +X https://github.com/processing/processing/pull/5605 + +gohai +X Profile GL3bc is not available on X11GraphicsDevice +X https://github.com/processing/processing/issues/5476 +X https://github.com/processing/processing/pull/5652 + +andres +X silence TIS/TSM warning message with P2D/P3D/OPENGL since macOS 10.13.4 +X https://github.com/processing/processing/issues/5462 +X improve matrix performance in P2D/P3D +X https://github.com/processing/processing/issues/5685 +X Initializing textures loads the pixels array, even if not needed aferwards +X https://github.com/processing/processing/issues/5748 +X Processing 3.4 takes 60 seconds before can edit file +X https://github.com/processing/processing/issues/5707 +X skip Android's SDK folder when adding sketches +X https://github.com/processing/processing/commit/5b653263cc6151f838c11a61689d756901c11e37 +X PShape.attrib() and PShape.setAttrib() are not working +X https://github.com/processing/processing/issues/5560 + +jakub +X Fix freeze when restarting sketch with variables in size +X https://github.com/processing/processing/pull/5708 +X Make sure Ctrl+Left Mouse on MacOS is consistent +X https://github.com/processing/processing/issues/5672 +X https://github.com/processing/processing/pull/5674 +X Stop frame rate counter from exaggerating +X https://github.com/processing/processing/pull/5697 +X Fix vertex buffer initialized with wrong number of components +X https://github.com/processing/processing/pull/5698 +X Recreate FBOs when offscreen PGraphicsOpenGL is resized +X https://github.com/processing/processing/pull/5699 + +cleaning +o WARNING: GL pipe is running in software mode (Renderer ID=0x1020400) +o is this coming from us? if so, need to provide actions +X haven't seen for a while, maybe fixed +X figure our size(img.width, img.height) situation +X just make loadImage() work in settings +X update the wiki and reference +o update wiki/docs to say "don't override sketchXxxx() methods" +o size() command not working to do a resize +X need a programmatic way to set size +o check on performance of the new EDT setup +X present mode is 30-40% slower than windowed +X w/ this example: https://github.com/processing/processing/issues/2423 + + 0265 (3.4) X change lack of blendMode() to a warning rather than an error in PDF X rewrite exec() to do threads, also handle fast/excessive output cases @@ -154,7 +242,7 @@ X Assigning Pixels Vertically Flipped in P2D X https://github.com/processing/processing/issues/5013 gohai -X improve loadBytes() performance +X improve loadBytes() performance X https://github.com/processing/processing/pull/5027 jakub @@ -251,7 +339,7 @@ o probably should also check to make sure PApplet running JVM 8 X or compile against 1.8 and force it? andres -X PShape array index out of bounds when using P3D +X PShape array index out of bounds when using P3D X https://github.com/processing/processing/issues/4773 X modelX/Y/Z() should be disabled in P2D X https://github.com/processing/processing/issues/4813 @@ -380,7 +468,7 @@ X disable async saveFrame() by default X https://github.com/processing/processing/issues/4578 gohai -X Fix GLExceptions on Raspberry Pi when using offscreen PGraphics +X Fix GLExceptions on Raspberry Pi when using offscreen PGraphics X https://github.com/processing/processing/pull/4524 leslie @@ -466,7 +554,7 @@ X Flipped Y-axis in JavaFX is now done (JDK bug) X https://github.com/processing/processing/issues/3795 jakub -X Initialize sketch args before calling settings() +X Initialize sketch args before calling settings() X https://github.com/processing/processing/issues/4219 X https://github.com/processing/processing/pull/4220 @@ -491,7 +579,7 @@ X strokeWeight() not working properly with point() in P2D and P3D X https://github.com/processing/processing/issues/4188 X exit() is not called in P2D/P3D X https://github.com/processing/processing/issues/4156 -X attrib*() function does not work well with PShape +X attrib*() function does not work well with PShape X https://github.com/processing/processing/issues/4048 contribs @@ -525,7 +613,7 @@ X https://github.com/processing/processing/issues/3961 X https://github.com/processing/processing/issues/3968 andres -X cursor() fails to work as expected with P2D/P3D +X cursor() fails to work as expected with P2D/P3D X https://github.com/processing/processing/issues/3955 X Topics/Shader/Convay broken X https://github.com/processing/processing/issues/3947 @@ -638,7 +726,7 @@ X https://github.com/processing/processing/issues/3718 X Implement standard cursor types in OpenGL X https://github.com/processing/processing/issues/3554 X Change value of constants PRIMITIVE, PATH, and GEOMETRY constants in PShape -X This avoids a collision with entries in PConstants which causes +X This avoids a collision with entries in PConstants which causes X confusing errors or no errors to be thrown at all X https://github.com/processing/processing/issues/3776 X Fix flickering cursor regression with Java2D on Windows introduced by #3472 @@ -673,7 +761,7 @@ X FX - fix transformation stack NPE X https://github.com/processing/processing/pull/3710 X FX - fix rad-deg conversion in rotate() X https://github.com/processing/processing/pull/3711 -X FX - basic pixel operations (get, set, load, update) +X FX - basic pixel operations (get, set, load, update) X https://github.com/processing/processing/pull/3709 X FX - align to pixel grid when drawing 1 px strokes X https://github.com/processing/processing/pull/3712 @@ -713,7 +801,7 @@ X FX - fix bug where fonts would share a tint cache X https://github.com/processing/processing/pull/3771 X textFont() and textSize() are each calling one another X move createFont() to PGraphics -X Fix PShape creation in P3D +X Fix PShape creation in P3D X https://github.com/processing/processing/pull/3781 X keyTyped() not firing with P2D and P3D X https://github.com/processing/processing/issues/3582 @@ -870,7 +958,7 @@ X https://github.com/processing/processing/issues/324 X Jakub: fixed somewhere between 0179 and 0184 cleaning/fixed earlier -X splice() throws ClassCastException when used with objects like PVector +X splice() throws ClassCastException when used with objects like PVector X http://code.google.com/p/processing/issues/detail?id=1407 X https://github.com/processing/processing/issues/1445 o Semitransparent rect drawn over image not rendered correctly @@ -930,13 +1018,13 @@ X http://code.google.com/p/processing/issues/detail?id=146 X https://github.com/processing/processing/issues/185 X OPENGL sketches flicker w/ Vista when background() not used inside draw() X Disabling Aero scheme sometimes prevents the problem -X Updating graphics drivers may prevent the problem +X Updating graphics drivers may prevent the problem X ellipse scaling method isn't great X http://code.google.com/p/processing/issues/detail?id=87 X Stroking a rect() leaves off the upper right pixel X http://code.google.com/p/processing/issues/detail?id=67 X https://github.com/processing/processing/issues/106 -X opengl applet problems with tabs - needs to handle stop() and start() +X opengl applet problems with tabs - needs to handle stop() and start() X http://code.google.com/p/processing/issues/detail?id=196 X stop() called between tabs/pages, start() may be called again X http://java.sun.com/docs/books/tutorial/deployment/applet/lifeCycle.html @@ -970,7 +1058,7 @@ X Remove mode parameters from createShape(), fixes parameter collision issues X https://github.com/processing/processing/pull/3516 X radius for rect not working on PShape X https://github.com/processing/processing/issues/2646 -X bug in arc with createShape +X bug in arc with createShape X https://github.com/processing/processing/issues/3018 X OpenGL sketch flickers when draw() is missing or empty X https://github.com/processing/processing/issues/3473 @@ -979,7 +1067,7 @@ X size() errors X https://github.com/processing/processing/issues/3483 X improve hint(ENABLE_DEPTH_SORT) to use proper painter's algo X https://github.com/processing/processing/issues/90 -X also for begin/endRaw: +X also for begin/endRaw: X https://github.com/processing/processing/issues/2235 X polygon z-order depth sorting with alpha in opengl X complete the implementation of hint() with proper implementation @@ -1024,7 +1112,7 @@ X Device parsing on Linux is incorrect X https://github.com/processing/processing/issues/3532 o don't show display warning when display 1 doesn't exist X apparently this was an OpenGL bug (#3532) -X flush geometry when lighting changes +X flush geometry when lighting changes X otherwise lights apply to the entire scene X https://github.com/processing/processing/issues/3533 @@ -1042,10 +1130,10 @@ X https://github.com/processing/processing/issues/3378 X PGraphic ignores PNG transparency (regression from 3.0a5) X https://github.com/processing/processing/issues/3317 X (same issue as 3378) -X move error messages out of PConstants (into PApplet? PGraphics?) +X move error messages out of PConstants (into PApplet? PGraphics?) o replace sketchXxxx() methods with another mechanism? o and an internal dictionary that stores them all? -o intParam(), stringParam() and setParam()? +o intParam(), stringParam() and setParam()? o or sketchInt() or settingsInt()? o surface.size(), surface.noSmooth()... just like PGraphics methods? o make final to move folks away from these? @@ -1154,7 +1242,7 @@ X Closing OpenGL sketch from the PDE doesn't stop java.exe process X https://github.com/processing/processing/issues/2335 cleaning -o keep Danger2D? +o keep Danger2D? o can't do version that draws to BufferStrategy directly o pixel operations (get/set/loadPixels/saveFrame) might be fixable o but can't re-run draw() to re-blit the screen @@ -1166,7 +1254,7 @@ X decided to put efforts into JavaFX 0237 (3.0a10) X retain original java.awt.Frame when it's available from PSurfaceAWT -X set frame icon images for Java2D (dock and cmd-tab) +X set frame icon images for Java2D (dock and cmd-tab) X https://github.com/processing/processing/issues/257 X strokeWeight() in setup() not working for default renderer X https://github.com/processing/processing/issues/3331 @@ -1238,7 +1326,7 @@ X size() inside setup() can only have numbers X size() inside settings() is left alone and can do whatever it wants X comments are being removed before size() is getting checked X probably remove anything inside settings() as well? -X looks like we're off by 1 on monitor numbering +X looks like we're off by 1 on monitor numbering X https://github.com/processing/processing/issues/3309 X full screen doesn't work on second window w/o present mode X https://github.com/processing/processing/issues/3271 @@ -1281,7 +1369,7 @@ X https://github.com/processing/processing/issues/2125 X group shapes are broken in 3.0a9 X https://github.com/processing/processing/issues/3336 X only a quarter of the sketch is appearing with P2D_2X and P3D_2X -X (i.e. the image shows up too large) +X (i.e. the image shows up too large) X https://github.com/processing/processing/issues/3332 X https://github.com/processing/processing/issues/3327 X single transparent pixel at end of textures in OpenGL @@ -1343,7 +1431,7 @@ X https://github.com/processing/processing/issues/3293 0235 (3.0a8) -X fairly major rewrite of createShape() +X fairly major rewrite of createShape() X prevents same code from appearing 5x (!) in the source X improves bad api design with the static createShapeImpl() methods X errors in case changes not correctly reported @@ -1377,7 +1465,7 @@ X otherwise args == null checks are weird X saveFrame() from setup() gives a black screen when size() is called X as seen in the 'numbers' sketch X this was fixed earlier? -X fix flicker when resizing window +X fix flicker when resizing window X running through PSurfaceAWT.setSize() is probably overkill o setLocationRelativeTo(null) was removed, will it be missed? @@ -1550,13 +1638,13 @@ X Linux throwing IllegalStateException: Buffers have not been created X in render() (called from blit) PSurfaceAWT:301 -0232 core (3.0a5) +0232 core (3.0a5) X detect CMYK JPEG images and return null X https://community.oracle.com/thread/1272045?start=0&tstart=0 X show a warning when calling getVertexCount() on GROUP or PRIMITIVE shapes X https://github.com/processing/processing/issues/2873 X https://github.com/processing/processing-docs/issues/167 -X replace is3D(boolean) with set3D() +X replace is3D(boolean) with set3D() data X fix XML.getString() with a default when no attrs are present at all @@ -1623,7 +1711,7 @@ X update to new version of JOGL (Andres) 0230 core (3.0a3) X add another NaN check when sorting FloatList/Dict classes X if all values were NaN, an ArrayIndexOutOfBoundsException was thrown -X PShape for JAVA2D +X PShape for JAVA2D X https://github.com/processing/processing/pull/2756 X add trim() method to the XML library @@ -1760,7 +1848,7 @@ X https://github.com/processing/processing/issues/2331 X https://github.com/processing/processing/pull/2338 X bug in relative moveto commands for SVG X https://github.com/processing/processing/issues/2377 -X Add a constructor to bind Server to a specific address +X Add a constructor to bind Server to a specific address X https://github.com/processing/processing/issues/2356 X add disconnectEvent() to Server X https://github.com/processing/processing/pull/2466 @@ -1768,18 +1856,18 @@ X https://github.com/processing/processing/issues/2133 X don't document for now cleaning -o how much of com.benfry.* should go in? +o how much of com.benfry.* should go in? o Table? StringIntPairs? JSON? MD5? Integrator? ColorIntegrator? o decision: depends on if we can think of a good name X finished these up in the 2.x series o check on DXFWriter, since it used to subclass P3D -o at least implement is3D? +o at least implement is3D? X should be working, barring recent regression o sleep time needs to be set *much* higher for dormant applets o 10s should be fine--no need to keep spinning (bad for android too) o just call interrupt() when it's time to get back to work X applets removed -X test PGraphicsRetina2D w/ 7u40 +X test PGraphicsRetina2D w/ 7u40 X make sure that 7u40 doesn't reintroduce starvation issue on retina Macs X createGraphics() with no renderer param to point to JAVA2D X docs: P2D and P3D are now OpenGL variations @@ -1882,7 +1970,7 @@ X alpha values from the pixels array coming back as 0 X only tested on background(), not image() X https://github.com/processing/processing/issues/2030 -opengl +opengl X Using sketchQuality() does not work properly with P3D, OPENGL, P2D X https://github.com/processing/processing/pull/2157 X Fix crashes when the sketch window is resized @@ -1925,7 +2013,7 @@ X https://github.com/processing/processing/issues/2113 X constrain lerpColor() between 0 and 1 X JSONObject/Array.format(-1) not working on embedded JSONObjects X https://github.com/processing/processing/issues/2119 -X allow println() and print() to take varargs +X allow println() and print() to take varargs o https://github.com/processing/processing/issues/2056 X causes conflict with printing arrays X added printArray() function instead @@ -2023,7 +2111,7 @@ X Error in IntList and FloatList insert() X https://github.com/processing/processing/issues/1929 X selectInput() in exported OS X sketch treats .app package as a folder o Oracle Java 7 problem, but maybe a workaround? -o might be a problem with awt dialogs for directories? +o might be a problem with awt dialogs for directories? X https://github.com/processing/processing/issues/1959 X turns out this is an apple.awt tweak for the exported Info.plist X getSubset() broken in IntList, StringList, and missing from FloatList @@ -2039,7 +2127,7 @@ X add sum() to IntList and FloatList X https://github.com/processing/processing/issues/1893 X retain blendMode() between frames X https://github.com/processing/processing/issues/1962 -X this should actually be in the code.. +X this should actually be in the code.. X maybe not working on OS X/retina? X perhaps it's a getGraphics() issue? X when using increment() on IntList, make sure the index exists @@ -2062,7 +2150,7 @@ o require people to put things in the data folder table X add sort() to Table X implement version of Table that takes a dictionary file -X dictionary=blah.tsv +X dictionary=blah.tsv X tsv only, ignores extension X if allowed extension, we couldn't use .dict instead X and that's probably the most useful @@ -2171,7 +2259,7 @@ X switch to CATEGORY instead of CATEGORICAL X removed createXML() and createTable()... just use 'new' for these X implement means for setting dpi in PNG images X need to add something for API yet -o JAI handles setting image size for png (check javax.imageio?) +o JAI handles setting image size for png (check javax.imageio?) o PNGEncodeParam png = PNGEncodeParam.getDefaultEncodeParam(bufImage); o png.setPhysicalDimension(round(dpi*39.370079), round(dpi*39.370079), 1); o JAI.create("filestore", bufImage, filename+".png", "PNG"); @@ -2183,7 +2271,7 @@ X only call setModified(), not updatePixels() in endDraw() andres A lines not properly renderered in P3D when using ortographic projection A https://github.com/processing/processing/issues/1661 -A "deleted n framebuffer objects" +A "deleted n framebuffer objects" A last lines of a beginShape(LINES) are invisible in the P2D renderer A https://github.com/processing/processing/issues/1761 A Incorrect number of vertices on beginShape(TRIANGLES) affect subsequent Shapes @@ -2194,7 +2282,7 @@ A https://github.com/processing/processing/issues/1757 earlier X decision on registered methods X remove registerPre() et al -X add register("pause", ...) +X add register("pause", ...) X size() should be resize(), so it can be overridden (ala pause()) X add PEvent X need to wrap mouse/key events for p5 @@ -2245,17 +2333,17 @@ X api note: size() used in data classes X length() too confusing w/ array.length being built-in (when to use ()?) X size() a bit confusing with the p5 size command, but less problematic o also shorter than getCount() or getLength() -o why not HashMap and ArrayList for JSON? +o why not HashMap and ArrayList for JSON? o could enable loadHash() and loadArray() functions X because the types coming back out would always have to be cast o add loadDict() and loadList() for JSON? -o Dict and List could be interfaces? +o Dict and List could be interfaces? X "hash.toJSONObject()" or "new JSONObject(hash)" X opted to use "new JSONObject" version, appears less awkward o match? find? on StringList? X naming for descending sort -o rsort(), sortReverse(), sortKeysReverse, -o sortDescend, sortDescending, sortKeysDescending, +o rsort(), sortReverse(), sortKeysReverse, +o sortDescend, sortDescending, sortKeysDescending, o sortHighLow, sortHigh, sortHighest, sortDown X sortReverse() is the final decision @@ -2274,7 +2362,7 @@ o inc(), inc(amount), dec(), dec(amount) X replace (especially for null and NaN) X make note that these work, and are special cases o listAttributes() in XML is like array from keys() etc in our data classes -X removeIndex() vs removeValue() vs remove() +X removeIndex() vs removeValue() vs remove() X remove() refers to an index (with array) or key (with hash) X more consistent with other APIs (Java) X replaceValue[s]() the same, though more on the line @@ -2302,15 +2390,15 @@ X misc bugs with last release X https://github.com/processing/processing/issues/1660 X https://github.com/processing/processing/issues/1680 X Dan having trouble with JSON -X keys() vs keySet() in JSON.. +X keys() vs keySet() in JSON.. X keys() doesn't iterate, keySet() introduces 'Set' type X parseJSONObject(x) and parseJSONArray(x) table -X do we need getColumnType() inside TableRow? +X do we need getColumnType() inside TableRow? X also inside Table X also do we make the constants public? -X table writing twice when .csv is added +X table writing twice when .csv is added X https://github.com/processing/processing/issues/1734 X checkOptions() is a mess.. need to use different options for load/save X rewrite it as necessary @@ -2321,7 +2409,7 @@ X handling gz properly, but gz has to be the extension X adding it to options is too messy o add 'gz' as one of the loadXxx() options o helps .svgz case from being weird, also generally dealing w/ compressed data -X include SQL, HTML, ODS, binary? +X include SQL, HTML, ODS, binary? X decide on TableODS, TableHTML X HTML is out--too confusing X ODS is in for loading, and finished @@ -2364,7 +2452,7 @@ o when using loadFont(), don't enable native fonts unless hint() in use o but on createFont(), we're probably OK o might need to make reference notes about the two behaviors X decision: remove hint(ENABLE_NATIVE_FONTS) -X PImage.resize() greater than image size hangs +X PImage.resize() greater than image size hangs X http://code.google.com/p/processing/issues/detail?id=1463 X turns out to be errata from the book X add warning message when registering AWT mouse/key events @@ -2482,7 +2570,7 @@ X makeEmptyNull() -> replace("", null); X saveTable("filename.tsv") or saveTable("filename.txt", "tsv") X createTable() method in PApplet X removed getUniqueXxxx() and some others, pending names -X added listUnique() and tallyUnique() +X added listUnique() and tallyUnique() X added getColumnCount() to TableRow X cleaned up checkBounds() @@ -2500,15 +2588,15 @@ o isWhitespace() method for nodes? (that's the capitalization used in Character) X doesn't help much o get back to PhiLho once finished X XML toString(0) means no indents or newlines -X but no way to remove indents and still have newlines... +X but no way to remove indents and still have newlines... X toString(-1)? a new method? X format(2), format(4)... toString() -> default to 2 params X fix this across the other items X look into json and how it would work wrt XML -o 1) we bring back getFloatAttribute() et al., +o 1) we bring back getFloatAttribute() et al., o and make getFloat() be equivalent to parseFloat(xml.getContent()) o 2) we keep getFloat() like it is, and add getFloatContent(), etc. -o 3) we deprecate our nice short getFloat/getInt/etc and go with +o 3) we deprecate our nice short getFloat/getInt/etc and go with o getXxxxAttribute() and getXxxxContent() methods. X not gonna do getFloatContent() since it's not really any shorter X beginning slash in getChild() threw an NPE @@ -2522,7 +2610,7 @@ X change to getRows() method for iterating through the Table object X add parseInto() method (provisional) X change translate() and rotate() to use x, y, z as param names o opengl.jar with eclipse -o auto-extract native libs from opengl.jar +o auto-extract native libs from opengl.jar o to remove java.library.path problems (!) X no longer necessary, JOGL does this by default X implement clip()/noClip() @@ -2569,7 +2657,7 @@ X make note for Casey to include this in the reference X Potential race condition when resizing sketches X http://code.google.com/p/processing/issues/detail?id=697 X removed mask(int[]).. check reference to make sure it's not in use -X how to handle get(x, y, w, h) when off screen? +X how to handle get(x, y, w, h) when off screen? X http://code.google.com/p/processing/issues/detail?id=925 A curves aren't rendered seperately when P3D or P2D is specified A http://code.google.com/p/processing/issues/detail?id=1317 @@ -2617,7 +2705,7 @@ X change name for hint() that controls stroke/fill combo: andres (cleanup) A when turning smoothing on, internal lines of shapes are visible -o add an edge flag when tesselating +o add an edge flag when tesselating o mind the opengl tesselation flags o need to turn off smoothing for the interior of shapes A http://code.google.com/p/processing/issues/detail?id=53 @@ -2673,7 +2761,7 @@ o loading lots of images is a problem, describe how to unload o is it possible? necessary to call delay(5) or something? events -X make sure alt/ctl/meta/etc all work (for both mouse and key) +X make sure alt/ctl/meta/etc all work (for both mouse and key) X remove thread blocking when dequeueing events X finish postEvent() X need to make events interleave @@ -2751,7 +2839,7 @@ A Using ortho() breaks stroke rendering A http://code.google.com/p/processing/issues/detail?id=1207 earlier -A Implement support for complex shapes when using the OpenGL renderer +A Implement support for complex shapes when using the OpenGL renderer A in opengl mode, use its tesselator A because the vertex calls can just come right back to regular vertex calls A this way we can also implement breakShape() for opengl @@ -2766,7 +2854,7 @@ A http://code.google.com/p/processing/issues/detail?id=902 A updatePixels wth OpenGL requires a lot of memory, need better texture update A http://code.google.com/p/processing/issues/detail?id=77 A text characters showing up as opaque rectangles in tga files -o solution is to implement alpha compositing across all of P3D +o solution is to implement alpha compositing across all of P3D o http://en.wikipedia.org/wiki/Alpha_compositing A http://code.google.com/p/processing/issues/detail?id=80 A changing framerate causes program to crash with P2D in 2.0a6 @@ -2791,13 +2879,13 @@ X provide a way to clear the PGraphics with plain alpha X removed in the end... background() can already do it X work on making API more generic and consistent X PFont.getFont() changed to PFont.getNative() (returns an Object) -X PFont.getTypeface() changed to PFont.getNative() +X PFont.getTypeface() changed to PFont.getNative() X PImage.getBitmap() and getImage() changed to PImage.getNative() X use getNative() to return the native object for X PImage (BufferedImage and Bitmap), PFont (Typeface or awt.Font) X Jagged / Glitchy JAVA2D shape strokes in Java 1.6 -X g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, -X RenderingHints.VALUE_STROKE_PURE); +X g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, +X RenderingHints.VALUE_STROKE_PURE); X http://code.google.com/p/processing/issues/detail?id=1068 X loadShape() cleanup A remove PShape2D/3D @@ -2853,7 +2941,7 @@ X broken in the recent releases X http://code.google.com/p/processing/issues/detail?id=1157 fixed earlier -A ArrayIndexOutOfBoundsException inside PFontTexture.updateGlyphsTexCoords() +A ArrayIndexOutOfBoundsException inside PFontTexture.updateGlyphsTexCoords() A http://code.google.com/p/processing/issues/detail?id=1104 A Camera function hot changing the upward axis A http://code.google.com/p/processing/issues/detail?id=534 @@ -2911,7 +2999,7 @@ o otherwise can crash the whole browser o z value hack for lines is causing trouble for 2D o http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1089737928;start=0 o rewrite line and stroke code, it's a buggy mess -o lines become 2 pixels thick after a 3D transform +o lines become 2 pixels thick after a 3D transform o better handling of single-pixel special case o flat_line_retribution is a hack, can go away o some optimizations from zach @@ -2922,7 +3010,7 @@ o one pixel lines have no z value.. argh o bug re: 3d depth sorting on lines o http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1043894019;start=0 o http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1042004618 -o translate(58, 48, 0); +o translate(58, 48, 0); o rotateY(0.5); o box(40); o cursor() broken in applets on macosx? @@ -2943,7 +3031,7 @@ X createGraphics for JAVA2D generates the wrong error msg w/ w/h <= 0 X http://code.google.com/p/processing/issues/detail?id=983 X move to processing.data.* package X update the internal code for Android and desktop to add the import -X add loadTable().. +X add loadTable().. X loadXML and loadTable are now in desktop o trimming text on URLs? o http://code.google.com/p/processing/issues/detail?id=715 @@ -2952,7 +3040,7 @@ X update wiki.processing.org/w/Window_Size_and_Full_Screen X add createGraphics() with no renderer param to point to JAVA2D X also added to Android X removals -X CENTER_RADIUS, CENTER_DIAMETER, NORMALIZED +X CENTER_RADIUS, CENTER_DIAMETER, NORMALIZED X text(x, y, w, h, z) X textX/Y/Z variables X update changes Wiki @@ -2963,7 +3051,7 @@ X it hasn't worked for a while, also not a good way to get updates on size X use pre() or something like that instead o displayWidth/Height not set until just before setup o don't use size(displayWidth, displayHeight) anymore -o to do full screen, should use: +o to do full screen, should use: X did not work well andres @@ -3016,7 +3104,7 @@ o should this be the default to be more like old XML? o otherwise document how things are sometimes null in XML o test xml examples to see if they break X changed to make it return #text for the name, which is more correct -X white space in XML +X white space in XML X http://code.google.com/p/processing/issues/detail?id=975 o finish updating XML documentation o http://code.google.com/p/processing/issues/detail?id=382 @@ -3038,10 +3126,10 @@ X several other items under the LIBRARIES / XML section below sort out full screen issues X make screenWidth and screenHeight work properly with multiple screens X also set screenX and screenY -X boolean sketchFullscreen() ? +X boolean sketchFullscreen() ? X for more options, just integrate the fs library? X let hansi know when it's integrated so he can update his library -X casey: I think we only want to most basic functionality, +X casey: I think we only want to most basic functionality, X to go full screen across monitors. X http://www.superduper.org/processing/fullscreen_api/ X https://github.com/kritzikratzi/jAppleMenuBar/blob/master/src/native/jAppleMenuBar.m @@ -3074,7 +3162,7 @@ X frame.setSize() works, but we aren't going to add the title bar back X just too problematic and buggy to get this to work perfectly X default is that full screen app doesn't cover multiple displays X this is fine since opengl can't usually go across both -o but include an example for how to use full in gl +o but include an example for how to use full in gl o full screen not working on snow leopard X fix build script to include the jnilib, also add more error checks X screenX and screenY are both already taken, so not including vars for them @@ -3082,7 +3170,7 @@ X decide on naming for the next release 0204 core (2.0a5) -X Abnormal high Java CPU usage at empty sketch with draw() +X Abnormal high Java CPU usage at empty sketch with draw() X http://code.google.com/p/processing/issues/detail?id=729 X https://forum.processing.org/topic/absurd-java-cpu-usage-at-empty-sketch-with-draw X "Framingham" example has BufferOverflowException @@ -3111,7 +3199,7 @@ X remove textMode(SCREEN) o is it possible to do decent vlw text with JAVA2D and OPENGL? o optimize textMode(MODEL) with textMode(SCREEN) o in PGraphics and PGraphics3, check to see if matrix is within epsilon -o of one of the rotation matrices (many fewer steps) +o of one of the rotation matrices (many fewer steps) o if identity, or just translate, or a rotate, make OBJECT into SCREEN o textMode(SCREEN) needs to be faster o need flat image implementation that takes no transforms @@ -3166,7 +3254,7 @@ X add orientation() no-op and the two constants 0198 core -o arrayobjects (and others) flicker like hell in chrome 10 +o arrayobjects (and others) flicker like hell in chrome 10 o http://code.google.com/p/processing/issues/detail?id=646 o http://code.google.com/p/chromium/issues/detail?id=62004 o http://code.google.com/p/chromium/issues/detail?id=79939 @@ -3220,10 +3308,10 @@ A implement repeating textures A http://code.google.com/p/processing/issues/detail?id=94 o add a limit to pushStyle() to catch unmatched sets? X http://code.google.com/p/processing/issues/detail?id=198 -X how should quadVertex() be named? bezierVertex() quadraticVertex() +X how should quadVertex() be named? bezierVertex() quadraticVertex() X decision: quadraticVertex() to avoid confusion with quads X more efficient version of copy() added for 2D -X rounded rectangle method +X rounded rectangle method X http://code.google.com/p/processing/issues/detail?id=265 X clockwise from upper-left X check with casey about finalizing and adding to the docs @@ -3241,20 +3329,20 @@ X http://code.google.com/p/processing/issues/detail?id=455 X decision: post() only gets called in draw, not setup.. document opengl applets -X implement new applet-opengl.html based on the latest jogl +X implement new applet-opengl.html based on the latest jogl o jogl demos, NEWT examples crash on osx http://jogamp.org/jogl-demos/www/ o http://jogamp.org/jogl-demos/www/applettest-jnlp.html X not sure why these do/don't work, but it's mostly working X OpenGL Applets won't load with JRE 6 update 21 or higher X need to make the final call on this and implement X http://code.google.com/p/processing/issues/detail?id=429 -o why we can't do OpenGL applets that are self-signed (wiki?) +o why we can't do OpenGL applets that are self-signed (wiki?) o http://www.cert.org/blogs/vuls/2008/06/signed_java_security_worse_tha.html cleanup o if too many errors come through during setup, app will terminate o printStackTrace() throttles on osx and poops out -o seen especially on old mac laptops (slow ppc garbage) +o seen especially on old mac laptops (slow ppc garbage) o can this be confirmed properly? o * this may just be an OutOfMemoryError happening o when drawing into a JAVA2D surface, have to call loadPixels() @@ -3274,9 +3362,9 @@ o filter() checks to see if inside begin/endPixels, if so doesn't call o if line() is called inside beginpixels, call updatepixels? o when NPE on line with pixels[], suggest user includes beginPixels o need to test/straighten out load/update pixels -o loadPixels() and updatePixels() only need to be used when +o loadPixels() and updatePixels() only need to be used when o touching pixels[]. All other functions including get(), set(), -o filter(), etc shouldn't need them. +o filter(), etc shouldn't need them. o image memory use.. how to handle lots of images o need to figure out exactly how they should/can unload o don't do a loadPixels unless an updatePixels has completed @@ -3392,7 +3480,7 @@ o i.e. ABGR_EXT might allow for just two shifts instead of 4 o allow access to native pixel buffer in opengl and power of 2 o so that no need to copy/update everything o how to handle gluTessVertex calls -o need to re-map through the regular "vertex" command, +o need to re-map through the regular "vertex" command, o but that makes things messy because the glu calls make calls to vertex() o and i don't want an additional "pathVertex()" function o with opengl optimizations via call lists.. @@ -3426,7 +3514,7 @@ o Stroked polygons losing stroke pixels due to z-buffer issues in P3D o http://code.google.com/p/processing/issues/detail?id=73 X refactor PApplet.main() and Runner.startInternal() to remove duplication X http://dev.processing.org/bugs/show_bug.cgi?id=245 -o PFont.size not available.. other font accessors? +o PFont.size not available.. other font accessors? o http://dev.processing.org/bugs/show_bug.cgi?id=1510 o implement method for lightweight components with processing applets o http://dev.processing.org/bugs/show_bug.cgi?id=686 @@ -3459,7 +3547,7 @@ X i.e. some fonts don't work with PDF, or bg color can't be re-set X clean up filter stuff? X filter(GRAY) -> to push things to luminosity-based gray X already implemented this way -o filter(MASK, ...) -> or ALPHA? +o filter(MASK, ...) -> or ALPHA? o filter(TINT, tintColor) X decision: use luminosity for gray X decision: tinting is usually for a dynamic thing, so not necessary @@ -3490,8 +3578,8 @@ o even if not actually working properly.. just in naming of things o sorting of polygons/lines on simple painters algorithm o better lighting model to show darkness at various depths o maybe just ultra-high res bitmaps from gl -o cairo tesselation used: -o John Hobby, Practical Segment Intersection with Finite Precision Output. +o cairo tesselation used: +o John Hobby, Practical Segment Intersection with Finite Precision Output. o Computational Geometry Theory and Application, 13(4), 1999. o http://citeseer.ist.psu.edu/hobby93practical.html o textMode(SHAPE) and textMode(IMAGE)? @@ -3502,7 +3590,7 @@ o or use a getXxxx() method? o in PShape, getChild(name) refers to a o however in an XML file, that's , meaning the name of the tag o change it to getShape(name)? also for fonts getShape(char c) -o decision: use getShape() (maybe add getShapeCount and getShape(int)) +o decision: use getShape() (maybe add getShapeCount and getShape(int)) o and remove getChild() from PShape o oops: getParent() is in there, as is getChildren() and others... o svg examples should use getShape(name) not getChild(name) @@ -3638,7 +3726,7 @@ X workaround from Christian Thiemann X http://code.google.com/p/processing/issues/detail?id=467 stop/destroy/dispose -L stop() not working very well +L stop() not working very well L as a result, dispose() methods aren't being called on libraries L http://dev.processing.org/bugs/show_bug.cgi?id=131 L http://dev.processing.org/bugs/show_bug.cgi?id=77 (dupe) @@ -3651,13 +3739,13 @@ L http://code.google.com/p/processing/issues/detail?id=180 0191 core (pre) X fix background(PImage) for OpenGL X http://code.google.com/p/processing/issues/detail?id=336 -X skip null entries with trim(String[]) +X skip null entries with trim(String[]) X NaN with PVector.angleBetween X http://code.google.com/p/processing/issues/detail?id=340 X fix missing getFloat() method in XML library X setAttribute? setString/Int/Float or just set? X get() set() methods are confusing.. too spare -X make sure that paths are created with saveStream() +X make sure that paths are created with saveStream() X make createWriter() use buffering X saveStream() doesn't work when intermediate directories don't exist @@ -3771,7 +3859,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=1174 0181 core (pre-release) -X no changes for 0181 +X no changes for 0181 0180 core (pre-release) @@ -3789,7 +3877,7 @@ X cache font information for the PDF library to improve setup time X when using createFont("xxxx.ttf"), should use textMode(SHAPE) with PDF X because ttf files will not be installed on the system when opening pdf X added error messages for users -X bring back old-style textAscent() +X bring back old-style textAscent() X needs to just quickly run characters d and p X only takes a couple ms, so no problem X pdf library @@ -3839,7 +3927,7 @@ X probably regression b/c camera/perspective can't be called then X http://dev.processing.org/bugs/show_bug.cgi?id=1391 -0175 core (private) +0175 core (private) X changed createInputRaw() to only bother checking URLs if : present @@ -3849,13 +3937,13 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=1408 0173 core (private) -X Re-enabled hack for temporary clipping. +X Re-enabled hack for temporary clipping. X Clipping still needs to be implemented properly, however. Please help! X http://dev.processing.org/bugs/show_bug.cgi?id=1393 0172 core (private) -X no changes to the core (or were there?) +X no changes to the core (or were there?) 0171 core (1.0.9) @@ -3867,11 +3955,11 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=1352 0170 core (1.0.8) X added some min/max functions that work with doubles X not sure if those are staying in or not -X filter(RGB) supposed to be filter(OPAQUE) +X filter(RGB) supposed to be filter(OPAQUE) X http://dev.processing.org/bugs/show_bug.cgi?id=1346 X implement non-power-of-2 textures X fix get() when used with save() in OpenGL mode -X immediately update projection with OpenGL +X immediately update projection with OpenGL X in the past, projection updates required a new frame X also prevents camera/project from being reset with setSize() (regression?) X which was a problem anyway because it made GL calls outside draw() @@ -3911,7 +3999,7 @@ X set() doesn't honor alpha consistently X also causes problems with PDF X preliminary thread() implementation X double param version of map() -X PImage cacheMap problem when using PImage.get() +X PImage cacheMap problem when using PImage.get() X http://dev.processing.org/bugs/show_bug.cgi?id=1245 X problems with > 512 points and P3D/OPENGL (thx DopeShow) X http://dev.processing.org/bugs/show_bug.cgi?id=1255 @@ -3947,7 +4035,7 @@ X text() with char array o add documentation o add this for text in a rectangle? X minor bug fix to svg files that weren't being resized properly -X OpenGL is rendering darker in 0149+ +X OpenGL is rendering darker in 0149+ X http://dev.processing.org/bugs/show_bug.cgi?id=958 X the fix has been found, just incorporate it X thanks to dave bollinger @@ -3967,7 +4055,7 @@ X save styles when nextPage() is called X beginRaw() broken (no DXF, etc working) X http://dev.processing.org/bugs/show_bug.cgi?id=1099 X http://dev.processing.org/bugs/show_bug.cgi?id=1144 -X Fix algorithm for quadratic to cubic curve conversion +X Fix algorithm for quadratic to cubic curve conversion X wrong algorithm in PGraphicsOpenGL and PShapeSVG X (thanks to user 'shambles') X http://dev.processing.org/bugs/show_bug.cgi?id=1122 @@ -4050,7 +4138,7 @@ X also a typo in the ColorWheel example X http://dev.processing.org/bugs/show_bug.cgi?id=1019 X P2D - null pointer exception drawing line with alpha stroke X http://dev.processing.org/bugs/show_bug.cgi?id=1023 -X P2D endShape() is working like endShape(CLOSE) +X P2D endShape() is working like endShape(CLOSE) X http://dev.processing.org/bugs/show_bug.cgi?id=1021 X http://dev.processing.org/bugs/show_bug.cgi?id=1028 (mark as dupe) X arc() center transparent @@ -4111,7 +4199,7 @@ X add skewX() and skewY() to PMatrix X Add support style attribute for path tag to Candy SVG (ricard) X http://dev.processing.org/bugs/show_bug.cgi?id=771 X remove setX/Y/Z from PVector, copy() (use get() instead), add mult/div -X remove copy() from PVector? +X remove copy() from PVector? X add mult() and div() with vector inputs? @@ -4197,7 +4285,7 @@ X figure out how to handle constructor mess X clean up setMainDrawingSurface() X should instead be inside size(), and init(), no? X add to hint(DISABLE_DEPTH_TEST) -X gl.glClear(GL.GL_DEPTH_BUFFER_BIT); +X gl.glClear(GL.GL_DEPTH_BUFFER_BIT); X or clearing the zbuffer for P3D X also add a note to the hint() reference X DISABLE_DEPTH_TEST bad results @@ -4299,7 +4387,7 @@ X working on pshape X add shape() methods to PGraphics/PApplet X test and fix svg examples X revisions.txt for x/y/z/ tx/ty/tz.. other changes in api.txt -X bring svg into main lib +X bring svg into main lib X need to straighten out 'table' object for quick object lookup X maybe add to all parent tables? (no, this gets enormous quickly) X fix svg caps/joins for opengl with svg library @@ -4329,7 +4417,7 @@ X need to check this--isn't this referring to DISABLE_DEPTH_TEST? X ENABLE_DEPTH_SORT causing trouble with MovieMaker X need to make the flush() api accessible X http://dev.processing.org/bugs/show_bug.cgi?id=692 -X image smoothing +X image smoothing X straighten out default vs. ACCURATE vs. whatever X Java2D and P3D and OpenGL are all inconsistent o need to be able to do hint() to do nearest neighbor filtering @@ -4453,13 +4541,13 @@ X that is, if a loadImage() turns up an access denied page X added an error message for this, and the image width and height will be -1 X added loadImageAsync() for threaded image loading -opengl fixes +opengl fixes X incorporate changes from andres colubri into PGraphicsOpenGL X most of the changes incorporated, something weird with constructors X use gluErrorString() for glError() stuff X PGraphicsOpenGL.java: X directionalLight() and .pointLight() are both calling -X glLightNoAmbient() which then creates a new FloatBuffer +X glLightNoAmbient() which then creates a new FloatBuffer X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1199376364 @@ -4469,7 +4557,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=407 X filed as bug #4769141 with apple http://bugreport.apple.com/ X appears that asking for the postscript name no longer works o fix "create font" and associated font stuff to straighten it out -X was grabbing the wrong native font with ico sketch +X was grabbing the wrong native font with ico sketch X seems that the psname is no longer a good way to grab the font? related? X available font issues X is getFontList returning a different set of fonts from device2d? @@ -4514,7 +4602,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=774 0137 core X add gz handling for createOutput() X change openStream() to createInput() (done in 0136) -X add createOutput() +X add createOutput() X deprecate openStream() naming @@ -4529,7 +4617,7 @@ X figure out why tiff images won't open with after effects X http://dev.processing.org/bugs/show_bug.cgi?id=153 X open with photoshop, resave, see which tags change X specifically, which tags that were in the original image file -X perhaps something gets corrected? +X perhaps something gets corrected? X had a fix, but decided not to re-implement the loadTIFF stuff too X fix for bezierTangent() problem from dave bollinger X http://dev.processing.org/bugs/show_bug.cgi?id=710 @@ -4555,7 +4643,7 @@ X modelX/Y/Z still having trouble X http://dev.processing.org/bugs/show_bug.cgi?id=486 X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Suggestions;action=display;num=1186614415 X add docs for model/screen/Y/Z -X added for model, along with example. +X added for model, along with example. X screen was already complete X bring back opengl mipmaps (create them myself? try w/ newer jogl?) X opengl mipmaps are leaking (regression in spite of #150 fix) @@ -4567,7 +4655,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=681 X check on the bug report for this one as well X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Syntax;action=display;num=1173394373 -earlier +earlier o add notes about fixing serial on the mac to the faq (and link to bug) X not necessary, hopefuly things working better now X utf8 and encodings @@ -4635,7 +4723,7 @@ X seems as though the begin/end should happen inside beginRaw/Record X defaults() gets called by the size() command in PApplet o would be cool if could sort w/o the sort class.. o meaning use reflection to sort objects, just by implementing a few methods -o would be much simpler and less confusing than new Sort() etc +o would be much simpler and less confusing than new Sort() etc o or would it be ridiculously slow? X just using Comparator instead, since moving to Java 1.4 X make a PException that extends RuntimeException but packages an ex? @@ -4683,7 +4771,7 @@ X set(x, y, image) x, y not setting with processing fixed earlier X is the texture[] array in PGraphics3D causing the problems with memory? -X actually it's a PGraphicsGL problem.. +X actually it's a PGraphicsGL problem.. X maybe the image binding not getting unbound? o should image i/o be moved into PImage? o still needs applet object, so it's not like this is very useful @@ -4692,15 +4780,15 @@ X relevant parts were moved in, others not o loadImage() using spaces in the name o if loadImage() with spaces when online(), throw an error o get tiff exporter for p5 to support argb and gray -X would also need to modify the tiff loading code, +X would also need to modify the tiff loading code, X because the header would be different X http://dev.processing.org/bugs/show_bug.cgi?id=343 X map() is not colored, neither is norm X image outofmemoryerror for casey's students X http://dev.processing.org/bugs/show_bug.cgi?id=355 X this may be related to a ton of other memory bugs -X 1.5.0_07 and 1.4.2_12 contain the -XX:+HeapDumpOnOutOfMemoryError switch -X invaluable for tracking down memory leaks +X 1.5.0_07 and 1.4.2_12 contain the -XX:+HeapDumpOnOutOfMemoryError switch +X invaluable for tracking down memory leaks X can't replicate anymore X texture mapping X very odd, "doom era" stuff @@ -4770,7 +4858,7 @@ X need to strip off past the file separator or something 0130 core X fixed problem with size() and the default renderer -X the renderer was being reset after setup(), +X the renderer was being reset after setup(), X so anything that occurred inside setup() was completely ignored. X http://dev.processing.org/bugs/show_bug.cgi?id=646 X http://dev.processing.org/bugs/show_bug.cgi?id=648 @@ -4827,7 +4915,7 @@ X draw() called twice in vista with java 1.6 X http://dev.processing.org/bugs/show_bug.cgi?id=587 cleanup from previous releases -X P3D not doing bilinear interpolation in text and images +X P3D not doing bilinear interpolation in text and images X because smooth() has to be set (and smooth throws an error in P3D) X how should this be handled? a hint? allowing smooth()? X probably just allow smooth() but don't smooth anything @@ -4872,8 +4960,8 @@ X getFontList stuff in PFont causes problems 0127 core X pixel operations are broken in opengl -X get(), set(), copy(), blend(), loadPixels, updatePixels() -X set(x, y, image) y reversed in openGL +X get(), set(), copy(), blend(), loadPixels, updatePixels() +X set(x, y, image) y reversed in openGL X background(image) also broken X also textMode(SCREEN) X http://dev.processing.org/bugs/show_bug.cgi?id=91 @@ -4881,7 +4969,7 @@ o replaceAll() not supported by 1.1 o http://dev.processing.org/bugs/show_bug.cgi?id=561 o make version of loadBytes that checks length of the stream first o this might not be worth it -o the number of cases where this works is small (half of url streams) +o the number of cases where this works is small (half of url streams) o and who knows if the value returned will be correct o (i.e. will it be the uncompressed or compressed size of the data?) @@ -4904,7 +4992,7 @@ X they can call Runtime.getRuntime().exec() if they want more control fixed earlier (in 0125) by ewjordan X accuracy in P3D is very low X http://dev.processing.org/bugs/show_bug.cgi?id=95 -X textured polys throwing a lot of exceptions (ouch) +X textured polys throwing a lot of exceptions (ouch) X http://dev.processing.org/bugs/show_bug.cgi?id=546 X polygons in z axis with nonzero x or y not filling properly X http://dev.processing.org/bugs/show_bug.cgi?id=547 @@ -4923,7 +5011,7 @@ X instead, returns an array X unregisterXxxx() calls to remove methods from libs X http://dev.processing.org/bugs/show_bug.cgi?id=312 X implemented by ewjordan -X sort() on strings ignores case +X sort() on strings ignores case X mention the change in the reference X added MIN_FLOAT, MAX_FLOAT, MIN_INT, MAX_INT to PConstants X throw AIOOBE when min() or max() called on zero length array @@ -4944,21 +5032,21 @@ X add match() method that returns an array of matched items 0125 core X more blend() modes (the five listed on the thread below?) X http://dev.processing.org/bugs/show_bug.cgi?id=132 -X figure out what the modes should actually be: -X photoshop: normal, dissolve; darken, multiply, color burn, +X figure out what the modes should actually be: +X photoshop: normal, dissolve; darken, multiply, color burn, X linear burn; lighten, screen, color dodge, linear -X dodge; overlay, soft light, hard light, vivid light, -X linear light, pin light, hard mix; difference, +X dodge; overlay, soft light, hard light, vivid light, +X linear light, pin light, hard mix; difference, X exclusion; hue, saturation, color, luminosity X illustrator: normal; darken, multiply, color burn; lighten, -X screen, color dodge; overlay, soft light, hard light; +X screen, color dodge; overlay, soft light, hard light; X difference, exclusion; hue, sat, color, luminosity -X director: Copy, Transparent, Reverse, Ghost, Not copy, +X director: Copy, Transparent, Reverse, Ghost, Not copy, X Not transparent, Not reverse, Not ghost, Matte, Mask; X (below seems more useful: X Blend, Add pin, Add, Subtract pin, Background transparent, X Lightest, Subtract, Darkest, Lighten, Darken -X flash: +X flash: X DIFFERENCE: C = abs(A-B); X MULTIPLY: C = (A * B ) / 255 X SCREEN: C= 255 - ( (255-A) * (255-B) / 255 ) @@ -4980,11 +5068,11 @@ o should we mention String.split? X ironed out more of the preproc parseXxxx() functions X deal with targa upside-down and non-rle encoding for tga images X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1171576234 -X change println(array) to be useful +X change println(array) to be useful o document using join() for old method X remove print(array) since it's silly? X make sure it's not in the reference -X [0] "potato", [1] "tomato", [2] "apple" +X [0] "potato", [1] "tomato", [2] "apple" X fix filter(GRAY) on an ALPHA image to produce a good RGB image 0125p2 @@ -5006,7 +5094,7 @@ X given to andy 0125p3 X PImage.save() method is not working with get() X http://dev.processing.org/bugs/show_bug.cgi?id=558 -X NullPointerException in Create Font with "All Characters" enabled +X NullPointerException in Create Font with "All Characters" enabled X http://dev.processing.org/bugs/show_bug.cgi?id=564 X added min() and max() for float and int arrays X need to update reference @@ -5015,7 +5103,7 @@ X opengl image memory leaking X when creating a new PImage on every frame, slurps a ton of memory X workaround is to write the code properly, but suggests something bad X http://dev.processing.org/bugs/show_bug.cgi?id=150 -X opengl keeping memory around.. +X opengl keeping memory around.. X could this be in vertices that have an image associated X or the image buffer used for textures X that never gets cleared fully? @@ -5038,7 +5126,7 @@ X things not showing up in linux X this may be fixed along with bug #341 X probably threading issue, 98 doesn't have any trouble X signs point to Runner or PApplet changes between 98 and 99 -X commenting out applet.setupFrameResizeListener() +X commenting out applet.setupFrameResizeListener() X in line 307 from Runner.java solved the problem X http://dev.processing.org/bugs/show_bug.cgi?id=282 X size of sketch different in setup() and draw() on linux @@ -5106,7 +5194,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=478 X copy() sort of broken in JAVA2D X example sketch posted with bug report X http://dev.processing.org/bugs/show_bug.cgi?id=372 -o saveStrings(filename, strings, count) +o saveStrings(filename, strings, count) o otherwise the save is kinda wonky o or maybe that should just be done with the array fxns @@ -5115,14 +5203,14 @@ o sketches often freeze when stop is hit on an HT machine o need to test the examples cited on pardis' machine o http://dev.processing.org/bugs/show_bug.cgi?id=232 X debug NumberFormat InterruptedException on dual proc machine -X use notify() instead of interrupt()? +X use notify() instead of interrupt()? X or Thread.currentThread() should be checked first? o svg loader is on the list for 1.0 o maybe include as part of PApplet (casey thinks so) X using gl, lines don't show up in pdf with record (they're ok with p3d) X http://dev.processing.org/bugs/show_bug.cgi?id=325 o with network connection -o download a copy of the source for 0069, get the renderer +o download a copy of the source for 0069, get the renderer o svn mv PGraphics2 PGraphicsJava o version of BApplet that replaces g. with ai. or pdf. @@ -5158,14 +5246,14 @@ X background(0, 0, 0, 0) is the way to really clear everything with zeroes X or background(0, 0), but the former is prolly better conceptually X how to clear the screen with alpha? background(0, 0, 0, 0)? o background(EMPTY) -> background(0x01000000) or something? -X size(), beginRecords(), beginRaw(), createGraphics() +X size(), beginRecords(), beginRaw(), createGraphics() X broken for file-based renderers in 0120 X http://dev.processing.org/bugs/show_bug.cgi?id=434 0120 core X fixed error when using hint(ENABLE_NATIVE_FONTS) with JAVA2D -X java.lang.IllegalArgumentException: +X java.lang.IllegalArgumentException: X null incompatible with Global antialiasing enable key X fix issue where ambientLight(r, g, b) was instead ambientLight(r, g, r) X http://dev.processing.org/bugs/show_bug.cgi?id=412 @@ -5178,7 +5266,7 @@ X actually was z = Float.MAX_VALUE regression X http://dev.processing.org/bugs/show_bug.cgi?id=390 X two examples in sketchbook X this has been reported several times -X concave polygons having trouble if points come back to meet +X concave polygons having trouble if points come back to meet X tesselator/triangulator gets confused when points doubled up X might need to avoid previous vertex hitting itself X http://dev.processing.org/bugs/show_bug.cgi?id=97 @@ -5194,7 +5282,7 @@ o update run.bat for new quicktime o unfortunately this is messy because qtjava sometimes has quotes o and qtsystem might be somewhere besides c:\progra~1 X run.bat has been removed from current releases -X registering font directories in pdf.. is it necessary? +X registering font directories in pdf.. is it necessary? X (commented out for 0100) X re-added for 0120 o when re-calling size() with opengl, need to remove the old canvas @@ -5281,7 +5369,7 @@ X expand, append, contract, subset, splice, concat, reverse X typed version of array functions: X append(), shorten(), splice, slice, subset, concat, reverse X http://dev.processing.org/bugs/show_bug.cgi?id=115 -X fix issue where processing applets would run extremely fast +X fix issue where processing applets would run extremely fast X after having been starved of resources where there framerate dropped X http://dev.processing.org/bugs/show_bug.cgi?id=336 X added color/stroke/tint/fill(#FF8800, 30); @@ -5339,7 +5427,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=392 X loadImage() problems with png and jpg X actually it's an issue with some types of jpeg files X http://dev.processing.org/bugs/show_bug.cgi?id=279 -X java.lang.IllegalArgumentException: +X java.lang.IllegalArgumentException: X Width (-1) and height (-1) cannot be <= 0 X identical to what happens when the image data is bad X for instance, trying to load a tiff image with the jpg loader @@ -5362,13 +5450,13 @@ X or maybe this should be hint(ENABLE_NATIVE_FONTS) instead? X figure out default behavior for native text fonts X make sure insideDrawWait() is in other resize() methods X begin/end/alloc waits to PGraphicsJava2D, PGraphicsOpenGL, PGraphics3D -X fix bug with fill(#ffcc00, 50); +X fix bug with fill(#ffcc00, 50); X toInt() on a float string needs to work X need to check for periods to see if float -> int first X shape changes X remove LINE_STRIP - tell people to use beginShape() with no params X remove LINE_LOOP - tell people to use endShape(CLOSE) -o also remove POLYGON? +o also remove POLYGON? X may as well remove it X though something still needed as an internal constant X add endShape(CLOSE) or CLOSED @@ -5419,7 +5507,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=260 0114 core -X added createGraphics(width, height, renderer) +X added createGraphics(width, height, renderer) X no need to use (..., null) anymore X fix set() for JAVA2D, also fixes background(PImage) for JAVA2D X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Syntax;action=display;num=1145108567 @@ -5449,7 +5537,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=322 X fix enable/disable textures for some objects X also a big problem for fonts X calling updatePixels() on each frame fixes the issue (sorta) -X images are memory leaking pretty badly +X images are memory leaking pretty badly X texture re-allocated on each frame X lighting bug introduced in rev 109 X spotLight has troubles with an invalid value @@ -5457,26 +5545,26 @@ X probably somethign weird about the params (3 vs 4) being sent X the first spotLight works fine, it's something with the second X (the one that follows the mouse) X just something to debug in the example -X regression from contributed code.. +X regression from contributed code.. X was using apply() instead of set() in PMatrix inverse copy X filter() is also broken (not rewinding the intbuffer) X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Contribution_3DOpenGL;action=display;num=1144561113 sound has been removed o duration as an internal param, not a function -o When a sound is finished playing, +o When a sound is finished playing, o it should return to 0 so it can play again o Putting sound.loop() in draw() seemed to spawn multiple sounds threads? o After a sound is paused, it will only play from where it was paused o to its end and will not loop again o The ref in PSound2 says volume accepts vals from 0...1 o but values larger than one increase the volume. -o SoundEvent // is sound finished?? Can't access now. +o SoundEvent // is sound finished?? Can't access now. o make java 1.1 version of PSound work properly o merge PSound and PSound2 via reflection? o once debugged, merge these back together and use reflection o (unless it's a messy disaster) -o Unsupported control type: Master Gain +o Unsupported control type: Master Gain o what's actually causing this error? o http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1115467831 o PSound.play() won't play the sound a 2nd time (reopened) @@ -5487,7 +5575,7 @@ X need to just remove PSound altogether 0111 core -X need to have a better way of getting/figuring out the endian +X need to have a better way of getting/figuring out the endian X use ByteOrder class in jdk 1.4, since issue is local to JOGL X security ex when run as an applet X also can no longer assume that macosx is big endian @@ -5582,12 +5670,12 @@ X same issue occurs with pdf and creating graphics obj get initial version of pdf working X get rid of beginFrame/endFrame echo to recorders? X that way begin/end can just be where the recorder starts/stops? -X recordRaw is really confusing.. +X recordRaw is really confusing.. X when to use beginFrame/endFrame X is beginRaw/endRaw really needed? X seems to be a problem that it's an applet method X but then it's called on the g of the applet -X but then it's the recorderRaw of that g that gets it called.. +X but then it's the recorderRaw of that g that gets it called.. X how to flush when the sketch is done X inside dispose method? explicit close? X call exit() at end of pdf apps? exit calls dispose on gfx? @@ -5599,13 +5687,13 @@ X write documentation on images (they suck) and fonts (use ttf) 0099 core X removed playing() method from PSound X integrate destroy() method from shiffman as dispose() in PSound2 -X ComponentListener is probably what's needed for resize() +X ComponentListener is probably what's needed for resize() X make sure that components can be resized properly via size() X http://dev.processing.org/bugs/show_bug.cgi?id=209 X or that it properly responds to a setBounds() call X calling size() elsewhere in the app doesn't quite work -X A second call to size almost works. -X The buffer apparently gets allocated and saveFrame saves the +X A second call to size almost works. +X The buffer apparently gets allocated and saveFrame saves the X new size but drawing appears to be disabled. X http://dev.processing.org/bugs/show_bug.cgi?id=243 @@ -5707,7 +5795,7 @@ X tag release 93 (francis thinks it's rev 1666) 0095 core -X undo the fix that causes the width/height to be properly set +X undo the fix that causes the width/height to be properly set 0094 core @@ -5718,7 +5806,7 @@ X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action X "folder" has been renamed to "path" to match savePath(). X added "dataPath" to return the full path to something in the data folder X savePath should maybe be appletPath or sketchPath -X because can be used for opening files too +X because can be used for opening files too X (i.e. if needing a File object) X width, height set to zero in static mode X probably only set when resize() is called, and it's not happening @@ -5780,7 +5868,7 @@ X vertices not included because switching to triangleImpl and lineImpl X fix for copy() in java2d to make things a little speedier X make PApplet.main() for java 1.3 friendly (Color class constants) X remove call to background() in PGraphics2 -o change PGraphics to PGraphics2 +o change PGraphics to PGraphics2 o or not, because PGraphics has all the base stuff for 3D o change PGraphics2 to PGraphicsJava or PGraphicsJava2D o maybe wait until the new shape stuff is done? @@ -5806,13 +5894,13 @@ X add ability to draw text from the current text position X change to synchronization to hopefully fix some update issues X curveVertex() problem in P2D when > 128 points fixed _ http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1115856359;start=0 -X for present mode, need to set a default display +X for present mode, need to set a default display X currently crashes if only --present is specified w/o --display o make the 1.4 code in PApplet load via reflection X doesn't appear necessary with 1.3 applets o or is some of the stuff usable in 1.3 but not all? o ie. the device config classes exist but not the set full screen method -X currently some bugs in the main() because it's not sizing applets +X currently some bugs in the main() because it's not sizing applets X if running in present mode it works ok X but that also needs its display set.. argh X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1115834600;start=0 @@ -5843,7 +5931,7 @@ X no changes since 88 X createFont crashes on verdana (win2k) X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1115258282;start=0 X made ceil(), floor(), and round() return ints instead of floats -X fix for PSound: Unsupported control type: Master Gain +X fix for PSound: Unsupported control type: Master Gain X just shuts off the volume control X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1115467831;start=0 @@ -5974,9 +6062,9 @@ X how to handle full screen (opengl especially) or no screen (for scripts) tweaking up simong light code o what's up with resetLights? o add PLight object to avoid method overflow -o preApplyMatrix, invApplyMatrix? +o preApplyMatrix, invApplyMatrix? o applyMatrixPre and applyMatrixIn -o rotateXInv is ugly.. +o rotateXInv is ugly.. o irotateX?, papplyMatrix? wednesday evening @@ -5986,7 +6074,7 @@ X call it open() X what to call firstMouse X implement rightMouse? X yes, mouseButton = LEFT, CENTER, or RIGHT -X error when running on 1.1... +X error when running on 1.1... X You need to install Java 1.3 or later to view this content. X Click here to visit java.com and install. X make inverseCamera into cameraInv @@ -6003,7 +6091,7 @@ X use canonicalPath to flag possible problems X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1096508877;start=5 o fix shapes in P3D (line loop, polygons, etc) o should we include a from and to for the directional light? -X no, cuz it doesn't do much really.. +X no, cuz it doesn't do much really.. X fromX-toX etc is all that's different thursday day @@ -6015,12 +6103,12 @@ o textMode(ALIGN_LEFT) etc, should make sure that left/center/right not used X though since have to change to LEFT, should be easy to switch friday night -o should toInt('5') return the ascii or the char? +o should toInt('5') return the ascii or the char? X since (int) '5' returns the ascii, that's what it does X made a note in the PApplet reference text api -X textMode ALIGN_CENTER _LEFT _RIGHT -> CENTER, LEFT, RIGHT ? +X textMode ALIGN_CENTER _LEFT _RIGHT -> CENTER, LEFT, RIGHT ? X use built-in font if available? yes o text() with \n is semi-broken X does the font or PApplet control the size? (the font, ala java) @@ -6037,12 +6125,12 @@ o since needs to render to screen as well o font has to be installed to get psname X fine because why would you embed a ps font that you don't have? o need to resolve SCREEN_SPACE vs OBJECT_SPACE -o can this be auto-detected with noDepth()? +o can this be auto-detected with noDepth()? o how does rotated text work? o PFont.rotate(180) rotate(PI) o or can this be detected from the matrix? X don't use pixels to do screen space text inside PFont -X add a function in PGraphics for direct pixel image impl +X add a function in PGraphics for direct pixel image impl X store the font name in the vlw font file (at the end) o could include multiple names for multi platforms X get text impl stuff working properly @@ -6052,7 +6140,7 @@ o NEW_GRAPHICS totally smashes everything friday postgame X implement createFont() X with a .ttf does a create font internally (1.3+ only) -X although the images aren't populated +X although the images aren't populated X until a P2D/P3D/OPENGL tries to draw them, which triggers it X but if PGraphics2, just uses the built-in font X also works for font names and just creating them @@ -6101,7 +6189,7 @@ X write list of params that can be passed to PApplet o document in the code a note about how size() et al place themselves X saveFrame was double-adding the save path because of save() changes -size(200, 200, P3D) - createGraphics and placement issues +size(200, 200, P3D) - createGraphics and placement issues X make pappletgl work back inside papplet X and then size(300, 300, DEPTH) etc X get rid of opengl renderer menu @@ -6111,8 +6199,8 @@ X how to force PGraphics() instead of PGraphics2() X size(300, 200, P2D); X size() doing a setBounds() is really bad X because it means things can't be embedded properly -o applets on osx (and windows) sometimes show up 20 pixels off the top -X how to shut off rendering to screen when illustrator in use? +o applets on osx (and windows) sometimes show up 20 pixels off the top +X how to shut off rendering to screen when illustrator in use? X need size(30000, 20000) for illustrator, problem in papplet X size(30000, 20000, ILLUSTRATOR) X make Graphics2 et al load dynamically using reflection @@ -6127,7 +6215,7 @@ present mode o call present() from inside the code? o that if applet is 500x500, centers on a 800x600 window X no, that's nasty... use --present to launch in present window -X though how do you get the screen size? +X though how do you get the screen size? X screen.width and screen.height? - yes X write java 1.4 code for full screen version of PApplet X this might be used for presentation mode @@ -6144,13 +6232,13 @@ X make sure the program compiles before starting present mode 0080 core X PApplet.saveFrame() is saving to sketch folder, PApplet.save() is not -X PApplet.save() will save to the applet folder, +X PApplet.save() will save to the applet folder, X but PImage.save() or PGraphics.save() will save only to the current X working directory, usually the Processing folder. X removed static version of mask() from PImage X no more PImage.mask(theImage, maskImage) X just use theImage.mask(maskImage) -X PImage.filter() +X PImage.filter() X maybe use quasimondo's gaussian blur code? X http://incubator.quasimondo.com/processing/gaussian_blur_1.php o filter() on subsections? yes, in keeping with rest of api @@ -6173,7 +6261,7 @@ o check to see if it's a rounding error with width() o get text rect working again (seems to be in infinite loop) X nope, was just that the space width wasn't being scaled up properly X clean up the javadoc so no more errors -X change mbox to PFont.size? +X change mbox to PFont.size? o make width() return values based on natural size? X not a great idea.. plus java2d uses 1 pixel font for things X email simon re: lighting api @@ -6186,7 +6274,7 @@ X goodbye sphere(x, y, z, r) o should available() be waiting() or something like that instead? o go through and see what functions (no pixel ops?) frame recorders should have X decided instead to use recordFrame(PGraphics) -o remove SCREEN_SPACE altogether? +o remove SCREEN_SPACE altogether? X can't do this for now implemented in 79 @@ -6262,14 +6350,14 @@ X (as they are working in Processing mode) o screenX/Y aren't properly working for 2D points against a 3D matrix o (ryan alexander rounding bug) o Just to clarify, it works completely correctly with rounding -o screenX/Y and also using the 3 arg version of translate - -o ie translate(hw,hh,0) instead of just translate(hw,hh). +o screenX/Y and also using the 3 arg version of translate - +o ie translate(hw,hh,0) instead of just translate(hw,hh). X no longer an issue because moving to 2D and 3D modes o PImage: remove the static versions of manipulators? o probably not, because they're inherited by PApplet -o i.e. mask(image, themask); +o i.e. mask(image, themask); X no PImage needed b/c PGraphics is a PImage -o colorMode(GRAY) to avoid stroke(0) causing trouble? +o colorMode(GRAY) to avoid stroke(0) causing trouble? o or maybe get rid of stroke(0)? hrm @@ -6335,9 +6423,9 @@ X pushing all intelligence down into class that implements PMethods o keep hints about type of geometry used to reconstruct o no special class, just uses public vars from PGraphics o how to hook into curve rendering so that curve segments are drawn -o maybe lines are rendered and sorted, -o but they point to an original version of the curve geometry -o that can be re-rendered +o maybe lines are rendered and sorted, +o but they point to an original version of the curve geometry +o that can be re-rendered o also integrate catmull-rom -> bezier inverse matrices o even with the general catmull-rom, to render via ai beziers @@ -6371,7 +6459,7 @@ o loadImage() needs to handle 1.1 vs 1.3 loading o set image.format to be BUFFERED? no.. just use RGBA always o have a flag to always use the cache, i.e. with BufferedImage o turn that off when someone modifies it (nope, no need to) -X PImage.getPixels(), updatePixels(), updatePixels(x, y, w, h), +X PImage.getPixels(), updatePixels(), updatePixels(x, y, w, h), o PImage.setPixels(int another[]); X imageMode(CENTER) is weird for copy() and updatePixels() X perhaps copy() and get() ignore imageMode and use xywh or x1y1x2y2? @@ -6423,7 +6511,7 @@ X no changes, only launcher issues 0075 X textureMode(NORMAL_SPACE) screws up the image() command -X image() appears to require IMAGE_SPACE to function properly. +X image() appears to require IMAGE_SPACE to function properly. X added focusGained() and focusLost() X lots of changes to internal naming of vars X screenX(x, y) and screenY(x, y) added for noDepth() @@ -6441,7 +6529,7 @@ X remove pmouseX/Y altogether X maintain things a bit different o email the beta@ list to see how people are using pmouseX X changed PMovie.length to PMovie.duration -X move around/simplify loadImage() inside PApplet +X move around/simplify loadImage() inside PApplet X working to add more die() statements inside PApplet o can ALPHA fonts work using the other replace modes? @@ -6474,15 +6562,15 @@ X bring back renderer menu X reading/saving pref for opengl renderer X remove cameraMode(PERSPECTIVE) on each frame X why is the first one failing? -X still threading issues with running opengl -X threading really horks up dual processor machine.. -X first run hangs until quit +X still threading issues with running opengl +X threading really horks up dual processor machine.. +X first run hangs until quit X though doesn't seem to replicate when p5 is restarted X make sure background() gets called at least once with opengl X otherwise screen never actually updates X beginFrame() around setup() -X draw mode stuff happens inside setup.. -o or maybe need to get better at size() inside of draw() ? +X draw mode stuff happens inside setup.. +o or maybe need to get better at size() inside of draw() ? X make this consistent with the regular PApplet X otherwise things are going to be weird/difficult for debugging @@ -6500,7 +6588,7 @@ X hacked for a fix in 72, but need to better coordinate with openStream() 0072 core X make m00, m01 etc public -X hack to make loadImage() work +X hack to make loadImage() work X cache settings are ignored, may be slow as hell X make hints[] no longer static X they weren't properly resetting @@ -6555,7 +6643,7 @@ X need to resolve issues between rendering screen/file X illustrator-based rendering needs to work for ars projects X screen may be 400x400 pixels, but file be 36x36" X launcher.cpp broke serial.. see versions in processing.notcvs -X rewrite bagel code.. +X rewrite bagel code.. X for this release, because it will break things along with the lib stuff X switch to PImage, PApplet, etc o bug in BImage.smooth() when resizing an image @@ -6615,7 +6703,7 @@ o problem is that BGraphics has the loadStream code, not BApplet o new sphere code from toxi o already added a while back o http://processing.org/discourse/yabb/YaBB.cgi?board=Syntax;action=display;num=1067005325 -o sphere code needs only front face polygon +o sphere code needs only front face polygon o all triangles must be counter-clockwise (front-facing) X fix loadImage to be inside PApplet @@ -6657,10 +6745,10 @@ X text(String text, x, y, width, height) // based on rectMode X textMode() for align left, center, right (no justify.. har!) X hex(), binary(), unhex(), unbinary() -040725 +040725 X fix array functions not returning a value -040726 +040726 X noiseSeed and randomSeed X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_Software;action=display;num=1090749784;start=0 @@ -6671,15 +6759,15 @@ X incorporated NO_FLYING_POO line/poly hack developed for axel X sort() should return an array, rather than sort in place X fix binary function, had wrong offset number X casey: i wan't able to get binary() to work at all: -o Typography: Helix won't compile +o Typography: Helix won't compile o works fine, just needs BFont -> PFont X standalone 'alpha' function for PImage (static methods for alpha fxns) X Image: Edge, Image: Blur: Alpha not set? The error is easier to see on Blur X turns out bounds checking wasn't working properly on colors -040903 +040903 X fix mouse/key events, make properly public for the package stuff -X The biggest problem was the key and mouse functions not working. +X The biggest problem was the key and mouse functions not working. X Input: Mouse_Functions X Input: Keyboard_Functions X processing.net -> PClient, PServer @@ -6701,7 +6789,7 @@ X loop/noLoop setup 040920 X make loop/noLoop work properly X fixes/changes to key and mousehandling -X tab key not working? +X tab key not working? X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1091853942;start=0 X mousePressed, keyPressed, others.. queue them all X queue multiple times @@ -6719,7 +6807,7 @@ X otherwise noLoop() in setup means no drawing happens at all X defaults for PApplet and PGraphics are different o PGraphics has none.. PApplet has fill/stroke X actually not the case, only that wasn't calling decent superclass -X set PImage.format as RGB by default? +X set PImage.format as RGB by default? X this was problem with rendering an image from PGraphics on board X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1091798655;start=0 X http://processing.org/discourse/yabb/YaBB.cgi?board=Syntax;action=display;num=1080671926;start=0 @@ -6730,7 +6818,7 @@ X bug in get() that was removing the high bits (rather than adding) 040921 evening X lots of work on libraries, figuring out PLibrary api -040922 +040922 X get library stuff debugged X port arcball and finish up dxf writer X beginCamera() no longer sets an identity matrix @@ -6766,7 +6854,7 @@ X printMatrix() and printCamera() to output the matrices for each X more functions made static (loadStrings, loadBytes) that could be X print() commands in BApplet were among these X die() command to exit an application or just stall out an applet -X die(String error) and die(String error, Exception e) +X die(String error) and die(String error, Exception e) X more documentation in comments for functions X chop() function that properly also handles nbsp X join() was handled weird diff --git a/core/todo.txt b/core/todo.txt index 770993c34b..e7dafe49df 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,89 +1,4 @@ -0266 (3.5) -X fix javaPlatform variable for newer JDK versions -X https://github.com/processing/processing/pull/5626 -o many fonts installed causes slow startup on macos -o run that on a thread, and make sure default font doesn't need the list loaded -X can't be done, notes in the code for PFont.loadFonts() -X improve startup time when user-specified fonts are not used -X default font will be faster, using ttf/otf is fine -X only createFont("The Font Name") is still slow on macOS -X and PFont.list() -o check again whether element 0,0 in a Table is working -X https://github.com/processing/processing/issues/3011 -X was already checked, made a note and locked the issue - -api changes -X Dict.remove() should return value, not index (for consistency w/ others) -X returns the value removed, not the key, just like remove(key) -X rationale being that if you know the index, you probably know the key -X if unavailable, throw an exception; otherwise no consistent way to indicate error -X add circle() and square() -X add push() and pop() -X make JSONObject.quote() (both versions) public -X should DoubleDict create from Iterable or Map<>? -o (Map is more efficient b/c of size, Iterable more useful) -X Iterable of what, though? Map.Entry? -X sticking with just the Map<> version for now - -contrib -o make tabs into spaces, fixes pixelDensity(2) issue with tabs -o https://github.com/processing/processing/issues/5625 -o https://github.com/processing/processing/pull/5633 -X had to back this fix out again -X Fixes blend mode not being set correctly, fixing #5645 -X https://github.com/processing/processing/issues/5645 -X https://github.com/processing/processing/pull/5647 -X extended SVG support -X https://github.com/processing/processing/pull/4168 -X show a warning when a font isn't what the user expected -X https://github.com/processing/processing/issues/5481 -X https://github.com/processing/processing/pull/5605 - -gohai -X Profile GL3bc is not available on X11GraphicsDevice -X https://github.com/processing/processing/issues/5476 -X https://github.com/processing/processing/pull/5652 - -andres -X silence TIS/TSM warning message with P2D/P3D/OPENGL since macOS 10.13.4 -X https://github.com/processing/processing/issues/5462 -X improve matrix performance in P2D/P3D -X https://github.com/processing/processing/issues/5685 -X Initializing textures loads the pixels array, even if not needed aferwards -X https://github.com/processing/processing/issues/5748 -X Processing 3.4 takes 60 seconds before can edit file -X https://github.com/processing/processing/issues/5707 -X skip Android's SDK folder when adding sketches -X https://github.com/processing/processing/commit/5b653263cc6151f838c11a61689d756901c11e37 -X PShape.attrib() and PShape.setAttrib() are not working -X https://github.com/processing/processing/issues/5560 - -jakub -X Fix freeze when restarting sketch with variables in size -X https://github.com/processing/processing/pull/5708 -X Make sure Ctrl+Left Mouse on MacOS is consistent -X https://github.com/processing/processing/issues/5672 -X https://github.com/processing/processing/pull/5674 -X Stop frame rate counter from exaggerating -X https://github.com/processing/processing/pull/5697 -X Fix vertex buffer initialized with wrong number of components -X https://github.com/processing/processing/pull/5698 -X Recreate FBOs when offscreen PGraphicsOpenGL is resized -X https://github.com/processing/processing/pull/5699 - -cleaning -o WARNING: GL pipe is running in software mode (Renderer ID=0x1020400) -o is this coming from us? if so, need to provide actions -X haven't seen for a while, maybe fixed -X figure our size(img.width, img.height) situation -X just make loadImage() work in settings -X update the wiki and reference -o update wiki/docs to say "don't override sketchXxxx() methods" -o size() command not working to do a resize -X need a programmatic way to set size -o check on performance of the new EDT setup -X present mode is 30-40% slower than windowed -X w/ this example: https://github.com/processing/processing/issues/2423 +0267 (3.5.1) high-ish diff --git a/done.txt b/done.txt index 96f143d592..5d17fd8452 100644 --- a/done.txt +++ b/done.txt @@ -1,3 +1,77 @@ +0266 (3.5) +X update to Java 8u192 +o processing-java doesn't handle sketch exceptions by quitting the sketch +X https://github.com/processing/processing/issues/5375 +X this is by design/follows PDE behavior +X fix the link to the FAQ in the menu +X https://github.com/processing/processing/issues/5729 +X update to Java 8u202 +X "Sketch disappeared" infinite pop up dialogs +X https://github.com/processing/processing/pull/4808 +X https://github.com/processing/processing/issues/4805 +X text("test", 10, 10); is still slow with lots of fonts +X https://bugs.openjdk.java.net/browse/JDK-8179209 +X added a note to the Known Issues section in the Changes wiki +X update the about screen to 2019 +o report of a library or tool (probably includes 2.x? 1.x?) breaking things +o NoSuchFieldError: useNativeSelect +X https://github.com/processing/processing/issues/4821 +X closed, no response +X problems with non-US keyboards and some shortcuts +X https://github.com/processing/processing/issues/2199 +X https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings +o Determine new keyboard shortcut for Step Out +X https://github.com/processing/processing/issues/3538 +X all set based on #2199 +X settings() present and pixelDensity() is in setup(), nothing set/no error +X https://github.com/processing/processing/issues/4703 + +cleaning +X Could not initialize class com.sun.jna.Native on startup (Windows) +X https://github.com/processing/processing/issues/4929 +X closed earlier; fixed as best we could +X sharing usage metrics about libraries +X https://github.com/processing/processing/issues/4708 +X Determine shortcut for Export vs Use Selection for Find +X https://github.com/processing/processing/issues/2985 +o swap font smoothing for tab size? +o implement simple table for prefs? +X still requires restart of the software, so problematic +X need docs for translations +X https://github.com/processing/processing/issues/4018 +X setting a bad font/size in preferences.txt causes a crash on startup +X https://github.com/processing/processing/issues/4085 +o https://github.com/processing/processing/pull/4087 +X can't reproduce with current code + +contrib +X Updated russian translation, now can choose russian in preferences +X https://github.com/processing/processing/pull/5619 +X Turkish translation updates +X https://github.com/processing/processing/pull/5636 +X Examples dialog causes high CPU load +X https://github.com/processing/processing/issues/5246 +X https://github.com/processing/processing/pull/5654 +X console hiding button +X https://github.com/processing/processing/pull/5115 +X NullPointerException in Contribution Manager when installing +X https://github.com/processing/processing/issues/5524 +X https://github.com/processing/processing/pull/5742 +X Improvements to appdata.xml for Linux +X https://github.com/processing/processing/pull/5604 + +jakub +X Fix sketch exception getting hidden by warning +X https://github.com/processing/processing/pull/5486 +X https://github.com/processing/processing/issues/5412 +X EventQueue problems with "could not find sketch size" message +X https://github.com/processing/processing/issues/4893 +X https://github.com/processing/processing/pull/5708 +X https://github.com/processing/processing/issues/5030 (duplicate) +X size(0, 0) just freezes instead of showing an error +X https://github.com/processing/processing/issues/5233 (duplicate) + + 0265 (3.4) X make it possible to override theme.txt with a file in the sketchbook folder X https://github.com/processing/processing/issues/5445 @@ -21,7 +95,7 @@ X https://github.com/processing/processing/commit/8dda8a4d02bc9a1d15e81fee3e6c X https://github.com/processing/processing/commit/ff7dc4d5094ccf1cc35189c9412adda93153b436 X add pyde as a supported extension X https://github.com/jdf/processing.py/issues/284 -o update to launch4j 3.11? +o update to launch4j 3.11? o http://launch4j.sourceforge.net/changelog.html X update to Java 8u172 X show alternate error message on windows when JNA breaks or core.jar is missing @@ -45,7 +119,7 @@ X https://github.com/processing/processing/issues/3911 o Welcome dialog rewritten in Swing X https://github.com/processing/processing/pull/5210 -gohai +gohai X additional I/O improvements X https://github.com/processing/processing/pull/5581 X rpi regressions in 3.3.7.1 @@ -234,7 +308,7 @@ X https://github.com/processing/processing/pull/4849 X Warn user to use L when creating a number constant that won't fit into an int X https://github.com/processing/processing/issues/4878 X https://github.com/processing/processing/pull/5077 -X add install/uninstall scripts for Linux and correct mime types for IDE +X add install/uninstall scripts for Linux and correct mime types for IDE X https://github.com/processing/processing/pull/5106 @@ -363,7 +437,7 @@ X https://github.com/processing/processing/issues/3933 0256 (3.2.4) X only require reference.zip (and internet connection) when building dist X set text style properly for Contribution Manager error message -X Detect changes to 'hosts' file in case users modify/remove localhost +X Detect changes to 'hosts' file in case users modify/remove localhost X https://github.com/processing/processing/issues/4738 X No sketch window opens after hitting Run if hosts file changed X https://github.com/processing/processing/issues/1868 @@ -445,7 +519,7 @@ X https://github.com/processing/processing/issues/2955 X fixed 2015-11 https://github.com/processing/processing/pull/2977 X need to handle the 2.x to 3.x sketchbook transition X prefs are the same file, but sketchbook location pref is different -o performance +o performance o video stinks.. java2d stinks.. macs stink o note in the 'drawing in 2d' section of faq o fastest machine possible @@ -875,7 +949,7 @@ X Add i18n support for the PopUp menu X https://github.com/processing/processing/pull/4060 X Add Turkish to the list of languages X https://github.com/processing/processing/pull/4073 -X Make the error message for stack overflows clearer +X Make the error message for stack overflows clearer X https://github.com/processing/processing/pull/4152 X get rid of dt_socket message, making command line run a little better X https://github.com/processing/processing/issues/4098 @@ -1030,7 +1104,7 @@ X implement side gradient on the editor X if fewer lines in sketch than can be shown in window, show ticks adjacent X error/warning location is awkward when no scroll bar is in use X when only one screen-full, show ticks at exact location -X simpler/less confusing to not show at all? +X simpler/less confusing to not show at all? X MarkerColumn.recalculateMarkerPositions() X https://github.com/processing/processing/pull/3903 X Update status error/warning when changing the line @@ -1067,7 +1141,7 @@ X change selection highlight color o put some margin around it X https://github.com/processing/processing/issues/3906 X completion panel -X what should the background color be? +X what should the background color be? X test fg/bg color on other operating systems J fix icon sizes/design X set a better minimum size for the number of updates available @@ -1135,7 +1209,7 @@ X need to check if "save as" thing is causing trouble X "Your sketch has been modified externally" with encrypted OS X volumes X https://github.com/processing/processing/issues/3650 o add this to the preferences? -o use watcher service after all? +o use watcher service after all? o https://docs.oracle.com/javase/tutorial/essential/io/notification.html jna problems @@ -1173,7 +1247,7 @@ o Contributions Manager UI design X https://github.com/processing/processing/issues/3482 X closing in favor of separate issues X updates tab has ugly horizontal line at top -X CM selected tabs are too tall +X CM selected tabs are too tall X https://github.com/processing/processing/issues/3598 X why the aqua background when opening the window? X get rid of gross italic subheads on the Updates page @@ -1217,7 +1291,7 @@ X https://github.com/processing/processing/pull/3856 X Red error underline is sometimes at wrong location X https://github.com/processing/processing/issues/3759 X https://github.com/processing/processing/pull/3848 -X using "new color()" instead of "color()" results in "color type detected" +X using "new color()" instead of "color()" results in "color type detected" X happens when user does 'new color' instead of 'color' X https://github.com/processing/processing/issues/3739 X https://github.com/processing/processing/pull/3850 @@ -1230,8 +1304,8 @@ X problem was that the example was creating files inside Processing.app X Casey reports that exported app still asks to download Java X could this be a JOGL bug (linking against the app stub?) X ran otool -L on the binaries and saw nothing -X deal with ConcurrentModificationException in Editor -X "Error repainting line range" and ConcurrentModificationException +X deal with ConcurrentModificationException in Editor +X "Error repainting line range" and ConcurrentModificationException X https://github.com/processing/processing/issues/3726 X repairs to prevent memory leak in EditorConsole o Claim that an exported application does not copy data directory @@ -1373,7 +1447,7 @@ o need an "install library" option to deal with urls.. X need better platform designation setup for libs X library installation should use the sketchbook folder, not the p5 folder o actually enforce this, give users a warning about other libs -o versioning info +o versioning info o http://java.sun.com/j2se/1.5.0/docs/guide/extensions/versioning.html X changing the sketchbook folder will make libraries show up o but it won't reload the library mapping table @@ -1456,7 +1530,7 @@ X Comment/Uncomment should ignore leading whitespace X https://github.com/processing/processing/issues/1961 X Export unsaved sketch > agree to save prompt > export doesn't finish X https://github.com/processing/processing/issues/2724 -X Add disconnectEvent() to Server +X Add disconnectEvent() to Server X https://github.com/processing/processing/issues/2133 X False positive for mixing active/static mode in Tweak Mode 3.0 alpha 5 X https://github.com/processing/processing/issues/3140 @@ -1508,7 +1582,7 @@ o Invalid code signature on OS X X https://github.com/processing/processing/issues/3575 X cannot reproduce -gsoc +gsoc X Breakpoints don't 'jump' after hitting Enter on blank line X https://github.com/processing/processing/issues/3552 X https://github.com/processing/processing/pull/3571 @@ -1797,7 +1871,7 @@ X https://github.com/processing/processing/issues/498 X should be able to build p5 without a JDK install, just a JRE X https://github.com/processing/processing/issues/1840 X need to have ecj.jar accessible to ant, then modify build.xml to use this: -X X http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-ant_javac_adapter.htm @@ -1908,7 +1982,7 @@ X https://github.com/processing/processing/issues/3209 X sketchbook window is completely empty w/ no sketches X requires restart of p5 before it updates X https://github.com/processing/processing/issues/3214 -X Replace & Find was reading "Find & Replace" +X Replace & Find was reading "Find & Replace" X https://github.com/processing/processing/issues/3247 X "one file added to sketch" message when two files added X turned out to be really messy ProgressFrame code @@ -1922,7 +1996,7 @@ X https://github.com/processing/processing/wiki/Running-without-a-Display X write up code guidelines for project X make proper Eclipse style prefs to reinforce X https://github.com/processing/processing/wiki/Style-Guidelines -X change preproc to write settings() method instead of sketchXxxx() +X change preproc to write settings() method instead of sketchXxxx() cleaning X better text editor / live debugging (integrate Eclipse JDT) @@ -2009,7 +2083,7 @@ X https://github.com/processing/processing/pull/3216 0233 (3.0a6) X post a note about the "help" stuff X https://github.com/processing/processing/labels/help -X Deal with ctrl-alt-n regression +X Deal with ctrl-alt-n regression X https://github.com/processing/processing/issues/2979 X don't add a ^M to files when writing X https://github.com/processing/processing/issues/3014 @@ -2047,7 +2121,7 @@ X was because of the readSettings() change integration of pdex/debug o make the tabs have a default minimum size o multiple sizes as they get smaller (web browser style) -X merge experimental into the main Java mode +X merge experimental into the main Java mode X thereby removing Java 2.0 mode from the next release X otherwise redoing the design for 2 modes X changed JLS4 to JLS8 (but make sure it doesn't introduce anything too weird) @@ -2080,7 +2154,7 @@ o update ld and windres: https://github.com/processing/processing/tree/master/ o also xstream.jar https://github.com/processing/processing/tree/master/java/application/launch4j/lib earlier -X any problems with new code signing crap? +X any problems with new code signing crap? X issues raised around the symlink (just replace with a copy of the binary?) X fixed the short-term problem, filed an issue for the rest X https://developer.apple.com/library/prerelease/mac/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG205 @@ -2209,7 +2283,7 @@ X https://github.com/processing/processing/issues/3133 X https://github.com/processing/processing/pull/3177 X Fix ColorChooser cursor X https://github.com/processing/processing/pull/3186 -X Improve Spanish localization +X Improve Spanish localization X https://github.com/processing/processing/pull/3185 X internationalization of editor error messages and greek translations X https://github.com/processing/processing/pull/3189 @@ -2280,7 +2354,7 @@ pulls (net) X NullPointerException message when Server writes to a disconnected client X https://github.com/processing/processing/issues/2577 X https://github.com/processing/processing/pull/2578 -X Implement the active() method for Serial and Server +X Implement the active() method for Serial and Server X https://github.com/processing/processing/issues/2364 X https://github.com/processing/processing/pull/2588 @@ -2325,7 +2399,7 @@ X closed by Dan post-3.0a3 X move sketchbook into its own window X move recent into the sketchbook menu X try installing 10.7.3 on Mac Mini and check whether things run -X make sure it's only running on 64-bit machines? +X make sure it's only running on 64-bit machines? gsoc X remove dependency on oscp5 library for tweak mode @@ -2477,7 +2551,7 @@ X fix "No such file or directory" error when exporting an application on OSX X this also resulted in the application not being signed at all X https://github.com/processing/processing/issues/2614 X this is a fairly major issue... -X possible to open a sketch multiple times +X possible to open a sketch multiple times X by double-clicking one of its files instead of the main pde file X user opens non-main pde of already open sketch, it'll open again X https://github.com/processing/processing/issues/2506 @@ -2494,7 +2568,7 @@ X some aren't being removed properly X fix the build scripts to include the examples X https://github.com/processing/processing/issues/2652 X all examples are out of "processing/java" and are now in "processing-docs/content/". The Book examples have been removed entirely from our repositories. -o "Platform is ${platform}" message during 'ant clean' +o "Platform is ${platform}" message during 'ant clean' o on OS X, but not Windows (haven't checked Linux) X this was in pdex/build.xml X remove welcome message from the sound library @@ -2536,7 +2610,7 @@ X https://github.com/processing/processing/pull/2657 pulls X insert tabs properly when prefs set for tabs mode X https://github.com/processing/processing/pull/2607 -X improve look of Nimbus LAF +X improve look of Nimbus LAF X https://github.com/processing/processing/pull/2671 earlier @@ -2549,7 +2623,7 @@ X https://github.com/processing/processing/issues/2141 o double-clicking a .pde file doesn't open properly on OS X o https://github.com/processing/processing/issues/2639 X moving p5 examples to the web repo -X move examples into web repo +X move examples into web repo o OS X not opening a sketch at all on pde double-click? (though opening the app) X Chinese text is overlapped in Processing 2.1 editor X https://github.com/processing/processing/issues/2173 @@ -2570,7 +2644,7 @@ X https://github.com/processing/processing/issues/2545 earlier X cpu usage when nothing happening (unmarked duplicate) -X https://github.com/processing/processing/issues/1074 +X https://github.com/processing/processing/issues/1074 gsoc X Line coloring incorrect for filtered contribution listings @@ -2618,7 +2692,7 @@ X missing 'version' in contrib causes NPE X https://github.com/processing/processing/issues/2517 X bring back setIcon(Frame) for PDE X and others X https://github.com/processing/processing-experimental/issues/64 -X how was PDE X able to crash 2.2? +X how was PDE X able to crash 2.2? X add additional code to rework how this is handled X Auto Format patch mess X https://github.com/processing/processing/pull/2271 @@ -2660,7 +2734,7 @@ X fix for Windows command line X fix for Linux launcher X fix for Linux export X fix for Linux command line -X fix for OS X launcher +X fix for OS X launcher X fix for OS X export X fix for OS X command line X import static causes exception (with fix) @@ -2807,7 +2881,7 @@ G Handle the UnsatisfiedLinkError when loading the native library fails G https://github.com/processing/processing/pull/2266 fixed in 2.1 -X init() not called on tools until later +X init() not called on tools until later X https://github.com/processing/processing/issues/1859 X Finish changes so the PDE can use an unmodified JRE X https://github.com/processing/processing/issues/1840 @@ -2815,8 +2889,8 @@ X https://github.com/processing/processing/issues/1840 0223 pde (2.1) X reset font smoothing for everyone to its default by changing the pref -X To reset everyone's default, replaced editor.antialias with editor.smooth -X for 2.1. Fonts are unusably gross on OS X (and Linux) w/o smoothing and +X To reset everyone's default, replaced editor.antialias with editor.smooth +X for 2.1. Fonts are unusably gross on OS X (and Linux) w/o smoothing and X the Oracle JVM, and many longtime users have anti-aliasing turned off. X https://github.com/processing/processing/issues/2164 X https://github.com/processing/processing/issues/2160 @@ -2888,7 +2962,7 @@ X spacing problem with large sizes (on retina?) X not just retina, was problem with non-mono text from Java X control text size in console o why aren't prefs from theme.txt showing up in preferences.txt? hrm -o or rather, why can't they be overridden? +o or rather, why can't they be overridden? X because theme.txt data is a different animal / that's part of the point X should fonts at least be in prefs.txt? X http://code.google.com/p/processing/issues/detail?id=226 @@ -2916,7 +2990,7 @@ X had already been closed X serial ports missing from list (OS X) X http://code.google.com/p/processing/issues/detail?id=52 X also was marked fixed... -X Serial.write problem with Bluetooth SPP virtual serial port +X Serial.write problem with Bluetooth SPP virtual serial port X http://code.google.com/p/processing/issues/detail?id=318 X was marked duplicate of #52 X Serial silently fails when invalid port entered as string @@ -3048,7 +3122,7 @@ X fix submitted by hamoid 0220 pde (2.0.2) -X fix "less less" typo +X fix "less less" typo X https://github.com/processing/processing/issues/1928 X slash breaks syntax highlighting (with spaces) X https://github.com/processing/processing/issues/1681 @@ -3066,11 +3140,11 @@ X https://github.com/processing/processing/issues/1908 X Update JNA from 3.2.4 to 3.5.2 X https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/3.5.2/jna-3.5.2.jar X https://maven.java.net/content/repositories/releases/net/java/dev/jna/platform/3.5.2/platform-3.5.2.jar -X problem with associating .pde files +X problem with associating .pde files X https://github.com/processing/processing/issues/286 X http://code.google.com/p/processing/issues/detail?id=247 o In regedit: Navigate to Computer\HKEY_CLASSES_ROOT\Applications and find your .exe name. Navigate under its name to shell>open>command. In the Default change its location to the actual location of the executable, hit okay and then try and reassociate the file type as you normally would. -X UnsatisfiedLinkError causes huge message... +X UnsatisfiedLinkError causes huge message... X error report cleanups haven't been fixed yet X reported by Dan X this should be better now @@ -3188,7 +3262,7 @@ o check if libraries folder does not exist o check to see if other libraries are installed X warn user about moving libraries and restarting X add "pretty menu name" to the export.txt file -o move export.txt to xml? +o move export.txt to xml? X nah, it's only flat information X tools -> get library X library url: [ http://blahblah.org/something ] @@ -3268,7 +3342,7 @@ o also send pull request for Florian manager X "New version available" mesage is showing html tags around it X https://github.com/processing/processing/issues/1684 -X shift color of installed items when selected +X shift color of installed items when selected X was ugly gray over selection color X fix layout of the update button X get update text to align vertically @@ -3282,7 +3356,7 @@ X MovieMaker tool will not start on Windows 8 X make a little less fragile by not launching as separate process X http://code.google.com/p/processing/issues/detail?id=1447 X clean up the code and interface for the Movie Maker tool -X http://code.google.com/p/processing/issues/detail?id=836 +X http://code.google.com/p/processing/issues/detail?id=836 X on Windows, the Help menu seems to start with a separator X add 6u37 as the Java runtime o TextAreaDefaults - is editable in use? @@ -3306,7 +3380,7 @@ X NSHighResolutionCapable X true X add basics of retina support to the toolbar and header X getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor"); -X paper over ArrayIndexOutOfBoundsException in JEditTextArea.xToOffset() +X paper over ArrayIndexOutOfBoundsException in JEditTextArea.xToOffset() X Fix IllegalStateException on Windows/Linux in Save prompt X happened when hitting ESC or otherwise closing the window X "Find in Reference" largely broken in 2.0b7 @@ -3315,7 +3389,7 @@ X discern variable vs function with Find in Reference X if no selection, attempt to expand the selection for Find in Reference X add cmd-shift-O to "Open Examples" on OS X with no window open X go through vida examples to make sure extra imports are not being used -o do command line to run through all examples? +o do command line to run through all examples? X remove Quaqua X http://code.google.com/p/processing/issues/detail?id=1509 X remove separate launch of QT movie creator @@ -3379,7 +3453,7 @@ tool manager X from Casey X list in the PDE would be updated automatically by querying a web service X list on the website would be generated using the same web service -X All I would need to do is update web/contrib_generate/sources.conf +X All I would need to do is update web/contrib_generate/sources.conf X and the rest would happen automatically. X general cleanup of the visuals/layout X extra files still being left around during install @@ -3399,7 +3473,7 @@ X http://code.google.com/p/processing/issues/detail?id=1387 0215 pde (2.0b7) -X "expecting EOF, found 'import'" on previously working sketch +X "expecting EOF, found 'import'" on previously working sketch X http://code.google.com/p/processing/issues/detail?id=1376 X changing default imports to only cover those we have in the reference X also on the Android side as well @@ -3460,7 +3534,7 @@ X http://code.google.com/p/processing/issues/detail?id=1426 X double textMode() error message with P3D: X textMode(SCREEN) has been removed from Processing 2.0. X textMode(256) is not supported by this renderer. -X errors that cannot be placed (i.e. missing brace) +X errors that cannot be placed (i.e. missing brace) X this makes things to jump to the last tab X also happens with stray characters sometimes... X casey: accidentally typing a letter at the top of the tab @@ -3526,7 +3600,7 @@ X (stubbing things in for artwork update later) 0212 pde (2.0b4) -M implement find & replace over multiple tabs +M implement find & replace over multiple tabs M http://code.google.com/p/processing/issues/detail?id=25 M added to the projects list X change all build.xml files to use Java 6 as both source and target @@ -3595,7 +3669,7 @@ X make Mode menu into a radio button, so it cannot be de-selected X http://code.google.com/p/processing/issues/detail?id=1227 X no response with registerMethod keyEvent when key pressed or released X http://code.google.com/p/processing/issues/detail?id=1225 -o running at size(7000, 4000) followed by size(100, 100) +o running at size(7000, 4000) followed by size(100, 100) X http://code.google.com/p/processing/issues/detail?id=1213 X won't fix, too hairy and messy X clean up handling of untitled sketches @@ -3616,7 +3690,7 @@ X no changes 0209 pde (2.0b1) X require Mac OS X 10.6.8 as the minimum -X replace/find need to dim out the buttons +X replace/find need to dim out the buttons X i.e. hitting 'replace' multiple times causes weirdness X and replace/replace+find buttons shouldn't be active until after a find X http://code.google.com/p/processing/issues/detail?id=1056 @@ -3638,11 +3712,11 @@ X problem was 'extends' after 'implements' X "Open" dialog on Linux wasn't showing directories X http://code.google.com/p/processing/issues/detail?id=1151 X switch Platform to just use java.awt.Desktop classes -X for Java 1.6, replace com.apple.eio.FileManager.openURL(url); +X for Java 1.6, replace com.apple.eio.FileManager.openURL(url); X with java.awt.Desktop.browse() and java.awt.Desktop.open() X causes a deprecation warning whenever building on osx o instead of "show sketch folder" method, use: -The com.apple.eio.FileManager now has two new desktop interaction methods, revealInFinder(File) and moveToTrash(File). You can use revealInFinder() to open a Finder window in the parent directory of of a file and select it. You can use moveToTrash() to move a file to the most appropriate Trash directory for the volume that contains that file. +The com.apple.eio.FileManager now has two new desktop interaction methods, revealInFinder(File) and moveToTrash(File). You can use revealInFinder() to open a Finder window in the parent directory of of a file and select it. You can use moveToTrash() to move a file to the most appropriate Trash directory for the volume that contains that file. X added 64-bit RXTX for Mac OS X X http://blog.iharder.net/2009/08/18/rxtx-java-6-and-librxtxserial-jnilib-on-intel-mac-os-x/ X bufferUntil() with values above 127 do not work properly @@ -3672,18 +3746,18 @@ o shift-tab with no selection should go back two spaces cleaning o switching into present mode in info.plist o LSUIPresentationMode -o 4 +o 4 o errors with serial and libraries Exception in thread "Thread-2" java.lang.NoClassDefFoundError: processing/core/PApplet - at processing.serial.Serial.(Serial.java:156) + at processing.serial.Serial.(Serial.java:156) generally, that error means that something is missing from the CLASSPATH. the NoClassDefError gives erroneous feedback about *what* class is actually missing, as of java 1.3+ (yay!) so perhaps conflicting versions of a library in the sketchbook (solve this by setting to an empty sketchbook temporarily) or files might be installed in the CLASSPATH variable or something conflicting in -/System/Library/Extensions. +/System/Library/Extensions. F add processing.js export tool from florian F http://github.com/fjenett/processingjstool/ F http://github.com/fjenett/processingjstool/zipball/v0.0.6 @@ -3739,7 +3813,7 @@ o this would take care of nasty macosx 1.4 vs 1.5 issues o /System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Commands/java o /System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Commands/java o /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Commands/java -o canonical path for +o canonical path for o /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK o will return 1.5.0 (or maybe 1.6 for others?) X nope, just using a local JRE/JDK from now on @@ -3764,7 +3838,7 @@ X http://code.google.com/p/processing/issues/detail?id=72 X doesn't seem to be a problem on modern machines X in rebuild sketch menu - disable subfolders working as libraries X if a sketch, don't allow subfolders -o or maybe just that libraries must be in the root? +o or maybe just that libraries must be in the root? o nah, cuz that would mean can't make subfolder called "libraries" X no longer possible since separate libraries folder is in use X is the 'hide' option for code dumb? i've never used it @@ -3785,8 +3859,8 @@ X http://code.google.com/p/processing/issues/detail?id=32 X http://code.google.com/p/processing/issues/detail?id=958 X decided not to: simple workaround available o setting sketchbook to a folder on a network mounted drive -o does this work? test on both on mac and pc.. -o or if not, should recommend people against it +o does this work? test on both on mac and pc.. +o or if not, should recommend people against it o (i.e. folders disappearing if net has trouble) X http://code.google.com/p/processing/issues/detail?id=33 X decided wontfix, nobody has ever followed up @@ -3830,7 +3904,7 @@ o http://dev.processing.org/bugs/show_bug.cgi?id=562 X Monaco can no longer be disabled X modes have their own methods for digging through sketch & libraries folders o therefore it need only check the sketch.txt file to see if it's ok -o (between android and java) +o (between android and java) o but more importantly, if it's something totally different (.py) then o that'll be ok, and work fine o need another extension for the p5 py stuff @@ -3931,7 +4005,7 @@ o don't re-open new window on top of another X changing how this is handled X detect mode and library example folders for recent menu o with the same sketch open, a handleOpen() might open a second on top of it -X should be fixed up +X should be fixed up applets o tool to run in appletviewer? sun.applet.Main is appletviewer @@ -3942,11 +4016,11 @@ o courseware o export sketch as applet when uploading o save sketch zip files o have a means to load them from "teacher" version of p5 -o figure out how to use the +o figure out how to use the o items from the 'code' folder not included with applet export o add tool to "Add custom html to sketch" -o that copies applet.html, -o opens sketch folder, +o that copies applet.html, +o opens sketch folder, o and gives info about what to do next (how to edit) o http://dev.processing.org/bugs/show_bug.cgi?id=143 @@ -3985,7 +4059,7 @@ X not seen for a while, closed o multiple entries in file menu o http://dev.processing.org/bugs/show_bug.cgi?id=1260 X should be fixed, not seen -o "src/processing/xxxx/Xxxxxxxx.java uses unchecked or unsafe operations." +o "src/processing/xxxx/Xxxxxxxx.java uses unchecked or unsafe operations." X http://code.google.com/p/processing/issues/detail?id=101 o use pack200/unpack200 to make p5 download smaller X http://code.google.com/p/processing/issues/detail?id=95 @@ -4024,7 +4098,7 @@ X export and export to application fail with umlauts in folder name X http://dev.processing.org/bugs/show_bug.cgi?id=252 X fixed in 0140, but no confirmation o stop button needs to update itself and work properly -o also editor buttons to light up and clear properly +o also editor buttons to light up and clear properly X http://dev.processing.org/bugs/show_bug.cgi?id=396 o need someone to go out and test all scenarios of this X this particular version was fixed (though broken again later) @@ -4067,8 +4141,8 @@ X marked cantfix o using a processing keyword as a variable name gives unhelpful error message X http://dev.processing.org/bugs/show_bug.cgi?id=213 X fixed issue specific to handleDisplay -o not enough args for triangle (or args in general) -o throws out bizarre message +o not enough args for triangle (or args in general) +o throws out bizarre message o http://dev.processing.org/bugs/show_bug.cgi?id=17 X fixed up later X expecting RPAREN messages are ugly @@ -4076,7 +4150,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=15 o unchecking 'use external editor' sketch should not set modified o dangerous if a version that hasn't been re-loaded has possibility o to overwrite. i.e. make a change and save in external editor, -o don't actually +o don't actually o comments shown as code / code shown as comments o http://code.google.com/p/processing/issues/detail?id=164 X merged into new editor issue @@ -4084,7 +4158,7 @@ o program sometimes goes gray because it thinks everything is in a comment o http://code.google.com/p/processing/issues/detail?id=564 X merged into new editor issue o failed export still copies random files -o Failed compile on Export or Export to Application +o Failed compile on Export or Export to Application o still creates folder and leaves mess behind X http://dev.processing.org/bugs/show_bug.cgi?id=1050 X opted not to fix (rationale in the report) @@ -4138,8 +4212,8 @@ o http://dev.processing.org/bugs/show_bug.cgi?id=114 o when drawing large video, the two triangles for the rect are out of sync o only shows up in P3D o pause and frameRate aren't working -o framerate does set the frequency which movieEvent will be called, -o but it is not setting the "available" field corrrectly. +o framerate does set the frequency which movieEvent will be called, +o but it is not setting the "available" field corrrectly. o in fact, speed() should be used to set the rate, not frameRate o sketch .zip file in casey's email message X http://dev.processing.org/bugs/show_bug.cgi?id=370 @@ -4151,11 +4225,11 @@ o include a separate video class to handle just playback o video playback can be much faster if not messing with pixels o could instead use texsubimage in opengl, etc o only supports tint() (to set alpha or color) and drawing? just drawing? -o stop button won't kill a video sketch (bug 150 example does this) +o stop button won't kill a video sketch (bug 150 example does this) X although ESC seems to work? (not sure, didn't test) o or audio won't stop even after hitting stop o when an exception comes through during cameraEvent, not printed -o need to show an actual stack trace (InvocationTargetEx) +o need to show an actual stack trace (InvocationTargetEx) o because otherwise it's impossible to debug this stuff o video library not working on export to web o http://dev.processing.org/bugs/show_bug.cgi?id=1421 @@ -4170,7 +4244,7 @@ o fix "reply" garbage added o fix "back to bug# 778" o remove patch designation o make severity a radio button (people aren't using it) -o change to just ( ) Problem ( ) Feature Request (remove 'severity') +o change to just ( ) Problem ( ) Feature Request (remove 'severity') o remove 'platform' dropdown o specify some versions? also add back a "target version" for fix? o explanation of P1 through P5 @@ -4196,7 +4270,7 @@ o layout problems with attachments page o http://dev.processing.org/bugs/show_bug.cgi?id=254 o layout problems with logout page o http://dev.processing.org/bugs/show_bug.cgi?id=255 -o bug duplicate text field doesn't retain focus +o bug duplicate text field doesn't retain focus o http://dev.processing.org/bugs/show_bug.cgi?id=256 o finish putting all the bugs into bugzilla o add a notation to the bugs site re: reading the faq and searching first @@ -4307,7 +4381,7 @@ X and fixed again for non-greedy regex X make note of when library is not available (serial) with error msg X i.e. if running in 64-bit mode on OS X, can't do serial X update to Java 6u29 for Linux and Windows (OS X now updated) -X don't show library conflict warning until someone tries to build +X don't show library conflict warning until someone tries to build X with code that actually calls on one of those packages X too many people seem to think this is an error X work on code to quit if multiple instances are running @@ -4426,7 +4500,7 @@ o add deployJava.js to local sketch folder (causes internet requirement) X http://code.google.com/p/processing/issues/detail?id=650 X http://www.java.com/js/deployJava.js X bad idea, since it adds 17k to every download -X make examples window respond to ESC +X make examples window respond to ESC X and double-click events to expand/collapse nodes X examples window placed off-screen when PDE window is maximized X http://code.google.com/p/processing/issues/detail?id=669 @@ -4436,7 +4510,7 @@ X New/Rename Tab commands inhibited when Console/Message Area is hidden X http://code.google.com/p/processing/issues/detail?id=745 X make sketch.properties usable elsewhere by loading/reloading X http://code.google.com/p/processing/issues/detail?id=722 -X Export to Application reports "Could not copy source file:" +X Export to Application reports "Could not copy source file:" X http://code.google.com/p/processing/issues/detail?id=638 X automatically insert the 'import processing.opengl' when P3D used X add support for automatically including OpenGL when asking for P3D @@ -4446,8 +4520,8 @@ X http://code.google.com/p/processing/issues/detail?id=747 cleanup X how is autoformat doing? good now -X catch 1.5 code in libraries - is this still an issue for 1.6 on 1.5? -X Exception in thread "main" java.lang.UnsupportedClassVersionError: quicktime/QTException (Unsupported major.minor version 49.0) +X catch 1.5 code in libraries - is this still an issue for 1.6 on 1.5? +X Exception in thread "main" java.lang.UnsupportedClassVersionError: quicktime/QTException (Unsupported major.minor version 49.0) o javascript and liveconnect to preload applets o http://code.google.com/p/processing/issues/detail?id=66 X let's not bother @@ -4458,7 +4532,7 @@ o package cc.arduino.* X no thanks, they've abandoned it o add page numbers and file name to printing in p5 o also add something to control the font & font size -X -> jer: "can we put fax support in there too?" +X -> jer: "can we put fax support in there too?" o prevent people from setting the font size too small in the editor o how do we figure out what "too small" is? X -> everyone thinks this is funny @@ -4510,7 +4584,7 @@ X http://code.google.com/p/processing/issues/detail?id=627 X file-save stops running sketch X http://dev.processing.org/bugs/show_bug.cgi?id=810 X http://code.google.com/p/processing/issues/detail?id=100 -X fix bug in loadfile2 example +X fix bug in loadfile2 example X http://code.google.com/p/processing/issues/detail?id=522 o when running with external editor, hide the editor text area o http://dev.processing.org/bugs/show_bug.cgi?id=20 @@ -4531,7 +4605,7 @@ X run the javadoc for 1.5 X remove opengl2 for 1.5 and examples for the final 1.5 X need to get a new stable release out there, the docs/ref are out of sync -from peter n lewis +from peter n lewis X Use Selection For Find X http://code.google.com/p/processing/issues/detail?id=571 X double-clicking whitespace selects adjacent chars @@ -4678,7 +4752,7 @@ o can make full screen work via Info.plist key o http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Syntax;action=display;num=1135921427;start=7#7 X added to export defaults in a much earlier version X when running externally, set window frame title to the sketch name -X is this only a problem on macosx? +X is this only a problem on macosx? console, preferences X removed build.path from preferences.txt @@ -4826,7 +4900,7 @@ X don't keep repeating them 0190 (pre) X be more specific about linux/sun/java error messages X allow 'oracle' in java version name string -X the open button on the toolbar is goofed up +X the open button on the toolbar is goofed up X http://code.google.com/p/processing/issues/detail?id=323 X changed how "Save As" works, now copies everything in the folder X but ignores applet, application.*, screen-* files/folders @@ -4836,9 +4910,9 @@ X also fixed unicode entities earlier X add warning message when not using a version of sun java w/ p5 on linux -X Ctrl-Z will undo, but not scroll to where the undo happens. +X Ctrl-Z will undo, but not scroll to where the undo happens. X is this now somehow fixed? (or only on os x?) -X so user thinks nothing is happening and overundo. +X so user thinks nothing is happening and overundo. X http://dev.processing.org/bugs/show_bug.cgi?id=35 X http://code.google.com/p/processing/issues/detail?id=15 @@ -4856,7 +4930,7 @@ X update the about screens (about.jpg and about.bmp) 0187 pde (pre) X don't require an editor window to be open at all times X The com.apple.eawt.Application now has a setDefaultMenuBar(JMenuBar) method -X that sets a default menu bar when no other Frames are open. +X that sets a default menu bar when no other Frames are open. X could check for availability of method X and if it's there, don't require people to quit X Prevent horizontal scroll offset from disappearing @@ -4866,7 +4940,7 @@ o http://dev.processing.org/bugs/show_bug.cgi?id=23 X Fix NullPointerException when making a new sketch on non-English systems X http://code.google.com/p/processing/issues/detail?id=283 X show warning message on linux if sun java is not in use -X there isn't a perfect way to detect whether sun java is in use, +X there isn't a perfect way to detect whether sun java is in use, X so please report false positives (or negatives, for that matter) X bad strlen() problem in windows launcher.cpp X http://code.google.com/p/processing/issues/detail?id=303 @@ -4887,7 +4961,7 @@ X thanks to Larry Kyrala X http://dev.processing.org/bugs/show_bug.cgi?id=1549 X fix for PDF library to support createFont() on Linux X http://dev.processing.org/bugs/show_bug.cgi?id=1566 -X thanks to Matthias Breuer +X thanks to Matthias Breuer X add option to change the formatting for untitled sketch naming X http://dev.processing.org/bugs/show_bug.cgi?id=1091 X Can't input full-width space when Japanese IME is on. @@ -4911,7 +4985,7 @@ X http://code.google.com/p/processing/issues/detail?id=245 0184 pde (pre) X other libraries that use opengl weren't using the jnlp launcher -X fix OpenGL detection in sketches so that proper version of +X fix OpenGL detection in sketches so that proper version of X export template is used X http://dev.processing.org/bugs/show_bug.cgi?id=1530 X single-line html comments not handled properly on export @@ -5014,11 +5088,11 @@ J casting problems in the parser J straighten out int() -> toInt() conversions J float u = float(x)/width; works. J float u = (float(x)/width); doesn't work: "unexpected token: float". -J float u = (x/float(width)); works! +J float u = (x/float(width)); works! J http://dev.processing.org/bugs/show_bug.cgi?id=4 J return (int(5.5)) causes an error J preprocessor error if last line of code is a comment with no CR after it, -J an OutOfMemoryError wants to happen, +J an OutOfMemoryError wants to happen, J but right now there's a hack to add a CR in PdePreprocessor J http://dev.processing.org/bugs/show_bug.cgi?id=5 J preproc can't handle labels to break/continue nested loops @@ -5104,7 +5178,7 @@ X fix this for windows and linux X PApplet.main() overwritten X http://dev.processing.org/bugs/show_bug.cgi?id=1446 o need to do a better job of error handling inside main() -X applets now use the deployjava.js file +X applets now use the deployjava.js file X not opengl, but the others do X NullPointerException in JOGLAppletLanucher with Java 6 Update 18 on Windows X switching to more efficient JNLP export @@ -5118,7 +5192,7 @@ X processing 0142 japanese input problem X http://dev.processing.org/bugs/show_bug.cgi?id=854 X update JNA to version 3.2.4 to support Windows 7 64-bit X http://dev.processing.org/bugs/show_bug.cgi?id=1424 -X fix LITERAL_class in PDE code (help from Christian Thiemann) +X fix LITERAL_class in PDE code (help from Christian Thiemann) X http://dev.processing.org/bugs/show_bug.cgi?id=1466 X replace applet.html and applet-opengl.html X http://dev.processing.org/bugs/show_bug.cgi?id=1057 @@ -5286,7 +5360,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=1260 X try adding a space to the name of the help menu for beachball problems X this works, might be useful to make the switch (done) X remove isManagingFocus problem inside JEditTextArea -X IDE crashed when changing color scheme on windows +X IDE crashed when changing color scheme on windows X http://dev.processing.org/bugs/show_bug.cgi?id=1237 X space in front of linux shell script prevents it from running X http://dev.processing.org/bugs/show_bug.cgi?id=1250 @@ -5305,7 +5379,7 @@ X update to java 6u14 on linux 0165 pde (1.0.3) -X no changes in this release +X no changes in this release 0164 pde (1.0.2) @@ -5348,11 +5422,11 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=986 0163 pde (1.0.1) X ArrayIndexOutOfBoundsException with File > New (Processing 1.0) -X maybe a /tmp permissions problem? +X maybe a /tmp permissions problem? X are we not checking errors properly on this route? X http://dev.processing.org/bugs/show_bug.cgi?id=1067 X need to look into why this didn't give a better error message -X "[JavaAppLauncher Error] CallStaticVoidMethod() threw an exception" +X "[JavaAppLauncher Error] CallStaticVoidMethod() threw an exception" X on startup with OS X X http://dev.processing.org/bugs/show_bug.cgi?id=1063 X http://dev.processing.org/bugs/show_bug.cgi?id=1078 @@ -5367,13 +5441,13 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=1073 X "space-import-space-quote-semicolon" Causes Error in String or Comment X http://dev.processing.org/bugs/show_bug.cgi?id=1064 X the changes page doesn't have a toc entry for the 1.0 release notes -X add minim to the changes page +X add minim to the changes page 0162 pde (1.0) X update revisions.html X write revisions.txt -X in 0149, removed /System/Library/Java +X in 0149, removed /System/Library/Java X http://dev.processing.org/bugs/show_bug.cgi?id=1045 X do we need to shore up server setup for 1.0 release pounding? o what's the deal with disk space? @@ -5501,7 +5575,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=886 X rename GettingStarted_Shape example invalid -o launch4j "An error occurred while starting the application" +o launch4j "An error occurred while starting the application" o http://dev.processing.org/bugs/show_bug.cgi?id=986 o tabs menu not working on osx ppc (can't confirm) o http://dev.processing.org/bugs/show_bug.cgi?id=993 @@ -5529,9 +5603,9 @@ X bug report: X create a new sketch, write something in it X create a new tab, name it "something.java", write something into it X rename main tab (sketch) to "something" (without ".java") -X the contents in the files are not the same, but the main-tab is -X showing the contents of the .java tab, so if you press save -X you will overwrite your original code from the main-tab. +X the contents in the files are not the same, but the main-tab is +X showing the contents of the .java tab, so if you press save +X you will overwrite your original code from the main-tab. X com.sun.jdi.AbsentInformationException when running a sketch X http://dev.processing.org/bugs/show_bug.cgi?id=971 @@ -5544,7 +5618,7 @@ X include javac? would this be a good solution for linux? X http://dev.processing.org/bugs/show_bug.cgi?id=8 X an empty .java tab will throw an error X http://dev.processing.org/bugs/show_bug.cgi?id=10 -X warn about writing non-1.1 code. +X warn about writing non-1.1 code. X http://dev.processing.org/bugs/show_bug.cgi?id=11 X java.lang.NoClassDefFoundError: quicktime/std/StdQTException X people not installing qt? no QTJAVA set? @@ -5552,7 +5626,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=669 o simulate this by removing qtjava.zip, then make a handler for it o which will open the reference for it X use the registry key, and warn the user when it's not there -X mouse wheel broken in the text editor? (windows jdk 1.5?) +X mouse wheel broken in the text editor? (windows jdk 1.5?) X http://dev.processing.org/bugs/show_bug.cgi?id=24 @@ -5643,7 +5717,7 @@ o sketch must be saved to use a constructor X http://dev.processing.org/bugs/show_bug.cgi?id=929 X reference bug, example cannot have same name as an inner class -structural +structural X processing.candy has been removed X processing.xml is now part of core.jar, no need to import X user-contributed tools and libraries should only be placed in the sketchbook @@ -5660,13 +5734,13 @@ X createInput() (nee openStream), createInputRaw(), createOutput() cleanup o how to grab the java2d object from PGraphics2D -o example for using mediatracker to load images -o simple example for threaded image loading "load several" +o example for using mediatracker to load images +o simple example for threaded image loading "load several" o (rather than blocking on each) o maybe add a loadImages(String files[]) function? o use a MediaTracker that's shared, so that while an image is still o loading, other calls to loadImage might be able to add things to the -o queue. or maybe beginImage() and endImage()? or a mode that lets +o queue. or maybe beginImage() and endImage()? or a mode that lets o you wait for the images to download (size is zero until they're ready) o MediaTracker blocking is prolly making jar download really slow o http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1089914280 @@ -5782,13 +5856,13 @@ o 3 column input file o regexp to find, to replace, human readable description o (void\s+)loop(\s+{) -> $1draw$2 (maintain all whitespace stuff) o "The loop() method is now called draw() as of beta" -o "angleMode no longer exists, use radians() around your angles" +o "angleMode no longer exists, use radians() around your angles" o (comment out the line) X this would only fix the minor stuff, not the important stuff X it also has a lot of potential problems and corner cases X just not worth the effort X tools api -X need to support the basic set of functions that are expected +X need to support the basic set of functions that are expected X to be used, otherwise it's gonna be total hell when we make a real api X getEditor() X get/setSelStart/End @@ -5814,7 +5888,7 @@ X no, bad idea.. don't want a zillion submenus on things 0146 pde -X fix problem with comment/uncomment and indent/outdent +X fix problem with comment/uncomment and indent/outdent X when no selection, and on the first pos of the line X on comment/uncomment, need to check if *all* lines are commented X otherwise should be comment (never uncomment unless all selected) @@ -5826,11 +5900,11 @@ X also highlighting the correct line X Exceptions not being reported properly to the PDE X lines with errors not highlighting X http://dev.processing.org/bugs/show_bug.cgi?id=877 -X was ok in 0144, but 0145 things broke +X was ok in 0144, but 0145 things broke X probably b/c not catching ex inside the run() method X getMessage() not sufficient for exceptions coming through X get actual message text, plus the exception itself -X now using actual sketch name (instead of temp name) +X now using actual sketch name (instead of temp name) X this should be safe since launching an external vm to run X make the p5 icon show up for the window X when launching a new sketch @@ -5846,7 +5920,7 @@ X http://processing.org/bugs/show_bug.cgi?id=42 X exceptions in draw() apps aren't caught X the program resize(200, 200); just does nothing (doesn't complain) X http://dev.processing.org/bugs/show_bug.cgi?id=81 -X exception in setup() on external app doesn't kill run button +X exception in setup() on external app doesn't kill run button X also doesn't kill external vm X http://dev.processing.org/bugs/show_bug.cgi?id=79 X fixed in the 0140s @@ -5904,7 +5978,7 @@ o this is particularly bad with threaded applications 0143 pde X fixed build problems with macosx and linux, thanks to reports -o need to compare with localized version of javac strings +o need to compare with localized version of javac strings X http://dev.processing.org/bugs/show_bug.cgi?id=828 X just moving to ecj instead of javac X preproc code showing through since it's on line 0: @@ -5942,7 +6016,7 @@ o 2) its mod date is earlier than when p5 0125 was installed o point the user to Tools -> Reload sketch with local encoding o then re-save the file to update the mod date o ...or, when first running p5 0125, offer to update sketches -o this is a bad idea--since it's probably +o this is a bad idea--since it's probably X need to set a default charset for use in files (utf8) X add option to change charset or specify as part of loading X need to specify the default encoding @@ -5964,12 +6038,12 @@ X can't seem to verify this X occasional division by zero on windows X http://dev.processing.org/bugs/show_bug.cgi?id=777 X should be fixed, but need to verify once a release candidate is ready -X two fixes for readBytesUntil() and bufferUntil() +X two fixes for readBytesUntil() and bufferUntil() X also not calling serialEvent() X http://dev.processing.org/bugs/show_bug.cgi?id=96 X fix goof with console preference in preferences.txt X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Syntax;action=display;num=1213042400 -X need to add usequartz when running externally? +X need to add usequartz when running externally? X no, tested and it seems to be working cleaning @@ -6023,14 +6097,14 @@ X xml.getIntAttribute() returns a float X http://dev.processing.org/bugs/show_bug.cgi?id=790 X include memory settings with exported applications on macosx X http://dev.processing.org/bugs/show_bug.cgi?id=803 -X error highlighting broken +X error highlighting broken X http://dev.processing.org/bugs/show_bug.cgi?id=795 0138 pde X importing a library results in "expecting EOF, found ..." error X http://dev.processing.org/bugs/show_bug.cgi?id=788 -X remove console variable from preferences.txt +X remove console variable from preferences.txt X run only works with primary window in 0136, 0137 X http://dev.processing.org/bugs/show_bug.cgi?id=784 X throwing a stackoverflowexception because the console is broken @@ -6043,7 +6117,7 @@ X remove debug messages from export 0137 pde -X move to multiple jars whenever +X move to multiple jars whenever X 1) a lib is in use, 2) code folder, 3) multiple files X remove oro.jar dependency (not needed with PApplet.match) X this is kind of messy and requires a bit of testing to ensure proper @@ -6055,7 +6129,7 @@ X applet export fails with opengl/code folder X http://dev.processing.org/bugs/show_bug.cgi?id=714 X synchronized (something) { } is horking up the preproc X http://dev.processing.org/bugs/show_bug.cgi?id=136 -o inside the preproc +o inside the preproc o change the arrays of default imports (now using 1.5+, so no 1.1,1.3,1.4) X don't bother, they're cumulative X improvements to the linux startup script @@ -6080,13 +6154,13 @@ X fixed in newer qtjava o http://dev.processing.org/bugs/show_bug.cgi?id=496 X add to p5 app bundle X mention re: apple slowness -X -Dapple.awt.graphics.UseQuartz=true +X -Dapple.awt.graphics.UseQuartz=true X net library dies unceremoniously on "Connection Refused" X just need to catch another exception X http://dev.processing.org/bugs/show_bug.cgi?id=751 X ctrl-/ to comment block X eeepc support for environment: -X splitPane.setMinimumSize(new Dimension(600, 600)); +X splitPane.setMinimumSize(new Dimension(600, 600)); X change to: splitPane.setMinimumSize(new Dimension(600, 400)); o prolly need to have a param for this guy X switch to nanoxml instead of nanoxml-lite (29k vs. 5k) @@ -6094,19 +6168,19 @@ X check against ods X http://dev.processing.org/bugs/show_bug.cgi?id=757 X space after OPENGL param breaks export X http://dev.processing.org/bugs/show_bug.cgi?id=769 -X svg demos are broken +X svg demos are broken X because of weird ENTITY setup X because of weird (default?) filling problem X remove support for random .class files in code and library folders X need to put everything in jar files X opengl currently broken in svn (probably the native libs not included?) -X mistakes wrt 'library.path' +X mistakes wrt 'library.path' X also, don't add /library/ for each lib to the classpath X remove unused libraries from default run path X note that this will hose svg b/c xml not available X so when this change is made, the lib depends needs to be implemented too -X changing to java 1.5 +X changing to java 1.5 o switch to java 1.4.2_16 on linux and windows (now that osx is there?) X change to 1.5+ (instead of 1.4*) in Info.plist for Processing.app X updated linux to java 1.5.0_15 @@ -6146,7 +6220,7 @@ X change software to point at correct reference locations 0135 pde -o opening a file from right-click in osx +o opening a file from right-click in osx o opens the new thing directly behind an untitled document X improve how fonts are parsed from the preferences file X this was causing strange errors as prefs files became corrupted @@ -6171,14 +6245,14 @@ o "reload sketchbook" option o "show sketchbook folder" X start removing pre-1.4 support X multiple windows -o what happens when p5 is launched without all its pieces? +o what happens when p5 is launched without all its pieces? o both on windows and mac... is there a way put up useful message o if everything moved into the .app file, how do you add applet.html? o can we use useragent to determine whether java 1.4 is in use? o for mac, could see if it's an old safari (1.3) or firefox (also 1.3) o for windows, the classid will take care of it all (firefox too?) o for linux, everyone's using 1.4/1.5 anyway -X rewrite section on versions of java +X rewrite section on versions of java X we're dropping support for anything before 1.4 X and don't recommend anything before 1.4.2 X we'll support 1.5 a little more now, but only libraries, not syntax @@ -6262,7 +6336,7 @@ X when new/open from menu, creates a new window o don't bug the user about new release of p5 when they have it o add prefs option for "latest version run" o something also to track--people going to older releases -X keeping this behavior, it's also the only way to know you're +X keeping this behavior, it's also the only way to know you're X running the wrong version when you accidentally open an oldie X createFont() needs to run 1.3+, and not in applets X where is the bug reference for this.. and can it be fixed? @@ -6352,7 +6426,7 @@ X move examples folder to top-level menu X move open menu to its own X BGraphics, BImage, void loop() -> give an error saying it's old code X better yet, only do this when "not found" errors come up -X need to fix changes.html because it lists out of date alpha->beta changes +X need to fix changes.html because it lists out of date alpha->beta changes X added getChild(name/path), getChildren(name/path) to xml library o add notes about these to the reference o needs a better example that includes subitems @@ -6450,7 +6524,7 @@ X add documentation X add() or addFrame()? X find/replace - replace should do auto find next(?) X or have a replace & find button -X placing "replace" next to "find" ... (hitting "replace all" by accident) +X placing "replace" next to "find" ... (hitting "replace all" by accident) X have a button "replace & find next" X http://dev.processing.org/bugs/show_bug.cgi?id=68 X only rebuild sketchbook on "save as" or "rename" of sketch @@ -6475,7 +6549,7 @@ X do a trim() on the selection for find in reference X reorganize find in reference commands X add setDTR() method from tom hulbert X moviemaker is broken -X updatePixels reference was cut off +X updatePixels reference was cut off X double-check this after rebuild of reference X examples X animated sprite example should use tabs @@ -6506,12 +6580,12 @@ X slight improvements to some preproc/compiler error messages X http://dev.processing.org/bugs/show_bug.cgi?id=12 X http://dev.processing.org/bugs/show_bug.cgi?id=13 X http://dev.processing.org/bugs/show_bug.cgi?id=15 -X deal with strange problem with KeyListener and {} on same line +X deal with strange problem with KeyListener and {} on same line X http://dev.processing.org/bugs/show_bug.cgi?id=484 -X copy custom applet.html file on "Save As" +X copy custom applet.html file on "Save As" X http://dev.processing.org/bugs/show_bug.cgi?id=485 o preferences file gone corrupt (on osx only?) -o changing font size, +o changing font size, o http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1160057791 X http://dev.processing.org/bugs/show_bug.cgi?id=406 o temporarily added log4j and jalopy (for the autoformatter) @@ -6573,7 +6647,7 @@ X finish draw(x, y, c, d) 0121 pde -X fix button fatness on osx +X fix button fatness on osx X quaqua already takes care of this for us X implement page setup and print X pretty printing of code in project @@ -6632,7 +6706,7 @@ X add PGraphicsOpenGL change to revisions.txt and the changes faq 0116 pde -o including function outlines in the code? +o including function outlines in the code? o i.e. make setup() and draw() for people? seems silly.. not much to do o when importing a library, insert 'captureEvent'? o again, seems to fraught with potential problems @@ -6668,13 +6742,13 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=233 o external apps should inherit memory settings from p5 itself X too confusing to set the memory in two places X or perhaps, have a setting in the ide for it -o and allow a checkbox for "always run externally" +o and allow a checkbox for "always run externally" X that way people don't have to adjust the memory settings for p5 itself X perhaps the memory setting should be enabled/disabled X that way if it's enabled, will always run externally o menu weirdness (benelek) o when you've got a menu open, move a cursor over the text area -o and back over the menu, the text-area cursor type remains. +o and back over the menu, the text-area cursor type remains. X mark this as wontfix, since it's just a java bug X http://dev.processing.org/bugs/show_bug.cgi?id=30 X remove the second movie from the movie playback example @@ -6743,7 +6817,7 @@ X add more information about setting the memory X move memory setting to troubleshooting page on bugs db X the source code to the libs are included X this makes them easy to modify (in another app) -X or you can remove the package statements and embed them +X or you can remove the package statements and embed them X serial is a little trickier since you'd have to put stuff in code/ X windows, may need to install new version of video drivers X add to opengl doc/faq @@ -6779,7 +6853,7 @@ X move troubleshooting page to the reference faq / platforms X add notes about running processing on various platforms -o directions for rebuilding jikes, etc (where is this?) +o directions for rebuilding jikes, etc (where is this?) o and then link to posts on the discourse site about how to do it faq / export @@ -6835,7 +6909,7 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=315 0111 pde X switch back to rev b3 of jogl so that applets will work -X fix color picker: +X fix color picker: X http://dev.processing.org/bugs/show_bug.cgi?id=308 X also add esc/ctrl-w for closing the picker X update information on mactels in the faq, also java 1.6 @@ -6869,12 +6943,12 @@ X adding dxf library to distribution X fix bug with drag & drop of files to sketch on macosx X need space between bullet points in faq css X also need the absolute url stuff to work -X add discourse formatter tool +X add discourse formatter tool 0107 pde X fix yet another save bug, context menu paste/cut not setting modified -X undoing to the code's original state won't unset it as "modified" +X undoing to the code's original state won't unset it as "modified" X http://dev.processing.org/bugs/show_bug.cgi?id=248 @@ -6891,7 +6965,7 @@ X removed "yep yep yep" when using "Create Font" X p5 not saving changes on quit, even if you say 'yes' X http://dev.processing.org/bugs/show_bug.cgi?id=276 _ http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1139519266 -X update osx for intel binary (if necessary) +X update osx for intel binary (if necessary) X if running on 10.4, univerals jikes installed in /usr/bin/jikes X updated the jikes included with p5 to be the universal version X add notes to the faq about status @@ -6948,7 +7022,7 @@ X make editor save button highlight on ctrl-s X same goes for the other editor buttons X http://dev.processing.org/bugs/show_bug.cgi?id=242 X deal with "could not delete stderr.txt" messages -X probably screwed up the temp folder stuff +X probably screwed up the temp folder stuff X build folder is randomized, being recreated on each build X mark temp build folder for deletion on exit X properly remove console files on exit @@ -6959,9 +7033,9 @@ X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action tab handling X indent/outdent with curly braces -X tab to just indent lines properly, +X tab to just indent lines properly, X rather than having it convert to spaces -X need a smarter handler (rather than the editor listener) +X need a smarter handler (rather than the editor listener) X could look at previous line for its indent X and when hitting } do a proper outdent (if only spaces before it) X http://dev.processing.org/bugs/show_bug.cgi?id=22 @@ -7069,7 +7143,7 @@ X console text selection immediately de-selects X suspect console is updated every 250 ms even when the app isn't running X simplest to just not update the console if nothing is waiting in buffer X http://dev.processing.org/bugs/show_bug.cgi?id=180 -X problem with using qtjava is probably the quotes.. +X problem with using qtjava is probably the quotes.. X remove them because they're matching quotes elsewhere X drag & drop implementation to add files to sketch X http://dev.processing.org/bugs/show_bug.cgi?id=21 @@ -7092,7 +7166,7 @@ X need to figure out threading etc X problem with it launching a new thread for every single update! X http://processing.org/bugs/show_bug.cgi?id=19 X make a note that video doesn't currently work in applets in the faq -X scanning sketchbook folder may be extremely slow +X scanning sketchbook folder may be extremely slow X when lots of frames saved out, takes forever to scan the folder X some dumb sorting code was responsible X and each file was being treated as a directory. oops. @@ -7105,9 +7179,9 @@ X http://dev.processing.org/bugs/show_bug.cgi?id=48 o auto-run the javadoc in dist.sh o doctor a copy of the css file to use p5 defaults o and re-copy the css in after generating the doc each time -X timing fix introduce regression on linux +X timing fix introduce regression on linux X extra (NUL?) chars are added -X i.e. on first run, the ten blank lines each have a li'l box +X i.e. on first run, the ten blank lines each have a li'l box X http://dev.processing.org/bugs/show_bug.cgi?id=118 X faq: "my applet doesn't work on export"... where to check for errors X very common: cached version is being used @@ -7122,18 +7196,18 @@ fixed in previous releases X closing window w/o first hitting stop() causes freak out X opengl gives an OutOfMemoryError X java2d just goes into a lock -X could also be code that's in an infinite loop (i.e. text error) +X could also be code that's in an infinite loop (i.e. text error) X which then causes a full lock X something really bad happened with println() in this release X perhaps only without a code folder and/or running in java2d mode? -X this may also be what's hosing +X this may also be what's hosing X external apps don't stop at all when 'stop' is hit X worker thread is halting the app ala code folder bug -X could this be dealt with by using nio? +X could this be dealt with by using nio? X host environment will be running 1.4 so... o make note that changing screen config requires restart of processing o static { checkScreens(); } -o static void PApplet.checkScreens() { } +o static void PApplet.checkScreens() { } o to run explicitly later o this seems too complicated.. just make people restart o convert spaces to underscores and vice versa for sketch/tab names @@ -7142,7 +7216,7 @@ o only needs to be underscored when passed off to java o although then if people *want* underscores, there's gonna be trouble o http://dev.processing.org/bugs/show_bug.cgi?id=76 o if in full java mode -o if extends PApplet.. or rather, put PApplet cast into a +o if extends PApplet.. or rather, put PApplet cast into a o try/catch block.. if it doesn't work, try applet. if that o doesn't work, try using the class' main() to run it X not gonna do this, p5 is not a java editor @@ -7161,11 +7235,11 @@ X buglist.cgi X replace the platform column with the os column (uses icons for os) X sorting based on any of the headings gives an error X "102 bugs found. 102 bugs found." -X remove the severity column +X remove the severity column X it's normal or enhanced, and enhanced is already gray -X make os into: Mac OS, Windows, Linux, Other +X make os into: Mac OS, Windows, Linux, Other X while other categories might exist, it's too confusing for minimal benefit -o make things that are P5 into "enhancement" +o make things that are P5 into "enhancement" o unless a P6 can be added? or something called "enhancement"? X is there a way to list "all" bugs (especially sorted by priority?) X or at least the first 20 listed by priority? @@ -7195,7 +7269,7 @@ X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1115787397;start=0 X wasn't using runner stop button color X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Suggestions;action=display;num=1116166897;start=0 -X fix up the video crap because nobody reads the faq +X fix up the video crap because nobody reads the faq X and no cameras means that the list comes back null X can't seem to find build dir on operating systems w/ non-ascii chars X or rather, when user accounts have non-ascii chars in the name @@ -7226,7 +7300,7 @@ X not seen for a long time o this may be fixed? o http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1076358432;start=0 o package processing.app for PdeBase, PdeEditor.. -o if NullPointerEx on a line that includes a "pixels[" +o if NullPointerEx on a line that includes a "pixels[" o give an error message saying "you may need to call loadPixels" discuss with casey @@ -7246,7 +7320,7 @@ X we've attempted for less confusion over speed in some cases X get(), set() and red() et al are one such example X web colors with alpha: 0xffcc0080 or unhex("ffcc0080") `X the draw() method must exist, otherwise the sketch won't run -X i.e. can't just have mousePressed() +X i.e. can't just have mousePressed() o make a sketch that shows loading from the web o make another sketch that shows loading from a file X make notes about preproc @@ -7342,15 +7416,15 @@ o System.err was getting cut off before finishing o no transformations before background() is called o implementation specific, may cause trouble o must call depth() for 3D applications -o lights cannot be enabled/disabled throughout +o lights cannot be enabled/disabled throughout o lighting will be based on what's left at endFrame() X images should be a power of 2, or call modified() -X document the use of "die" +X document the use of "die" X can override the method to do your own handling X sketches no longer require a "data" folder X example that uses loop/noLoop, or redraw? X talk to creas about making html files for bugs, readme, revisions. -X or how they should relate to the 'faq'.. readme -> faq? +X or how they should relate to the 'faq'.. readme -> faq? X loadImage() mixed case problems @@ -7380,7 +7454,7 @@ X righthand max isn't being updated for that second line X or it's getting written over by the line below it X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1113932608 X include platform information when checking for updates -X send over the int as long hex number? +X send over the int as long hex number? X 64 bits hex is gonna be 16 digits.. much cleaner o when people are running 1.5, warn them? o if p5 is running 1.5, let them know to use the standard install @@ -7389,9 +7463,9 @@ X nah, this seems like overkill.. problems haven't been *that* bad (yet) X make sure that when running ext, using the local java X macosx 10.2 needs libiconv to run jikes X http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action=display;num=1114113204;start=0 -o either compile jikes not to use it: +o either compile jikes not to use it: o http://jikes.sourceforge.net/faq/dev-win32.shtml -o or maybe include an installer: +o or maybe include an installer: o http://www.bluem.net/downloads/libiconv_en/ o gnu page for libiconv o http://www.gnu.org/software/libiconv/ @@ -7430,15 +7504,15 @@ X wontstart wasn't properly linked X watch out for upper/lowercase changes X methods and functions always start lowercase, and have inner caps X faq - java 1.5 -X seems to run things more slowly.. +X seems to run things more slowly.. X if using p5 standard, will be running 1.4 X but if 1.5 installed, browser will probably use that X opengl only runs with 1.4 X opengl not tested for applets X to get to opengl functions, put this after size: X GL gl = ((PGraphicsGL)g).gl; -X and then can make opengl calls. this is not supported, -X and if things don't work, sorry. +X and then can make opengl calls. this is not supported, +X and if things don't work, sorry. X faq - known bugs X 1 pixel stroke weight in opengl (temporary) X make clear that P2D is not working if not clear enough @@ -7476,7 +7550,7 @@ X a bunch of stuff from revisions.txt on 84 and 82 o how to deal with bugs, since there are so many known... save as... bugs -X always make sure that the sketch folder still exists +X always make sure that the sketch folder still exists X otherwise editor gets into a weird state (v74) if a project folder is made (with save as), and then deleted while processing is still open, there is an error (of course). but @@ -7489,7 +7563,7 @@ saving a project over an already existing project does not get rid of the .pde files that arent overwritten. not sure if this is feature or bug, but it took me by surprise. it seemed to only overwrite .pde files with the same name, but everything else in that project folder -stays as is. +stays as is. X sketch renaming fixed X rename, change, was asking about the old sketch name @@ -7507,7 +7581,7 @@ File>Open some other file File>Open original file file is empty. the only way to make File>Save As actually save new files, as far as i -can tell, is to Save As once, make at least one change, then Save. +can tell, is to Save As once, make at least one change, then Save. X fix hide/unhide bug... just was dumb code create a new sketch @@ -7523,7 +7597,7 @@ where did "a_2" go ? 0083 pde X move everything to packages, and start auto-javadoc X how to get preproc to automatically prepend packages -o only build preproc from preproc/make.sh? +o only build preproc from preproc/make.sh? o and check in the preproc'd code to cvs? X need to add classes dir to cp for jikes make (on win and linux) X get both versions of size() properly detected on export @@ -7568,9 +7642,9 @@ o should loadPixels be grabPixels? (nope) saturday evening X update processing/build/howto.txt X add 'make' to list of things that should be installed -X update libraries/howto.txt +X update libraries/howto.txt o should we queue lib events until the end of loop? -X nope, libraries can handle that themselves, +X nope, libraries can handle that themselves, X and queue events by registering for draw or whatever they'd like X lib could call queueEvent with the args X then call them inside post() @@ -7618,7 +7692,7 @@ o fix for 78 since not sure when simon's new version is happening X requires because uses 3D.. oh well o "draw" is not highlighted as a keyword.. other keywords? o draw(), PGraphics(), NO_DEPTH_TEST, PMovie(), PMovie.repeat() -o PClient(), PClient.available(), PClient.read(), +o PClient(), PClient.available(), PClient.read(), o PServer(), PServer.dispose(), PServer.write(), attach(), length o round() is not colored @@ -7672,7 +7746,7 @@ X include "you need to install java" text on default export page X make compatible with jikes 1.22 X fix all warnings generated by the new jikes X update windows version of jikes.exe -X update macosx version of jikes +X update macosx version of jikes X get source and build on osx (or is it shipped by default?) X make sure that fink is not in the path when building X what are the args to configure a release version? @@ -7714,7 +7788,7 @@ X is PdeEditorHeader one pixel too tall X move the tabs over just slightly X resize box intrudes on the scroller for the console area X need to set grow boxes intruding to false -X 1.3 version (deprecated): +X 1.3 version (deprecated): X -Dcom.apple.mrj.application.growbox.intrudes=false X 1.4 version (much nicer): -Dapple.awt.showGrowBox=false X add mkdmg script to macosx build process @@ -7754,11 +7828,11 @@ X also put something in lib/preferences.txt for default location X this way a course admin can change the default location o need to check if volume is read-only, notify and quit if it is o people are trying to run off the disk image -o actually that should be fine.. +o actually that should be fine.. o but make sure the prefs location can be written o need to pay attention to when running from read-only drive o reported by brandenberg -o "p5 will launch from the disk image, but will +o "p5 will launch from the disk image, but will o not draw the sketch name bar doesn't appear" X include preferences.txt option to write to p5 folder first X this can be altered by instructors and re-packaged @@ -7767,7 +7841,7 @@ X put 'play' on a SwingWorker thread X test this on a pc to see how it goes, especially with opengl X doesn't seem to help anything X PdeRuntime -> SystemOutSiphon, removed MIN_PRIORITY setting -o hack to not use console on the code folder +o hack to not use console on the code folder o no errors will propogate, but it should run fine X lib/build should not be a subfolder of p5 X p5 environment installed to /Applications on lab machines @@ -7775,7 +7849,7 @@ X instead use a temp folder X maybe when running on lab machines in that case, always java mode? X or is it possible to add to java.class.path while app is running? X have to use a special class loader -X new class loader for single files +X new class loader for single files X if more than one class defined, forces it to run externally X (basically any time it sees "class" in the code.. X may be subject to errors, but errs on side of just running ext) @@ -7792,7 +7866,7 @@ X make preproc only build once (across osx, windows, linux) X preproc: making all functions public that have no specifier X this will make draw() etc all much easier X as well as the library events -X focusGained/focusLost was added.. +X focusGained/focusLost was added.. o if a data file is in the sketch (not data) folder export breaks o works fine in the editor, but on export gets a nullpointer ex X no way around this, because needs to be able to read from local dir @@ -7820,10 +7894,10 @@ X serialEvent, clientEvent, serverEvent X if videoEvent exists, don't auto-read? X though for serial this would only grab the last byte X video bug on osx? an error message when quitting video sketches: -X java.io.IOException: Bad file descriptor -X at java.io.FileInputStream.readBytes(Native Method) etc... ). +X java.io.IOException: Bad file descriptor +X at java.io.FileInputStream.readBytes(Native Method) etc... ). o bring back some form of beginSerial/beginVideo -o openSerial(), serial().. +o openSerial(), serial().. o should it prompt or use the first available if none specified? X run library destroy after hitting 'stop' X quicktime audio doesn't stop after hitting 'stop' @@ -7847,7 +7921,7 @@ X keypressed hanging on applets with a code folder X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1081450102 X problems running external vm/vm is hanging X seems to be happening because of virus scanning software (norton) -o may need to launch the applet (using 'start') +o may need to launch the applet (using 'start') o and talk over a socket instead X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1067867520;start=0 X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1067643186 @@ -7862,18 +7936,18 @@ output to the console and see if it'll still crash. run via a disconnected process, using "cmd /c start java", the thing will never hang. in that instance, the process terminates almost immediately, and no i/o needs to happen (since it's a cmd prompt that -never shows up). +never shows up). * it could also be a graphics sync bug that just gets more testy because the environment, a second java process, is running at the same time. mis.newPixels() may hork since it's over in the applet's thread, and it might be calling repaint() or Toolkit.sync() to update the -image on-screen. +image on-screen. * shows up on key presses.. not sure if this is because of the actual key press, or if it's because they're often accompanied by a println() * blank spaces in filenames/parent folder often cause trouble.. not sure if related. same for PATH and CLASSPATH. * some virus scanning software, particularly older NAV versions cause -the trouble. +the trouble. 0074 pde @@ -7907,14 +7981,14 @@ X uppercase being capitalized before lowercase X need to mix case.. use toLowerCase before compare X add a little gap on editor frame at the left X http://processing.org/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1097363967;start=0 -X add to readme or bugs.. +X add to readme or bugs.. X menus that are too long just get clipped on the screen X can't be fixed because it's a java/os issue X also strange menu behavior for popups, especially on osx we can't fix o if applet.html is present, open that in the editor too. o or do we make people use dreamweaver? o nixed by casey, we're not dreamweaver -X macosx not exporting core.jar +X macosx not exporting core.jar X the jar is buried Contents/Resources/Java X don't enable externalRuntime with multiple code files that are pde X no longer separate classes @@ -7932,7 +8006,7 @@ X remove grow box from applet frame macosx X verify that export is working from processing.app -o check into ryan's macosx java bug.. +o check into ryan's macosx java bug.. o see why coords are going negative @@ -7953,11 +8027,11 @@ X sketch is changing before the "save changes?" is complete X as a result, 'cancel' does nothing X always ask save changes, even if nothing changed -040620 sunday +040620 sunday X remove 'sketchbook.prompt' (comment it out) X not really needed X remove prompt stuff from the preferences panel -X clean up the "more options" in prefs panel +X clean up the "more options" in prefs panel X to use JLabel instead of JTextArea X font was wrong on windows X start working on "save as" @@ -7998,7 +8072,7 @@ X reads sketchbook properly from other folder X but creates a new folder for new sketches to go into X sketchbook.dir not properly read or written X install sketchbook into another location on person's machine -X use System.getProperty("user.home"); +X use System.getProperty("user.home"); X remove the 'default' for sketchbook X bring this up on bboard and get votes X win2k: my documents, macosx: ~/Documents, linux: ~/sketchbook @@ -8047,14 +8121,14 @@ X sometimes nice just to have it create an unnamed sketch quickly X shift-new will always prompt with filedialog X dashes shouldn't be allowed in filenames for sketches X actually, lost the naming stuff because now using FileDialog -X this also needs to be checked when building the sketch menu +X this also needs to be checked when building the sketch menu X rewrite sketchbook.clean() X prompt user if they don't have it set to auto X add a pref to the preferences window 040622 monday late night X set handleOpen to use editor as its parent frame -X what happens when the .pde file isn't named +X what happens when the .pde file isn't named X the same as the enclosing folder? X maybe put up a window saying no way, and ask: X ( ) rename enclosing or ( ) add a subfolder @@ -8062,7 +8136,7 @@ X or maybe even ( ) rename the sketch file X also double-check to see if there *is* a proper pde in the folder X in which case, default to that (maybe show a message?) X it's useful to have loose .pde files be runnable.. -X i.e. when double-clicking on them.. downloaded off web.. +X i.e. when double-clicking on them.. downloaded off web.. X but need to deal with simply, not providing a new exception case X begin writing 'new text file' @@ -8106,7 +8180,7 @@ X what should the prefs file be named? X horizontal buttons? need final decision [yes] X remove underscores from the tab title? X nope, casey says not necessary -X need nice yes/no dialog boxes, also +X need nice yes/no dialog boxes, also o does "Open" go at the beginning or end of the sketch popup X we need opengl support in there X otherwise we're going to be stuck behind director @@ -8134,7 +8208,7 @@ X add .java to file name in the tab X change name of prefs to Processing Preferences.txt X implement clone for BImage X api name changes for imaging functions -X constant SUBSTRACT -> SUBTRACT +X constant SUBSTRACT -> SUBTRACT 040707 afternoon X minor bug with when setting sketchbook to a bad location @@ -8172,7 +8246,7 @@ X modify preproc to handle "void setup" -> "public void setup" o preproc bug: text(String.valueOf(i+1), left + i*20, top); o unexpected token "String" X make more things public (i.e. pixels) -X get casting working properly.. int() maps to toInt()? +X get casting working properly.. int() maps to toInt()? X what is performance hit for this thing? X remove substitute_image/font X remove String casting @@ -8218,7 +8292,7 @@ X processing.serial -> PSerial, [PUsb] other stuff / cleaning up X don't allow apostrophe (i.e. casey's_cells) when naming sketch! -X when exporting applet, line numbers will be off.. +X when exporting applet, line numbers will be off.. o when not exporting with new preproc code, imports all on same line o make preproc keep track of how many lines were added X rewrite video, net, serial libraries to be separate @@ -8244,7 +8318,7 @@ o ability to include other .java and .pde code from sketchbook folder o 'add files' for .java or .pde pulls into the folder X split to take strings (ie. for ", ") o image(BImage, x, y, float scale) (found in illustrator stuff) -o begin/end.. beginSerial/endSerial -> +o begin/end.. beginSerial/endSerial -> o openSerial/closeSerial ? o startSerial/stopSerial X punting on api @@ -8282,8 +8356,8 @@ X load that before the other stuff X -> was already implemented like that o fix the problem causing all the "couldn't delete" messages o class naming from dan -o If you name a class the same name as the sketch project, -o you get an error about contained classes with duplicate names +o If you name a class the same name as the sketch project, +o you get an error about contained classes with duplicate names o when you try to export for web. o quick fix inside PdeRuntime o if (loop == false) and (draw == false) then provide an error @@ -8305,7 +8379,7 @@ shape class Something { void setup() { // not used, or called on first draw - // but maybe required (even if behind the scenes) + // but maybe required (even if behind the scenes) // so that this can use "implements ShapeInterface" } @@ -8328,7 +8402,7 @@ shape(ShapeInterface o) { X run java mode when large 'data' folder is in use X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1081542378 -X fixed one bug in PdeRuntime error message stuff +X fixed one bug in PdeRuntime error message stuff X was this the big one? a big one? 040715 late @@ -8353,15 +8427,15 @@ X i.e. cut -> new file -> paste doesn't mark any as changed X "include all chars" and all the bugs it represents X working on datatype conversions -040717 +040717 o dll and jnilib files have to be in the p5 folder (confirmed by amit) -o there should be other places that they work.. +o there should be other places that they work.. o could even copy the dll to the p5 folder from the code folder o already fixed with LD_LIBRARY_PATH stuff 040902 -X building Processing from scratch -X not able to write "preferences.txt" on the first run +X building Processing from scratch +X not able to write "preferences.txt" on the first run 040903 X examples should be in a submenu of open @@ -8376,14 +8450,14 @@ o need to be able to select between which to include o auto-resolve by saying java.* wins, others ask X make built-in libraries read-only -040912 -X several menu changes as discussed with casey +040912 +X several menu changes as discussed with casey X (capitalization, export/export app, tools) X add preference for showing library stuff 040913 morning X figure out why user libraries not being added -X in lib mode, show internal libraries as part of the 'open' menu +X in lib mode, show internal libraries as part of the 'open' menu X make a note that p5 has to be restarted for libs X import all libraries into classpath X all libs found during sketchbook build + all libs in libraries @@ -8397,7 +8471,7 @@ X "Processing" folder not properly created on new install X add noLoop() to static mode apps X remove "loop" from special inserts on preproc -040921 afternoon +040921 afternoon o when running externally, build into sketch folder? X add all imported libs to hash table of jars @@ -8423,7 +8497,7 @@ X errorMessage in PSerial/PClient/PServer are all using System.out X write handler for loop() error, warning user to rename loop to draw X c:/fry/processing/build/windows/work/lib/build/Temporary_1452_9170.java:29:6:29:11: Semantic Error: The method "void loop();" with default access cannot replace the accessible method "void loop();" with public access declared in type "processing.core.PApplet". -040925 +040925 X change how export.txt works X make p2 dist for amit X break out BSerial as separate object like BVideo @@ -8438,7 +8512,7 @@ o http://docs.info.apple.com/article.html?artnum=93414&sessionID=anonymous%7C2 o "Type quicktime.std.stdQTConstants was not found" o http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1066358763 o http://docs.info.apple.com/article.html?artnum=120255 -X split classes to BVideo and BMovie ? +X split classes to BVideo and BMovie ? X don't force install of qtjava X this requires a separate version of bagel that doesn't use video X or a version that loads video dynamically. that kinda sucks. @@ -8467,7 +8541,7 @@ X selecting input source (wintv board and quickcam installed.. problem) network o don't send unicode data -X when you stop the client, it freezes +X when you stop the client, it freezes X until you quit the processing running the server X (the server starts and stops fine) X add constants for building NET, move stuff around in bagel dir @@ -8485,7 +8559,7 @@ X remove fonts from distribution X be able to link against, but not export, certain parts of lib X jsyn.jar not needed on export, netscape libs not needed on export o crap.. libraries need to be in packages for this to work -o but annoying: attach("simong.particlesystem.ParticleSystem") +o but annoying: attach("simong.particlesystem.ParticleSystem") X disable "export application" X font builder X properly update the font on new selection @@ -8530,7 +8604,7 @@ X go through the board and move messages X a garbage filled classpath can cause trouble X http://processing.org/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1096302833;start=0 X processing won't start.. -X people with non-ascii chars in the folder name +X people with non-ascii chars in the folder name X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1062794781;start=0 X http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1067764732 X other errors with spinning and not doing much @@ -8557,7 +8631,7 @@ X update to new shell runner (old mrj guy was ancient) 0070p7 X fix run.bat and run-expert.bat X remove library path debug message -X catch error message for "quicktime.std" +X catch error message for "quicktime.std" X move packages to processing.video, processing.serial, etc. X need to update the set of new examples X make sure the library features are disabled by default @@ -8575,7 +8649,7 @@ X update with other examples 0070p8 (final) X height for applets wasn't working properly X debug font stuff in processing.core -X mbox wasn't set properly (not a power of 2) +X mbox wasn't set properly (not a power of 2) X debug framerate() stuff with noLoop() X re-enabled printarr(Object[]) X remove SystemOutSiphon: i just died message @@ -8588,7 +8662,7 @@ X examples updated 0069 pde -X font builder +X font builder X crashing on small sizes for many fonts X make the text area not selectable or highlightable X add a few more rows @@ -8746,7 +8820,7 @@ X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs 0066 X BImage.replicate for straight 1:1 copy, blend() for blended version -X remove the blendMode function because it's confusing +X remove the blendMode function because it's confusing X big changes to image code from toxi X repaired smoothing so that it doesn't crush the last line X bresenham ellipses/circle ignore alpha @@ -8768,7 +8842,7 @@ X if saveas/rename names match, use renameTo X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1066495952;start=0 X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1066497131;start=0 X include JSObject with p5's pde.jar -X jaws.jar is already included on mac.. +X jaws.jar is already included on mac.. X check to see if ok on pc (empty project -> new JSObject()) X files are in jaws.jar: JSObject, JSException and JSUtil X curvePoint not initializing @@ -8802,7 +8876,7 @@ X fix SMOOTH_IMAGES problem with how text had been modified X include version number in the about box X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1064220242 X Ctrl-B will beautify the code and send the cursor back to the -X beginning of the the text. Then you have to scroll back to +X beginning of the the text. Then you have to scroll back to X where you were... ok, so maybe I am a heavy user of Ctrl-B. X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1064220242;start=0 @@ -8818,9 +8892,9 @@ X removed the cancel button 0063 X beautify menu became disabled when moved X BImage(int width, int height) constructor -X trying to track down sluggishness with applets.. +X trying to track down sluggishness with applets.. X beginShape/endShape.. 3D scenes with boxes.. -X newPixels is in BGraphics.endFrame, +X newPixels is in BGraphics.endFrame, X screen.drawImage is in BApplet.paint X need to move both to BApplet.paint() X external applet stuff @@ -8877,7 +8951,7 @@ X open applet folder after exporting sketch X switch back to red instead of yellow for errors. whups. from carlos' contract, but implemented by fry -X get font things sewn up +X get font things sewn up X create a simple generator for grayscale bdf fonts X document the change and make several of them X font smoothing (unless hint SMOOTH_IMAGES enabled) is broken @@ -8948,16 +9022,16 @@ X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display; X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1062483060;start=0 X if there's a bug in bagel, PdeRuntime.message() ignores it X just says "NullPointerException" but provides no info -X now at least spews the exception +X now at least spews the exception X removed ugly white borders from ui on macosx java 1.3 X is there anything better that can be done for osx java 1.3 X setInsets() to zero or something? -X font.stringWidth -> font.width(char c) or width(String s) +X font.stringWidth -> font.width(char c) or width(String s) X removed extra push()/pop() in text(String s) that may save time X bezier error, goes up at the end X also when using bezierMode, doesn't draw the first vertex X size(300,200); -X bezier(0,100,width/3,100,2*width/3,100,3*width/3,100); +X bezier(0,100,width/3,100,2*width/3,100,3*width/3,100); X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1064166242;start=0 X add note to tga spec X http://organicbit.com/closecombat/formats/tga.html @@ -8982,12 +9056,12 @@ X resize is maybe goofy, so just size() for all? X color() with alpha now works properly X removed SMOOTH_IMAGES X removed shearX and shearY -X toxi image code (!) +X toxi image code (!) X need background(BImage) and scaling, copy area, etc. X vertex(x, y, u, v) and vertex(x, y, z, u, v) X don't cast color() X since more important for color(v1, v2, v3) to work -X getPixel/setPixel -> get/set.. +X getPixel/setPixel -> get/set.. X get(x, y, w, h) is nice but no set(x,y,w,h) X though set(x,y,w,h) could be nice X and copy() to copy a section of pixels @@ -9019,11 +9093,11 @@ X some flag to know whether applet is online or not X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_Software;action=display;num=1051758365;start=0 X colorMode is defaulting to 255, 255, 255, 1.. oops X though setting it differently hoses everything (clears everything) -X setup (200, 200) causes the default size to be used +X setup (200, 200) causes the default size to be used X be able to draw something inside setup (?) X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Syntax;action=display;num=1044689650;start=0 X no time to ask for "save changes" before quit -X PdeEditor, around line 910.. not blocking until input +X PdeEditor, around line 910.. not blocking until input X read up on how to properly block for input in a java app X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1064165653;start=0 X do not delete sketch folder if empty sketch but non-empty data dir @@ -9055,9 +9129,9 @@ X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display; fixes because of dmose parser dm X move to antlr -dm X float z= float(x) + float(y); +dm X float z= float(x) + float(y); dm X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1062471182;start=0 -dm X compiler barfs on: float[] moo = new int[10]; +dm X compiler barfs on: float[] moo = new int[10]; dm X although no error comes through to p5 (benelek) dm X this was a kjc error, so it's fixed with jikes dm X int() doesn't work inside other functions @@ -9070,7 +9144,7 @@ dm X setup( ){} has an error, setup(){} does not dm X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1062461971;start=0 dm X weird comments bug (// on last line causes oro trouble) dm X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1062462227;start=0 -dm X unexpected token 'void' in letters sketch.. +dm X unexpected token 'void' in letters sketch.. dm X being parsed as static mode app dm X extra parens confusing things (toxi message) bf X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1064165730;start=0 @@ -9119,7 +9193,7 @@ X textureImage() -> texture() X textureMode() IMAGE_SPACE or NORMAL_SPACE X vertexNormal() -> normal(); X vertexTexture -> vertex(... u, v); -X bezier(... t) -> bezierPoint() +X bezier(... t) -> bezierPoint() X curveTangent and bezierTangent are in there X curve(... t) -> curvePoint() X bezierMode -> bezierSegments @@ -9143,8 +9217,8 @@ X ALIGN_XXXX becuase LEFT already used for keys X implement text(int something) and text(float something) o and perhaps others? X textSpace SCREEN_SPACE and OBJECT_SPACE -X strokeMode/strokeWidth -> -X strokeWeight, strokeJoin, strokeMiter +X strokeMode/strokeWidth -> +X strokeWeight, strokeJoin, strokeMiter X param(), online(), and status() functions X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=BugFixes;action=display;num=1064166444;start=0 @@ -9198,7 +9272,7 @@ o jre icon not appearing in the systray o http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1030538508 o getting mouse movement outside the window o http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1051916278;start=0 -X building releases from scratch +X building releases from scratch X this is a useful developer task before release X build all releases from a clean cvs X tries to make work/ without bagel serial existing and blows up @@ -9229,13 +9303,13 @@ X optimize color() when in colorMode(RGB, 255) to just pack the int X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Syntax;action=display;num=1062072434;start=0 X imageMode() shouldn't affect fonts X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1060207942;start=0 -X replacing spaces with underscores.. +X replacing spaces with underscores.. X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1062103523;start=0 X patch keyTyped event instead of keyPressed X remove reference in readme about macosx problem w/ it X test on macosx X test on linux -X Event.consume() doesn't work on entry fields +X Event.consume() doesn't work on entry fields X manifests itself in sketch naming, can't be constrained X may not be the case under swing? X it's probably because of keyTyped() being the important one @@ -9258,7 +9332,7 @@ X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs known issues/bugs * quicktime for java is *required* on windows.. it's installed by -default on macosx, and not used at all on linux. +default on macosx, and not used at all on linux. * QTJAVA environment variable is used to find quicktime. if that's not properly set, then you won't be able to run. * lots of 'cannot delete ...' messages @@ -9307,7 +9381,7 @@ X write proper build instructions for bagel X email about bagel doesn't have proper build instructions X need to install cygwin, set CLASSPATH to build X specific version of jikes (currently) -X make mac version require head/tail from fink ? +X make mac version require head/tail from fink ? X test to see if /sw/bin/head exists, if so use it X get dmose's new launcher running X cleanup cvs bunk @@ -9366,12 +9440,12 @@ X removes a random ArrayIndexOutOfBoundsException X Thread.stop is deprecated (and has been since 1.2) X http://java.sun.com/products/jdk/1.2/docs/guide/misc/threadPrimitiveDeprecation.html X remove finished in favor of just setting thread to null in BApplet -X check to see if setting threads to null works on windows +X check to see if setting threads to null works on windows X the multiple thread killing code was in there for a reason -X not tested on macos9.. +X not tested on macos9.. X hiding the cursor. noCursor(), cursor()/cursor(ARROW), cursor(HAND), cursor(CROSS), cursor(image_file) X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_Software;action=display;num=1059485109 -X default size of console is bad.. +X default size of console is bad.. o prolly need to stuff in 4 blank lines o runtime exceptions not coming through on either mac or windows X works fine on windows @@ -9415,20 +9489,20 @@ X seems that file names changed between 1.3 and 1.4 X sorted this issue out, now it's re-enabled X change default font for jdk 1.4 X reference launching working properly -X reference doesn't launch on mac (mKoser) +X reference doesn't launch on mac (mKoser) X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1038424448 -X tweak for java 1.4 +X tweak for java 1.4 X need to add a line to the properties file o include a note about this in the readme, include url for download o connect.apple.com X bug on p5 bboard: http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1037829938;start=0 running 1.4 from the command line: -/System/Library/Frameworks/JavaVM.framework/Versions/1.4.1/Commands/java +/System/Library/Frameworks/JavaVM.framework/Versions/1.4.1/Commands/java Info.plist, setting JVMVersion -* 1.3.1 - only use JDK 1.3.1, even if later versions are available. +* 1.3.1 - only use JDK 1.3.1, even if later versions are available. * 1.3* - use any version of JDK 1.3.x. Do not use JDK 1.4 even if it's dflt. -* 1.3+ - use the latest JDK version from JDK 1.3 onward, up to default JDK. -* 1.4+ - use JDK 1.4 or later, even if an earlier JDK is the default. +* 1.3+ - use the latest JDK version from JDK 1.3 onward, up to default JDK. +* 1.4+ - use JDK 1.4 or later, even if an earlier JDK is the default. o and then edit Info.plist to include the following lines: o JVMVersion 1.3.1 X control-click (right-click?) for macosx doesn't show popup @@ -9443,7 +9517,7 @@ X currently the only fix is to switch to java 1.3 X update the readme to note that macos9 is suspended X why doesn't processing.app work anymore X machine was screwy -X perlin noise 1D. noise() +X perlin noise 1D. noise() X double-check to see if wheel mouse is working X macosx quit handler takes over ctrl-q X so file->quit doesn't get called on close @@ -9475,7 +9549,7 @@ X puts a couple dots on random lines X modify build scripts for rxtx on osx X libs from 2.1.6 download for osx seem to work X write script to handle installation, etc. -X (maybe do this from inside p5?) +X (maybe do this from inside p5?) X get jikes118 in there.. also in cvs o add note to instructions for how to use X change Proce55ing.app to Processing.app @@ -9530,7 +9604,7 @@ dm X write handlers for jikes-style of error messages post-0057c1 -X deal with spaces in user.dir (!) +X deal with spaces in user.dir (!) X affects reference, and prolly compiling too X alt key pressed spews errors about components X prolly because of swing/awt component problems @@ -9562,7 +9636,7 @@ X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs X String wasn't colored, so added parts of java.lang X BFont was allocating too much memory for fonts (found by arielm) X modified all scripts to unpack the new reference -X simage() has been enabled again +X simage() has been enabled again X https://sourceforge.net/tracker/index.php?func=detail&aid=750867&group_id=63445&atid=504000 X image_mode has been ironed out X https://sourceforge.net/tracker/index.php?func=detail&aid=750886&group_id=63445&atid=504000 @@ -9614,7 +9688,7 @@ bf X reported by benelek hb X patch for server makes netEvent messages -moved to sourceforge by arielm +moved to sourceforge by arielm BAGEL / Bugs @@ -9625,7 +9699,7 @@ BAGEL / Bugs b _ image(img, x, y) in CENTER_DIAMETER is actually center radius b _ should make sure that x, y just makes it proper size - b _ simage() is screwy.. + b _ simage() is screwy.. b _ its invocation is broken (image_mode can't be two things at once) b _ doesn't actually use image_mode for placement b _ also doesn't support RGBA @@ -9647,7 +9721,7 @@ BAGEL / Bugs b _ single pixel lines have no alpha and no z b _ fix all the random line types to support alpha - b _ anti-aliasing. smooth(), noSmooth() + b _ anti-aliasing. smooth(), noSmooth() b _ need to verify that this works consistently throughout b _ alpha. fill(r, g, b, a), stroke(r, g, b, a), @@ -9662,7 +9736,7 @@ X use nfs (number format signed), with a bool for + or spc X does a[3] == Float.NaN work? (for testing with splitFloats) X no, if NaN, then comparison will always return false X sort() functions for arrays of ints, floats, doubles, and Strings -X add casey to sourceforge with admin privileges as 'reas' +X add casey to sourceforge with admin privileges as 'reas' X fix wheel mouse handler so that it works under jdk 1.3 X no difference between 1.3 and 1.4 code X add WheelHandler to cvs @@ -9697,7 +9771,7 @@ X image of 256x256 doesn't draw the last line of pixels X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1045697665;start=0 X weird line in showing in the center of an image X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1044901171;start=0 -X color() should work for alpha.. +X color() should work for alpha.. X also #rrggbbaa X http://proce55ing.net/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1049141984 X blend() (or any other 'final' functions) is causing trouble @@ -9720,17 +9794,17 @@ X modelX or objectX could do the amit style thing X creas says object X better access to projX et al X what's a better name? calcX? or write to an array? -X projectX, projectY, .. or projectedX ? +X projectX, projectY, .. or projectedX ? X also projectSize should just be project() X smooth() and noSmooth() X possible dist() and constrain() functions -X reas: I like people making these themselves and then later +X reas: I like people making these themselves and then later X they can be added to their code libraries X join() like split X also add additional item for NaN data X add doubles and longs for genome stuff X numberFormat (formerly zeroPad) -X numberFormat(float num, int left, int right) +X numberFormat(float num, int left, int right) X zero means any number of digits, don't pad X numberFormat(int num, int left) for 27 -> 0027 X camera work @@ -9843,10 +9917,10 @@ X new colors chosen by casey (replace pde.properties and buttons.gif) / works in 'insert' mode X just disabled it ever hiding.. we'll see if it fixes X flush() after every println() -X incremental printout +X incremental printout X uncovered bug with long line lengths in console / pmouseX problem reported by casey (in bugs.txt) -o images don't load during setup [reas] +o images don't load during setup [reas] X //This is not a problem -- Casey X framerate() and framerate(15) X delay() should sleep the thread [glen murphy] @@ -9857,13 +9931,13 @@ X add framerate to colored things list MISC (pruned from crusty todo list) -X text editor? jedit's textarea class? hmm? hmm? // Yeah for jedit! +X text editor? jedit's textarea class? hmm? hmm? // Yeah for jedit! X document imageMode, planeMode, ellipseMode X 'rot' example not working in release 18 X make note in documentation about getting access to pixel array X pixels[] is in ProcessingApplet X build a linux/x86 release -X fix buzz.pl to not create ../../bagel +X fix buzz.pl to not create ../../bagel X how to use ssh identity file to maintain auth for brancusi X write dist.bat for releases X don't forget to update 'export' dir with processing releases @@ -9874,7 +9948,7 @@ X bug in paren balancing X paren problems comes from overusing parens (too many closing) X image[first[i], 0, 0) hitting last paren causes jump to top X beautify is broken // I think this is fixed -X sketch: sketch-000 is dumb +X sketch: sketch-000 is dumb X // Just number successively 0001, 0002 like a digital camera X color won't set for fonts //This works o 'image' is too generic a variable to have inside BApplet @@ -9900,12 +9974,12 @@ X include note in the readme that 1.4 is not supported X is sketch.properties saving properly under macosx? X text in editor is anti-aliased, allow to turn off (franklin_mint) X also make text courier instead of monospaced -public void paint(Graphics g) -{ - Graphics2D g2 = (Graphics2D) g; - g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, - RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); - super.paint(g2); +public void paint(Graphics g) +{ + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + super.paint(g2); } pde @@ -9923,24 +9997,24 @@ X add -Xmx128m -Xms128m because people running out of memory (pitaru) X tried with a 3k x 1k image and things broke o maybe command line read properties from a file in lib -macos9 +macos9 X do some font tweaking (monaco 9 or 10 might be good) 0047 X reported by fdb and brendanberg -After creating about 27 sketches, proce55ing (0046 on OS X) no longer would startup, giving me the following error: -Exception in thread "main" java.lang.NullPointerException - at PdeBase.addSketches(PdeBase.java:598 ) - at PdeBase.addSketches(PdeBase.java:615) - at PdeBase.rebuildSketchbookMenu(PdeBase.java:575) - at PdeBase.(PdeBase.java:362) - at PdeBase.main(PdeBase.java:102) -Removing all sketches would solve the problem. +After creating about 27 sketches, proce55ing (0046 on OS X) no longer would startup, giving me the following error: +Exception in thread "main" java.lang.NullPointerException + at PdeBase.addSketches(PdeBase.java:598 ) + at PdeBase.addSketches(PdeBase.java:615) + at PdeBase.rebuildSketchbookMenu(PdeBase.java:575) + at PdeBase.(PdeBase.java:362) + at PdeBase.main(PdeBase.java:102) +Removing all sketches would solve the problem. / lots of problems in moving sketches over - i managed to run p5 from the applications folder once, but i think when i moved my sketches over from 0044 it broke: "uncaught exception in main method: java.lang.NullPointerException" - i tried reinstalling and running 'java -cp lib:lib/build: ...' and it worked fine (and would open from the icon afterwards) -again, after i moved my sketches over it broke permanently... + i managed to run p5 from the applications folder once, but i think when i moved my sketches over from 0044 it broke: "uncaught exception in main method: java.lang.NullPointerException" + i tried reinstalling and running 'java -cp lib:lib/build: ...' and it worked fine (and would open from the icon afterwards) +again, after i moved my sketches over it broke permanently... / 46 dies when run from desktop on some machines [jes] / spaces in the dir name? o is sketch.properties getting mangled on the mac? @@ -10012,7 +10086,7 @@ X method to set a folder for the sketchbook X when trying to use serial, provide error if things not installed -0046 +0046 X install new swing-based textarea with syntax highlighting X improve the flicker problems (re-enable backing store?) X set better defaults for coloring @@ -10053,20 +10127,20 @@ X preprocessor tweaks X "http://acg.media.mit.edu" doesn't work because of // X "color.jpg" -> "int.jpg" causes trouble X why does this line cause an error? -// String url = "http:\u002f\u002fwww.Proce55ing.net"; +// String url = "http:\u002f\u002fwww.Proce55ing.net"; X it's not in the preprocessor, but kopi seems to be having trouble -X seems that file i/o may be picking up lots of extra \r +X seems that file i/o may be picking up lots of extra \r X perhaps when doing setText, it's goobering things up -X when renaming a sketch, select the text in the field, -X so you can type the new name immediately. +X when renaming a sketch, select the text in the field, +X so you can type the new name immediately. X added 'rename' command X also the default for clicking on the sketch's title o option to rename when doing a 'save as' (remove old files) X remove .class files on save as [dimitre] X remove .jar, .class, and .java files from the 'applet' dir -When I am working in a project and I save it with another name, -all the old files are copyied to new directory, and some of the old -unused .class files and images remains inside new project JAR files. +When I am working in a project and I save it with another name, +all the old files are copyied to new directory, and some of the old +unused .class files and images remains inside new project JAR files. X serial port X better message for PortInUseException (full explanation) X better message for when serial port code not available/not installed @@ -10076,42 +10150,42 @@ X this was previous unknown, but likely several found it (!) X macosx - check to see if swing is working properly X macosx - update build script to work with new layout X Add an Edit menu containing Undo/Redo/Cut/Copy/Paste/Select - All. It's standard Mac behaviour. + All. It's standard Mac behaviour. X long list from frederik (fdb) -X If the cursor is at the last character of the last line of the - text area, moving the cursor up or down using the arrow keys throws - the following exception: - java.lang.ArrayIndexOutOfBoundsException - at PdeEditorListener.keyPressed(PdeEditorListener.java:86) - at java.awt.Component.processKeyEvent(Component.java:3673) +X If the cursor is at the last character of the last line of the + text area, moving the cursor up or down using the arrow keys throws + the following exception: + java.lang.ArrayIndexOutOfBoundsException + at PdeEditorListener.keyPressed(PdeEditorListener.java:86) + at java.awt.Component.processKeyEvent(Component.java:3673) X If the cursor is at the last character of the first line of the text area, moving the cursor up using the arrow keys throws the same - exception. However, moving the cursor down doesn't throw one. + exception. However, moving the cursor down doesn't throw one. X Double-clicking a word doesn't select it, but the character after - it. (however, sometimes the behaviour is correct) + it. (however, sometimes the behaviour is correct) X Scrolling action when using cursor keys is not consistent with other editors: The window should only scroll when it needs to; it now tries - to keep the cursor on the current line. (or one line below it) + to keep the cursor on the current line. (or one line below it) X Using Apple-shift-arrowLeft to select from the cursor pos to the beginning of the line, selects one character too little at the right side. Apple-shift-arrowRight has the same issue (selects one char too - little at the left side). + little at the left side). X Using Apple-shift-arrowDown selects only from the beginning of this line to the end of the following line. It doesn't extend the selection when pressed twice. It also selects the line under the - current line. + current line. X Pressing the tab key moves to the bottom of the text area. X hopefully fixed, but needs to be tested -? Select All (Apple-A) closes the application - (Ctrl-Q) on Azerty-keyboards -X use date in the sketch name sketch_021104 +? Select All (Apple-A) closes the application + (Ctrl-Q) on Azerty-keyboards +X use date in the sketch name sketch_021104 X with a _2 if needed or '021104a' '021104b' etc X when using save as, allow to remove the old (numbered) sketch X better default size than 300x300 when starting up first time X bug report from the site resizing the editor window in Mac OS X leaves the status bar in place. The result is an editor window with a grey bar layered on top, -obscuring the editable text. +obscuring the editable text. X fix default fonts, font size on mac X fix lots of annoying crap about highlighting lines on errors X re-enable console, add synchronized (hrmph) @@ -10154,7 +10228,7 @@ X for now, disallow the / or : characters X there was a bug that required a noop() b/c of jikes or 1.3 problems X is problem w/ beautify that it has no menu event handler? X write event handler, and make sure it doesn't work for external ed -X don't popup offscreen if editor window is way left. +X don't popup offscreen if editor window is way left. X just make sure the x coord > 10 or so (if not presenting) X if so, pop up window 50, 50 from upper left corner X if it still won't fit, center the window on screen @@ -10191,7 +10265,7 @@ X escape on presentation mode--no key events seem to be coming through X make default font size for editor the next size smaller X include names of all people who submitted bugs X use self-extractor and make sure no 8.3 filenames -X use a .dmg to distribute +X use a .dmg to distribute X make sure no DS_Store files are included @@ -10243,7 +10317,7 @@ X remove projects if created but nothing happens to them X maybe do this on open or quit? X first a syntax error, when fixed, causes NullPointerException  X quitting the app makes things all better. argh. -X this just started with version37, it happens extrememely +X this just started with version37, it happens extrememely X frequently and should be easy to reproduce the error X images with imageMode set for simage() weren't working @@ -10267,7 +10341,7 @@ X some method for getting list of serial ports X pde menu item for listing serial ports available o could just println them to the console X import javax.comm stuff as standard in kjc (but not export) -X can't get fonts to load - tested working ok +X can't get fonts to load - tested working ok X bagel complaint: could not load font Univerx76.vlw.gz X why the x? what's going on? X try using serial on macosx @@ -10330,7 +10404,7 @@ X how to make double-clickable version for osx X might be as simple as combined jar with manifest and symlink X jar doesn't like opening pde.properties b/c getClass fails X app title comes up as PdeBase -X -Xdock:name property or +X -Xdock:name property or X com.apple.mrj.application.apple.menu.about.name (gulp) X -XDock:icon (lowercase dock?) to set icon, or X .icns file in the Contents/Resources of the bundle @@ -10340,7 +10414,7 @@ X serial works poorly for starting/stopping applets X appears to be fixed through use of static object in bagel X breaks on every 2nd run when using serial apps (or others?) X try calling gc on stop as well -X make it simpler to build the code.. +X make it simpler to build the code.. X buzz.pl actually no longer needed (no ifdefs) o use a regular makefile for everything X getResource stuff breaks, sketch.properties can't save @@ -10387,7 +10461,7 @@ X tested, seems to be fine? X console - convert tabs to spaces o line wrapping (but save info for resize? noo..) X fix to line numbers being off for KjcEngine exception highlights -X changed error color slightly for console to fit status error +X changed error color slightly for console to fit status error X size() not being called in setup is gonna cause lots of headaches X hack: put exception handler around setup and re-call if necessary X linefeeds were wrong in BApplet @@ -10398,7 +10472,7 @@ X mark each as 'save', 'autosave', 'failed' or 'successful' compile X also include a timestamp X if a selection is made from the menu: X autosave, replace text, mark as edited -X if there have been no edits, and last thing was hist change, +X if there have been no edits, and last thing was hist change, X should *not* do another autosave X ensure this by historyLast being set on change.. heh. nice. X write message to people who signed up for p5 alpha @@ -10419,11 +10493,11 @@ X same under windows, just wasn't being set properly before X header font needed to be set each time as well X introduce pde.properties_OSNAME X tested to make sure it joins with the other pde.properties ok -X setPixel(i, j, #99CC00); +X setPixel(i, j, #99CC00); X not working anymore Syntax error: unexpected token: CC00 -X problem was substitute only worked along with = +X problem was substitute only worked along with = X perl should be ok to be cygwin perl.. try deinstalling activestate -o should fix paren balancing bug.. +o should fix paren balancing bug.. X just disable by default for alpha o background() not working X checked but couldn't duplicate @@ -10449,7 +10523,7 @@ X just removed the listeners on the window.. don't seem to be needed 0035 -X fixed a NullPointerException on startup +X fixed a NullPointerException on startup X when sketch.properties didn't exist, shouldn't print error X fix status standard message color text color X mousePressed() not working, also mouseReleased @@ -10495,7 +10569,7 @@ X in progress working on presentation mode 0032 already finished -X need to update PdeKeyListener for new ui.. +X need to update PdeKeyListener for new ui.. X remove open, add d for duplicate, r for rename, others ? X 'open' button is a switch-to button X pops up list of everything in the sketchbook @@ -10545,7 +10619,7 @@ X make close() work to kill applet in kjc X save window x, y, width, height to pde.properties on exit X stderr in red color X 'data' directory for all media -X make included media part of the .jar file +X make included media part of the .jar file X it's really a pain to use external files in processing X getStream sucks (zach rewrote) X should be able to work for application or applets @@ -10688,7 +10762,7 @@ X font file names are getting mangled on mac (too long) X new set of fonts, make sure the names are ok -0024 +0024 X bug fixes (lighting was broken) @@ -10718,7 +10792,7 @@ o also problem filling on beginShape() triangle stuff X z coordinates are backwards from gl (at least from mazo) X looked into it, this doesn't appear to be the case.. X how did this happen? what's the appropriate way to fix? -X in gl, positive z goes into the screen +X in gl, positive z goes into the screen X may be able to do a scale(0, 0, -1) that doesn't affect dims X then when dims set to 3, will fix the z coords X this will also affect zbuffer ordering @@ -10731,9 +10805,9 @@ X introduce pImage, pFont, pGraphics, pConstants (pSound) 0019 questions answered.. -X is day, month, year overkill inside processingapplet? +X is day, month, year overkill inside processingapplet? X decided no -X loadImage or getImage? +X loadImage or getImage? X loadImage sounds better to ben and casey X circle/square functions X doesn't seem necessary @@ -10756,7 +10830,7 @@ X beginShape() defaults to POLYGON X introduce constants for other poly modes X add ellipseMode(), rectMode() X CENTER_RADIUS, CENTER_DIAMETER, CORNER, TWO_CORNERS -X bezier and catmullrom aren't setting ndim to at least two +X bezier and catmullrom aren't setting ndim to at least two X ?? not sure why they would X translate(x, y) doesn't seem to affect a rect() X flat_rect was being used where ndim was 2, not 0 @@ -10805,7 +10879,7 @@ X switched to ibm java vm 0014 -X fix z coordinate, ndims not being set to 3 +X fix z coordinate, ndims not being set to 3 X put bezierCurve and catmullRomCurve back in X examples - setting background using a full screen image X uses System.arraycopy for speed @@ -10821,14 +10895,14 @@ X may have fixed OutOfMemoryError problems X run.bat had included -ms256m -mx256m -0013 +0013 X ellipse draws in the opposite direction of the origin X actually fix the bug with extends X wasn't included in previous release X option to set full screen background color X uses fullscreen.bgcolor in lib/pde.properties X remove 'colorScale' from the default program in pde -X fix color cube applet +X fix color cube applet X make it run in current version of processing X fix background from showing up black X screenGrab() code (single frame to tif) @@ -10867,14 +10941,14 @@ X got rid of colorscale and using colormode for all instead X make changes in documentation X 'ellipse' instead of 'oval'? X make note in documentation -X catmullrom is broken +X catmullrom is broken X write documentation for new curve functions o make note in docs about removal of LINE from LINES X setting origins X should shapes draw from center or from upper left? X should ovals use radius or diameter? X should shapes use x1, y1 - x2, y2 or x, y, w, h? -X nice to have a random number generator between -1..1 +X nice to have a random number generator between -1..1 X as well as an integer random; instead of just 0..1 X show creas how to get access to cvs X documentation says 'mouseDown' even though it's 'mousePressed' @@ -10894,9 +10968,9 @@ X worked fine for me 0009 X bagel fixes -X beginShape(POINTS) is not working, no marks are appearing +X beginShape(POINTS) is not working, no marks are appearing X this was a pain in the ass to fix -X beginShape(LINE_LOOP) is not looping around +X beginShape(LINE_LOOP) is not looping around X stroked POLYGON should emulate a LINE_LOOP X fill white, stroke black, background white default in bagel X remove duplicates: LINE/LINES etc @@ -10946,7 +11020,7 @@ X or copy bagel's image, and kill that too? 0004 -X put debugging stuff back into Kjc (i disabled some stuff) +X put debugging stuff back into Kjc (i disabled some stuff) 0001 diff --git a/todo.txt b/todo.txt index af19b50213..7e95f657ec 100755 --- a/todo.txt +++ b/todo.txt @@ -1,75 +1,6 @@ -0266 (3.5) -X update to Java 8u192 -o processing-java doesn't handle sketch exceptions by quitting the sketch -X https://github.com/processing/processing/issues/5375 -X this is by design/follows PDE behavior -X fix the link to the FAQ in the menu -X https://github.com/processing/processing/issues/5729 -X update to Java 8u202 -X "Sketch disappeared" infinite pop up dialogs -X https://github.com/processing/processing/pull/4808 -X https://github.com/processing/processing/issues/4805 -X text("test", 10, 10); is still slow with lots of fonts -X https://bugs.openjdk.java.net/browse/JDK-8179209 -X added a note to the Known Issues section in the Changes wiki -X update the about screen to 2019 -o report of a library or tool (probably includes 2.x? 1.x?) breaking things -o NoSuchFieldError: useNativeSelect -X https://github.com/processing/processing/issues/4821 -X closed, no response -X problems with non-US keyboards and some shortcuts -X https://github.com/processing/processing/issues/2199 -X https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings -o Determine new keyboard shortcut for Step Out -X https://github.com/processing/processing/issues/3538 -X all set based on #2199 -X settings() present and pixelDensity() is in setup(), nothing set/no error -X https://github.com/processing/processing/issues/4703 - -cleaning -X Could not initialize class com.sun.jna.Native on startup (Windows) -X https://github.com/processing/processing/issues/4929 -X closed earlier; fixed as best we could -X sharing usage metrics about libraries -X https://github.com/processing/processing/issues/4708 -X Determine shortcut for Export vs Use Selection for Find -X https://github.com/processing/processing/issues/2985 -o swap font smoothing for tab size? -o implement simple table for prefs? -X still requires restart of the software, so problematic -X need docs for translations -X https://github.com/processing/processing/issues/4018 -X setting a bad font/size in preferences.txt causes a crash on startup -X https://github.com/processing/processing/issues/4085 -o https://github.com/processing/processing/pull/4087 -X can't reproduce with current code - -contrib -X Updated russian translation, now can choose russian in preferences -X https://github.com/processing/processing/pull/5619 -X Turkish translation updates -X https://github.com/processing/processing/pull/5636 -X Examples dialog causes high CPU load -X https://github.com/processing/processing/issues/5246 -X https://github.com/processing/processing/pull/5654 -X console hiding button -X https://github.com/processing/processing/pull/5115 -X NullPointerException in Contribution Manager when installing -X https://github.com/processing/processing/issues/5524 -X https://github.com/processing/processing/pull/5742 -X Improvements to appdata.xml for Linux -X https://github.com/processing/processing/pull/5604 - -jakub -X Fix sketch exception getting hidden by warning -X https://github.com/processing/processing/pull/5486 -X https://github.com/processing/processing/issues/5412 -X EventQueue problems with "could not find sketch size" message -X https://github.com/processing/processing/issues/4893 -X https://github.com/processing/processing/pull/5708 -X https://github.com/processing/processing/issues/5030 (duplicate) -X size(0, 0) just freezes instead of showing an error -X https://github.com/processing/processing/issues/5233 (duplicate) +0267 (3.5.1) +_ size() command not working properly +_ https://github.com/processing/processing/issues/5759 3.5.1 From 99804327556c2f5c5b2c95741546f15f442e301f Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 21 Jan 2019 08:59:40 -0500 Subject: [PATCH 066/172] repair size() regression in 3.5 (fixes #5759) --- .../mode/java/preproc/PdePreprocessor.java | 62 ++----------------- 1 file changed, 5 insertions(+), 57 deletions(-) diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java index 81b0008a22..c11b229667 100644 --- a/java/src/processing/mode/java/preproc/PdePreprocessor.java +++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java @@ -208,9 +208,11 @@ public PdePreprocessor(final String sketchName, final int tabSize) { } + /** Parse the sketch size and set the internal sizeInfo variable */ public SurfaceInfo initSketchSize(String code, - boolean sizeWarning) throws SketchException { - return parseSketchSize(code, sizeWarning); + boolean sizeWarning) throws SketchException { + sizeInfo = parseSketchSize(code, sizeWarning); + return sizeInfo; } @@ -422,9 +424,6 @@ static public SurfaceInfo parseSketchSize(String code, } info.width = "displayWidth"; info.height = "displayHeight"; -// if (extraStatements.size() != 0) { -// info.statement += extraStatements.join(" "); -// } info.addStatements(extraStatements); info.checkEmpty(); return info; @@ -434,71 +433,21 @@ static public SurfaceInfo parseSketchSize(String code, // need to pull out the noSmooth() and smooth(N) methods. if (extraStatements.size() != 0) { SurfaceInfo info = new SurfaceInfo(); -// info.statement = extraStatements.join(" "); info.addStatements(extraStatements); return info; } // not an error, just no size() specified - //return new String[] { null, null, null, null, null }; return new SurfaceInfo(); } -/* - static String readSingleQuote(char[] c, int i) { - StringBuilder sb = new StringBuilder(); - try { - sb.append(c[i++]); // add the quote - if (c[i] == '\\') { - sb.append(c[i++]); // add the escape - if (c[i] == 'u') { - // grabs uNNN and the fourth N will be added below - for (int j = 0; j < 4; j++) { - sb.append(c[i++]); - } - } - } - sb.append(c[i++]); // get the char, escapee, or last unicode digit - sb.append(c[i++]); // get the closing quote - - } catch (ArrayIndexOutOfBoundsException ignored) { - // this means they have bigger problems with their code - } - return sb.toString(); - } - - - static String readDoubleQuote(char[] c, int i) { - StringBuilder sb = new StringBuilder(); - try { - sb.append(c[i++]); // add the quote - while (i < c.length) { - if (c[i] == '\\') { - sb.append(c[i++]); // add the escape - sb.append(c[i++]); // add whatever was escaped - } else if (c[i] == '\"') { - sb.append(c[i++]); - break; - } else { - sb.append(c[i++]); - } - } - } catch (ArrayIndexOutOfBoundsException ignored) { - // this means they have bigger problems with their code - } - return sb.toString(); - } -*/ - /** * Parses the code and determines the mode of the sketch. - * * @param code code without comments * @return determined mode */ static public Mode parseMode(CharSequence code) { - // See if we can find any function in the global scope if (findInCurrentScope(FUNCTION_DECL, code) != null) { return Mode.ACTIVE; @@ -1230,8 +1179,7 @@ protected void writeFooter(PrintWriter out, String className) { if ((mode == Mode.STATIC) || (mode == Mode.ACTIVE)) { // doesn't remove the original size() method, // but calling size() again in setup() is harmless. - if (!hasMethod("settings") && - sizeInfo != null && sizeInfo.hasSettings()) { + if (!hasMethod("settings") && sizeInfo.hasSettings()) { out.println(indent + "public void settings() { " + sizeInfo.getSettings() + " }"); } From 4b46f0e05dc3075ac70fd0a54bc44f0d70640337 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 21 Jan 2019 09:07:09 -0500 Subject: [PATCH 067/172] write release notes --- build/shared/revisions.txt | 16 ++++++++++++++++ todo.txt | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 7fe0fe13e9..e0b80d084f 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,3 +1,19 @@ +PROCESSING 3.5.1 (REV 0267) - 21 January 2019 + +Should have known better than to try to fix a bug connnected to +something as fundamental as the size() command. This release just +fixes one major regression in 3.5. + + +[ oops, sorry ] + ++ size() command not working properly + https://github.com/processing/processing/issues/5759 + + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + PROCESSING 3.5 (REV 0266) - 20 January 2019 Hello from the flight back from Processing Community Day 2019 in LA! diff --git a/todo.txt b/todo.txt index 7e95f657ec..0856a9168a 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,6 @@ 0267 (3.5.1) -_ size() command not working properly -_ https://github.com/processing/processing/issues/5759 +X size() command not working properly +X https://github.com/processing/processing/issues/5759 3.5.1 From 945e4aa5b4846b16d1da82963eb4f1d714277c3b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 21 Jan 2019 09:18:54 -0500 Subject: [PATCH 068/172] add a link to the previous release notes --- build/shared/revisions.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index e0b80d084f..d34789a9f9 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -4,6 +4,9 @@ Should have known better than to try to fix a bug connnected to something as fundamental as the size() command. This release just fixes one major regression in 3.5. +Please see the release notes for 3.5 for the major changes since 3.4: +https://github.com/processing/processing/releases/tag/processing-0266-3.5 + [ oops, sorry ] From 48b692fd804278ae8b6d21e429882e38b53b47ea Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jan 2019 10:49:35 -0500 Subject: [PATCH 069/172] starting 3.5.2 --- app/src/processing/app/Base.java | 4 ++-- core/done.txt | 4 ++++ core/todo.txt | 2 +- done.txt | 5 +++++ todo.txt | 7 +++---- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 919440f4dc..0ddd739d88 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -56,9 +56,9 @@ public class Base { // Added accessors for 0218 because the UpdateCheck class was not properly // updating the values, due to javac inlining the static final values. - static private final int REVISION = 267; + static private final int REVISION = 268; /** This might be replaced by main() if there's a lib/version.txt file. */ - static private String VERSION_NAME = "0267"; //$NON-NLS-1$ + static private String VERSION_NAME = "0268"; //$NON-NLS-1$ /** Set true if this a proper release rather than a numbered revision. */ /** diff --git a/core/done.txt b/core/done.txt index e616f82f31..d32cba1ca2 100644 --- a/core/done.txt +++ b/core/done.txt @@ -1,3 +1,7 @@ +0267 (3.5.1) +X no changes to core in this release + + 0266 (3.5) X fix javaPlatform variable for newer JDK versions X https://github.com/processing/processing/pull/5626 diff --git a/core/todo.txt b/core/todo.txt index e7dafe49df..40d73ea724 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,4 +1,4 @@ -0267 (3.5.1) +0268 (3.5.2) high-ish diff --git a/done.txt b/done.txt index 5d17fd8452..435cbd1028 100644 --- a/done.txt +++ b/done.txt @@ -1,3 +1,8 @@ +0267 (3.5.1) +X size() command not working properly +X https://github.com/processing/processing/issues/5759 + + 0266 (3.5) X update to Java 8u192 o processing-java doesn't handle sketch exceptions by quitting the sketch diff --git a/todo.txt b/todo.txt index 0856a9168a..eed92ada52 100755 --- a/todo.txt +++ b/todo.txt @@ -1,9 +1,8 @@ -0267 (3.5.1) -X size() command not working properly -X https://github.com/processing/processing/issues/5759 +0268 (3.5.2) +_ shortcuts not working on Windows/Linux (using meta) +_ https://github.com/processing/processing/issues/5763 -3.5.1 _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 From 4923432997c042f9fd1cfa5d94be07ea79d8bfd0 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jan 2019 17:04:11 -0500 Subject: [PATCH 070/172] change handling of keystroke entries to be per-platform --- build/shared/lib/languages/PDE.properties | 36 +++++++++++++------ build/shared/lib/languages/PDE_ar.properties | 6 ++-- build/shared/lib/languages/PDE_de.properties | 4 +-- build/shared/lib/languages/PDE_el.properties | 16 ++++----- build/shared/lib/languages/PDE_es.properties | 22 ++++++------ build/shared/lib/languages/PDE_fr.properties | 4 +-- build/shared/lib/languages/PDE_it.properties | 4 +-- build/shared/lib/languages/PDE_ja.properties | 4 +-- build/shared/lib/languages/PDE_ko.properties | 38 ++++++++++---------- build/shared/lib/languages/PDE_nl.properties | 4 +-- build/shared/lib/languages/PDE_pt.properties | 4 +-- build/shared/lib/languages/PDE_ru.properties | 10 +++--- build/shared/lib/languages/PDE_tr.properties | 4 +-- build/shared/lib/languages/PDE_uk.properties | 4 +-- build/shared/lib/languages/PDE_zh.properties | 4 +-- 15 files changed, 90 insertions(+), 74 deletions(-) diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index 1a42b0a809..fe575d7807 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -40,11 +40,17 @@ menu.edit.paste = Paste menu.edit.select_all = Select All menu.edit.auto_format = Auto Format menu.edit.comment_uncomment = Comment/Uncomment -menu.edit.comment_uncomment.keystroke = meta pressed SLASH -menu.edit.increase_indent = Increase Indent -menu.edit.increase_indent.keystroke = meta pressed CLOSE_BRACKET -menu.edit.decrease_indent = Decrease Indent -menu.edit.decrease_indent.keystroke = meta pressed OPEN_BRACKET +menu.edit.comment_uncomment.keystroke.macosx = meta pressed SLASH +menu.edit.comment_uncomment.keystroke.windows = ctrl pressed SLASH +menu.edit.comment_uncomment.keystroke.linux = ctrl pressed SLASH +menu.edit.increase_indent = → Increase Indent +menu.edit.increase_indent.keystroke.macosx = meta pressed CLOSE_BRACKET +menu.edit.increase_indent.keystroke.windows = ctrl pressed CLOSE_BRACKET +menu.edit.increase_indent.keystroke.linux = ctrl pressed CLOSE_BRACKET +menu.edit.decrease_indent = ← Decrease Indent +menu.edit.decrease_indent.keystroke.macosx = meta pressed OPEN_BRACKET +menu.edit.decrease_indent.keystroke.windows = ctrl pressed OPEN_BRACKET +menu.edit.decrease_indent.keystroke.linux = ctrl pressed OPEN_BRACKET menu.edit.find = Find... menu.edit.find_next = Find Next menu.edit.find_previous = Find Previous @@ -80,11 +86,17 @@ menu.debug.toggle_breakpoint = Toggle Breakpoint # --- # used for both menus and toolbars menu.debug.step = Step -menu.debug.step.keystroke = meta pressed J +menu.debug.step.keystroke.macosx = meta pressed J +menu.debug.step.keystroke.windows = ctrl pressed J +menu.debug.step.keystroke.linux = ctrl pressed J menu.debug.step_into = Step Into -menu.debug.step_into.keystroke = shift meta pressed J +menu.debug.step_into.keystroke.macosx = shift meta pressed J +menu.debug.step_into.keystroke.windows = shift ctrl pressed J +menu.debug.step_into.keystroke.linux = shift ctrl pressed J menu.debug.step_out = Step Out -menu.debug.step_out.keystroke = meta alt pressed J +menu.debug.step_out.keystroke.macosx = meta alt pressed J +menu.debug.step_out.keystroke.windows = ctrl alt pressed J +menu.debug.step_out.keystroke.linux = ctrl alt pressed J menu.debug.continue = Continue # --- #menu.debug.print_stack_trace = Print Stack Trace @@ -315,9 +327,13 @@ editor.header.new_tab = New Tab editor.header.rename = Rename editor.header.delete = Delete editor.header.previous_tab = Previous Tab -editor.header.previous_tab.keystroke = meta alt pressed LEFT +editor.header.previous_tab.keystroke.macosx = meta alt pressed LEFT +editor.header.previous_tab.keystroke.windows = ctrl alt pressed LEFT +editor.header.previous_tab.keystroke.linux = ctrl pressed PAGE_UP editor.header.next_tab = Next Tab -editor.header.next_tab.keystroke = meta alt pressed RIGHT +editor.header.next_tab.keystroke.macosx = meta alt pressed RIGHT +editor.header.next_tab.keystroke.windows = ctrl alt pressed RIGHT +editor.header.next_tab.keystroke.linux = ctrl pressed PAGE_DOWN editor.header.delete.warning.title = Yeah, no. editor.header.delete.warning.text = You cannot delete the main tab of the only open sketch. diff --git a/build/shared/lib/languages/PDE_ar.properties b/build/shared/lib/languages/PDE_ar.properties index 8f69b0b4cf..008f027517 100644 --- a/build/shared/lib/languages/PDE_ar.properties +++ b/build/shared/lib/languages/PDE_ar.properties @@ -40,8 +40,8 @@ menu.edit.paste = لصق menu.edit.select_all = تحديد الكل menu.edit.auto_format = فرمتة تلقائية menu.edit.comment_uncomment = تعليق/إلغاء التعليق -menu.edit.increase_indent = زيادة المسافة البادئة -menu.edit.decrease_indent = انقاص المسافة البادئة +menu.edit.increase_indent = زيادة المسافة البادئة → +menu.edit.decrease_indent = انقاص المسافة البادئة ← menu.edit.find = بحث... menu.edit.find_next = النتيجة التالية menu.edit.find_previous = النتيجة السابقة @@ -478,7 +478,7 @@ contrib.errors.description_unavailable = لا يوجد وصف. contrib.errors.malformed_url = الرابط الذي تم تحميله من Processing.org لا يعمل. \nبإمكانك تثبيت المكتبة بشكل يدوي عن طريق زيارة موقع المكتبة الإلكتروني. contrib.errors.needs_repackage = يجب إعادة حزم %s وفقاً لشروط %s. contrib.errors.no_contribution_found = تعذر العثور على %s في الملف المحمل. -contrib.errors.overwriting_properties = .properties حصل خلل خلال استبدال محتوى ملف +contrib.errors.overwriting_properties = .properties حصل خلل خلال استبدال محتوى ملف contrib.errors.install_failed = فشل التثبيت. contrib.errors.update_on_restart_failed = فشل تحديث %s بعد إعادة التشغيل. contrib.errors.temporary_directory = فشلت الكتابة في الملف المؤقت. diff --git a/build/shared/lib/languages/PDE_de.properties b/build/shared/lib/languages/PDE_de.properties index a7ed37b494..21d057439e 100644 --- a/build/shared/lib/languages/PDE_de.properties +++ b/build/shared/lib/languages/PDE_de.properties @@ -40,8 +40,8 @@ menu.edit.paste = Einfügen menu.edit.select_all = Alle auswählen menu.edit.auto_format = Autoformatierung menu.edit.comment_uncomment = Ein- und Auskommentieren -menu.edit.increase_indent = Ausrücken -menu.edit.decrease_indent = Einrücken +menu.edit.increase_indent = → Ausrücken +menu.edit.decrease_indent = ← Einrücken menu.edit.find = Suchen ... menu.edit.find_next = Weiter suchen menu.edit.find_previous = Vorher suchen diff --git a/build/shared/lib/languages/PDE_el.properties b/build/shared/lib/languages/PDE_el.properties index dbdefe7b93..07c348ab2e 100644 --- a/build/shared/lib/languages/PDE_el.properties +++ b/build/shared/lib/languages/PDE_el.properties @@ -40,8 +40,8 @@ menu.edit.paste = Επικόλληση menu.edit.select_all = Επιλογή Όλων menu.edit.auto_format = Αυτόματη Μορφοποίηση menu.edit.comment_uncomment = Σχολιασμός/Αποσχολιασμός -menu.edit.increase_indent = Αύξηση Εσοχής -menu.edit.decrease_indent = Μείωση Εσοχής +menu.edit.increase_indent = → Αύξηση Εσοχής +menu.edit.decrease_indent = ← Μείωση Εσοχής menu.edit.find = Αναζήτηση... menu.edit.find_next = Αναζήτηση Επόμενου menu.edit.find_previous = Αναζήτηση Προηγούμενου @@ -215,7 +215,7 @@ export.tooltip.macosx = Η εξαγωγή Mac OS X είναι διαθέσιμη export.full_screen = Πλήρης Οθόνη export.embed_java = Ενσωματωμένη Java export.embed_java.for = Ενσωματωμένη Java για -export.code_signing = Υπογραφή Κώδικα +export.code_signing = Υπογραφή Κώδικα # Find (Frame) find = Αναζήτηση @@ -373,14 +373,14 @@ editor.footer.console = Κονσόλα # New handler new.messages.is_read_only = Το Σχέδιο είναι Μόνο για Ανάγνωση -new.messages.is_read_only.description = Μερικά αρχεία είναι σημειωμένα "Μόνο για Ανάγνωση", οπότε θα χρειαστεί να ξανα-αποθηκεύσεις το Σχέδιο σε διαφορετική θέση,\nκαι να προσπαθήσεις ξανά. +new.messages.is_read_only.description = Μερικά αρχεία είναι σημειωμένα "Μόνο για Ανάγνωση", οπότε θα χρειαστεί να ξανα-αποθηκεύσεις το Σχέδιο σε διαφορετική θέση,\nκαι να προσπαθήσεις ξανά. # Rename handler rename.messages.is_untitled = Το Σχέδιο Δεν έχει Τίτλο rename.messages.is_untitled.description = Τι θα έλεγες να αποθηκεύσεις το Σχέδιο\nπριν προσπαθήσεις να το μετονομάσεις; rename.messages.is_modified = Παρακαλώ αποθήκευσε το Σχέδιο πριν το μετονομάσεις. -rename.messages.is_read_only = Το Σχέδιο είναι Μόνο για Ανάγνωση -rename.messages.is_read_only.description = Μερικά αρχεία είναι σημειωμένα "Μόνο για Ανάγνωση", οπότε θα χρειαστεί να ξανα-αποθηκεύσεις το Σχέδιο σε διαφορετική θέση,\nκαι να προσπαθήσεις ξανά. +rename.messages.is_read_only = Το Σχέδιο είναι Μόνο για Ανάγνωση +rename.messages.is_read_only.description = Μερικά αρχεία είναι σημειωμένα "Μόνο για Ανάγνωση", οπότε θα χρειαστεί να ξανα-αποθηκεύσεις το Σχέδιο σε διαφορετική θέση,\nκαι να προσπαθήσεις ξανά. # Delete handler delete.messages.cannot_delete = Αποτυχία Διαγραφής @@ -409,7 +409,7 @@ contrib.show_only_compatible.library = Εμφάνιση Μόνο Συμβατώ contrib.show_only_compatible.examples = Εμφάνιση Μόνο Συμβατών Παραδειγμάτων contrib.show_only_compatible.update = Εμφάνιση Μόνο Συμβατών Ενημερώσεων contrib.restart = Επανεκκίνηση Processing -contrib.unsaved_changes = Βρέθηκαν μη αποθηκευμένες ενημερώσεις +contrib.unsaved_changes = Βρέθηκαν μη αποθηκευμένες ενημερώσεις contrib.unsaved_changes.prompt = Είσαι σίγουρος ότι θέλεις να κάνεις επανεκκίνηση της Processing χωρίς να αποθηκεύσεις τις αλλαγές; contrib.messages.remove_restart = Παρακαλώ κάνε επανεκκίνηση της Processing για να ολοκληρωθεί η αφαίρεση αυτού του αντικειμένου. contrib.messages.install_restart = Παρακαλώ κάνε επανεκκίνηση της Processing για να ολοκληρωθεί η εγκατάσταση αυτού του αντικειμένου. @@ -445,7 +445,7 @@ contrib.category.animation = Animation contrib.category.data = Δεδομένα contrib.category.geometry = Γεωμετρία contrib.category.gui = GUI -contrib.category.hardware = Υλικό +contrib.category.hardware = Υλικό contrib.category.i_o = Ε/Ε contrib.category.math = Μαθηματικά contrib.category.simulation = Προσομοίωση diff --git a/build/shared/lib/languages/PDE_es.properties b/build/shared/lib/languages/PDE_es.properties index 1d99dabaf1..8752a1bd0f 100644 --- a/build/shared/lib/languages/PDE_es.properties +++ b/build/shared/lib/languages/PDE_es.properties @@ -40,8 +40,8 @@ menu.edit.paste = Pegar menu.edit.select_all = Seleccionar todo menu.edit.auto_format = Autoformato menu.edit.comment_uncomment = Comentar/Descomentar -menu.edit.increase_indent = Aumentar indentación -menu.edit.decrease_indent = Reducir indentación +menu.edit.increase_indent = → Aumentar indentación +menu.edit.decrease_indent = ← Reducir indentación menu.edit.find = Buscar... menu.edit.find_next = Buscar siguiente menu.edit.find_previous = Buscar anterior @@ -406,10 +406,10 @@ name.messages.invalid_extension.description = ".%s" no es una extensión válida name.messages.main_java_extension.description = La primera pestaña no puede ser un archivo .%s.\n(Puede que sea tiempo de graduarse\na un entorno de programación "real") name.messages.new_sketch_exists = No name.messages.new_sketch_exists.description = Un archivo llamado "%s" ya existe en\n"%s" -name.messages.new_folder_exists = No se puede cambiar de nombre +name.messages.new_folder_exists = No se puede cambiar de nombre name.messages.new_folder_exists.description = Un sketch (o directorio) con nombre "%s" ya existe. name.messages.error = Error -name.messages.no_rename_folder.description = No se pudo renombrar el directorio del sketch. +name.messages.no_rename_folder.description = No se pudo renombrar el directorio del sketch. name.messages.no_rename_file.description = No se pudo renombrar "%s" a "%s" name.messages.no_create_file.description = No se pudo crear el archivo "%s"\nen "%s" @@ -435,7 +435,7 @@ save_file.messages.recursive_save.description = No puedes guardar un sketch en u add_file.messages.is_read_only = El sketch es de sólo-lectura add_file.messages.is_read_only.description = Algunos archivos están marcados como de sólo-lectura, por\nlo que vas a tener que guardar el sketch en otra ubicación,\ne intentar de nuevo. add_file.messages.confirm_replace = ¿Reemplzara la versión existente de %s? -add_file.messages.error_adding = Error al añadir el archivo +add_file.messages.error_adding = Error al añadir el archivo add_file.messages.cannot_delete.description = No se pudo eliminar el archivo existente '%s'. add_file.messages.cannot_add.description = No se pudo añadir '%s' al sketch. add_file.messages.same_file = No puedes engañarme @@ -505,17 +505,17 @@ contrib.unsupported_operating_system = Tu sistema operativo no está soportado. contrib.category.3d = 3D contrib.category.animation = Animación contrib.category.data = Datos -contrib.category.geometry = Geometría +contrib.category.geometry = Geometría contrib.category.gui = Interfaz gráfica -contrib.category.hardware = Hardware +contrib.category.hardware = Hardware contrib.category.i_o = Entrada/Salida contrib.category.math = Matemáticas contrib.category.simulation = Simulación -contrib.category.sound = Sonido -contrib.category.typography = Tipografía -contrib.category.utilities = Utilidades +contrib.category.sound = Sonido +contrib.category.typography = Tipografía +contrib.category.utilities = Utilidades contrib.category.video_vision = Visión de video -contrib.category.other = Otros +contrib.category.other = Otros # Install on Startup contrib.startup.errors.download_install = Ocurrió un error al descargar e instalar %s diff --git a/build/shared/lib/languages/PDE_fr.properties b/build/shared/lib/languages/PDE_fr.properties index e09a33e075..37209e9991 100644 --- a/build/shared/lib/languages/PDE_fr.properties +++ b/build/shared/lib/languages/PDE_fr.properties @@ -40,8 +40,8 @@ menu.edit.paste = Coller menu.edit.select_all = Selectionner tout menu.edit.auto_format = Mise en forme automatique menu.edit.comment_uncomment = Commenter/Décommenter -menu.edit.increase_indent = Augmenter l'indentation -menu.edit.decrease_indent = Diminuer l'indentation +menu.edit.increase_indent = → Augmenter l'indentation +menu.edit.decrease_indent = ← Diminuer l'indentation menu.edit.find = Rechercher... menu.edit.find_next = Rechercher suivant menu.edit.find_previous = Rechercher précédent diff --git a/build/shared/lib/languages/PDE_it.properties b/build/shared/lib/languages/PDE_it.properties index 8c8f32898f..4a1334e82d 100644 --- a/build/shared/lib/languages/PDE_it.properties +++ b/build/shared/lib/languages/PDE_it.properties @@ -40,8 +40,8 @@ menu.edit.paste = Incolla menu.edit.select_all = Seleziona Tutto menu.edit.auto_format = Formattazione Automatica menu.edit.comment_uncomment = Commenta/Rimuovi commento -menu.edit.increase_indent = Aumenta Indentazione -menu.edit.decrease_indent = Diminuisci Indentazione +menu.edit.increase_indent = → Aumenta Indentazione +menu.edit.decrease_indent = ← Diminuisci Indentazione menu.edit.find = Trova... menu.edit.find_next = Trova Successivo menu.edit.find_previous = Trova Puccessivo diff --git a/build/shared/lib/languages/PDE_ja.properties b/build/shared/lib/languages/PDE_ja.properties index 87c79ed526..f0bc510298 100644 --- a/build/shared/lib/languages/PDE_ja.properties +++ b/build/shared/lib/languages/PDE_ja.properties @@ -40,8 +40,8 @@ menu.edit.paste = 貼り付け menu.edit.select_all = すべて選択 menu.edit.auto_format = 自動フォーマット menu.edit.comment_uncomment = コメント/アンコメント -menu.edit.increase_indent = インデントを増やす -menu.edit.decrease_indent = インデントを減らす +menu.edit.increase_indent = → インデントを増やす +menu.edit.decrease_indent = ← インデントを減らす menu.edit.find = 検索... menu.edit.find_next = 次を探す menu.edit.find_previous = 前を探す diff --git a/build/shared/lib/languages/PDE_ko.properties b/build/shared/lib/languages/PDE_ko.properties index 9043303ec4..e60e088be7 100644 --- a/build/shared/lib/languages/PDE_ko.properties +++ b/build/shared/lib/languages/PDE_ko.properties @@ -15,7 +15,7 @@ menu.file.new = 새 스케치 menu.file.open = 열기... menu.file.recent = 최근 스케치 menu.file.sketchbook = 스케치북 -menu.file.sketchbook.empty = 빈 스케치북 +menu.file.sketchbook.empty = 빈 스케치북 menu.file.examples = 예제... menu.file.close = 닫기 menu.file.save = 저장 @@ -38,8 +38,8 @@ menu.edit.paste = 붙이기 menu.edit.select_all = 전체선택 menu.edit.auto_format = 자동 정렬 menu.edit.comment_uncomment = 주석 처리/해제 -menu.edit.increase_indent = 들여쓰기 -menu.edit.decrease_indent = 내어쓰기 +menu.edit.increase_indent = → 들여쓰기 +menu.edit.decrease_indent = ← 내어쓰기 menu.edit.find = 찾기... menu.edit.find_next = 다음 찾기 menu.edit.find_previous = 이전 찾기 @@ -49,8 +49,8 @@ menu.edit.use_selection_for_find = 선택영역으로 찾기 # | Sketch | menu.sketch.run = 실행하기 menu.sketch.present = 전체화면 보기 -menu.sketch.tweak = 변수 조정하기 -menu.sketch.stop = 정지하기 +menu.sketch.tweak = 변수 조정하기 +menu.sketch.stop = 정지하기 # --- menu.library = 내부 라이브러리... menu.library.add_library = 라이브러리 추가하기... @@ -127,7 +127,7 @@ preferences.requires_restart = 프로세싱 재실행 시 적용 preferences.sketchbook_location = 스케치 폴더 위치 preferences.sketchbook_location.popup = 스케치 폴더 위치 preferences.language = 언어 -preferences.editor_and_console_font = 스케치 에디터와 콘솔 글꼴 선택 +preferences.editor_and_console_font = 스케치 에디터와 콘솔 글꼴 선택 preferences.editor_and_console_font.tip = \ 에디터와 콘솔에서 사용할 폰트 선택하기.
\ Monospaced (fixed-width) 폰트만 리스트에 나타나며,
\ @@ -153,7 +153,7 @@ preferences.check_for_updates_on_startup = 프로그램 시작 시 버전 업데 preferences.run_sketches_on_display = 실행 시 스케치창 디스플레이의 장치 설정 preferences.run_sketches_on_display.tip = \ 멀티스크린 사용 시 실행된 스케치 창을 보여줄 스크린 선택하기.
\ -일반적으로, 스케치 창을 커서로 드래그하여 이동하면 재 실행 시에는 해당 스크린에서 실행되지만
\ +일반적으로, 스케치 창을 커서로 드래그하여 이동하면 재 실행 시에는 해당 스크린에서 실행되지만
\ 전체화면 모드로 실행하는 경우에 설정된 스크린에서만 실행됩니다. preferences.automatically_associate_pde_files = .pde 파일 실행 시 프로세싱으로 자동 연결 preferences.launch_programs_in = 프로그램 실행 @@ -237,13 +237,13 @@ editor.header.delete.warning.title = Yeah, no. editor.header.delete.warning.text = 스케치의 마지막 탭은 삭제할 수 없습니다. # Tabs -editor.tab.new = 새 탭 이름 -editor.tab.new.description = 파일의 새 탭 이름 -editor.tab.rename = 새 탭 이름 -editor.tab.rename.description = 파일의 새 탭 이름 +editor.tab.new = 새 탭 이름 +editor.tab.new.description = 파일의 새 탭 이름 +editor.tab.rename = 새 탭 이름 +editor.tab.rename.description = 파일의 새 탭 이름 # Sketch -editor.sketch.rename.description = 새 스케치 이름 +editor.sketch.rename.description = 새 스케치 이름 editor.status.autoformat.no_changes = 변경할 서식이 없습니다. editor.status.autoformat.finished = 자동 서식 적용 완료 @@ -264,10 +264,10 @@ editor.status.printing.canceled = 인쇄 취소. # --------------------------------------- # Contribution Panel -contrib = 컨트리뷰션 매니저 +contrib = 컨트리뷰션 매니저 contrib.category = 카테고리: contrib.filter_your_search = 검색 필터... -contrib.restart = 프로세싱 다시 시작하기 +contrib.restart = 프로세싱 다시 시작하기 contrib.unsaved_changes = 저장되지 않은 변경 사항이 발견되었습니다. contrib.unsaved_changes.prompt = 정말 변경 사항을 저장하지 않고 프로세싱을 다시 시작하시겠습니까? contrib.messages.remove_restart = 해당 아이템이 완전히 삭제된 후 프로세싱을 다시 시작해 주세요. @@ -282,13 +282,13 @@ contrib.errors.needs_repackage = %s 라이브러리는 해당 프로세싱 버 contrib.errors.no_contribution_found = %s 파일을 다운로드 경로에서 찾을 수 없습니다. contrib.errors.overwriting_properties = .properties 파일 덮어쓰기에 실패하였습니다. contrib.errors.install_failed = 설치 오류 발생. -contrib.errors.update_on_restart_failed = %s 파일은 알 수 없는 오류로 재실행 후에도 사용할 수 없습니다. +contrib.errors.update_on_restart_failed = %s 파일은 알 수 없는 오류로 재실행 후에도 사용할 수 없습니다. contrib.errors.temporary_directory = 임시 디렉터리에 업데이트할 수 없습니다. contrib.all = All contrib.undo = 입력 취소 contrib.remove = 삭제 contrib.install = 설치 -contrib.progress.installing = 설치 중 +contrib.progress.installing = 설치 중 contrib.progress.starting = 시작 중 contrib.progress.downloading = 다운로드 중 contrib.download_error = 해당 파일 다운로드 중 에러 발생하였습니다. @@ -297,18 +297,18 @@ contrib.unsupported_operating_system = 해당 파일 해당 컴퓨터의 운영 # --------------------------------------- # Warnings -warn.delete = 삭제 +warn.delete = 삭제 warn.delete.sketch = 정말 해당 스케치를 삭제하시겠습니까? warn.delete.file = 정말 "%s"를 삭제하시겠습니까? # --------------------------------------- # Update Check -update_check = 업데이트 +update_check = 업데이트 update_check.updates_available.core = 새 버전의 프로세싱 설치가 가능합니다. \n해당 다운로드 페이지로 지금 이동하시겠습니까? update_check.updates_available.contributions = 설치된 컨트리뷰션(도구, 라이브러리, 모드, 예제) 중 일부가 업데이트되었습니다,\n 컨트리뷰션 매니저로 이동하여 확인하시겠습니까? # --------------------------------------- # Color Chooser -color_chooser = 색상 선택 \ No newline at end of file +color_chooser = 색상 선택 \ No newline at end of file diff --git a/build/shared/lib/languages/PDE_nl.properties b/build/shared/lib/languages/PDE_nl.properties index fb2634241a..ee753069f1 100644 --- a/build/shared/lib/languages/PDE_nl.properties +++ b/build/shared/lib/languages/PDE_nl.properties @@ -38,8 +38,8 @@ menu.edit.paste = Plakken menu.edit.select_all = Alles Selecteren menu.edit.auto_format = Automatische Opmaak menu.edit.comment_uncomment = Commentaar Aan/Uit -menu.edit.increase_indent = Inspringen Vergroten -menu.edit.decrease_indent = Inspringen Verkleinen +menu.edit.increase_indent = → Inspringen Vergroten +menu.edit.decrease_indent = ← Inspringen Verkleinen menu.edit.find = Zoeken... menu.edit.find_next = Volgende Zoeken menu.edit.find_previous = Vorige Zoeken diff --git a/build/shared/lib/languages/PDE_pt.properties b/build/shared/lib/languages/PDE_pt.properties index 7842a71830..fbf823c3b3 100644 --- a/build/shared/lib/languages/PDE_pt.properties +++ b/build/shared/lib/languages/PDE_pt.properties @@ -37,8 +37,8 @@ menu.edit.paste = Colar menu.edit.select_all = Seleccionar Tudo menu.edit.auto_format = Auto Formatar menu.edit.comment_uncomment = Comentar/Descomentar -menu.edit.increase_indent = Aumentar Indentação -menu.edit.decrease_indent = Diminuir Indentação +menu.edit.increase_indent = → Aumentar Indentação +menu.edit.decrease_indent = ← Diminuir Indentação menu.edit.find = Procurar... menu.edit.find_next = Procurar Seguinte menu.edit.find_previous = Procurar Anterior diff --git a/build/shared/lib/languages/PDE_ru.properties b/build/shared/lib/languages/PDE_ru.properties index 1c8c0f80df..554912f405 100644 --- a/build/shared/lib/languages/PDE_ru.properties +++ b/build/shared/lib/languages/PDE_ru.properties @@ -40,8 +40,8 @@ menu.edit.paste = Вставить menu.edit.select_all = Выделить всё menu.edit.auto_format = Автоформатирование menu.edit.comment_uncomment = Закомментировать/Раскомментировать -menu.edit.increase_indent = Увеличить отступ -menu.edit.decrease_indent = Уменьшить отступ +menu.edit.increase_indent = → Увеличить отступ +menu.edit.decrease_indent = ← Уменьшить отступ menu.edit.find = Найти... menu.edit.find_next = Найти следущее menu.edit.find_previous = Найти предыдущее @@ -77,7 +77,7 @@ menu.debug.toggle_breakpoint = Поставить/снять точку оста # --- # used for both menus and toolbars menu.debug.step = Шаг -menu.debug.step_into = Зайти в +menu.debug.step_into = Зайти в menu.debug.step_out = Выйти из menu.debug.continue = Продолжить # --- @@ -187,7 +187,7 @@ preferences.run_sketches_on_display.tip = Задаёт монитор, на ко preferences.automatically_associate_pde_files = Автоматически ассоциировать файлы .pde с Processing preferences.launch_programs_in = Запускать программы в preferences.launch_programs_in.mode = Режим -preferences.file = В файле настроек можно найти больше параметров для настройки +preferences.file = В файле настроек можно найти больше параметров для настройки preferences.file.hint = не редактируйте его при запущенном Processing # Sketchbook Location (Frame) @@ -245,7 +245,7 @@ find.btn.find = Найти find_in_reference = Найти в документации # File (Frame) -file = Выбрать +file = Выбрать # Create Font (Frame) create_font = Создать шрифт diff --git a/build/shared/lib/languages/PDE_tr.properties b/build/shared/lib/languages/PDE_tr.properties index da1754517d..8773b8860a 100644 --- a/build/shared/lib/languages/PDE_tr.properties +++ b/build/shared/lib/languages/PDE_tr.properties @@ -38,8 +38,8 @@ menu.edit.paste = Yapıştır menu.edit.select_all = Tümünü Seç menu.edit.auto_format = Otomatik Biçimlendir menu.edit.comment_uncomment = Yorumla/Yorumu Kaldır -menu.edit.increase_indent = Girintiyi Artır -menu.edit.decrease_indent = Girintiyi Azalt +menu.edit.increase_indent = → Girintiyi Artır +menu.edit.decrease_indent = ← Girintiyi Azalt menu.edit.find = Bul.. menu.edit.find_next = Sonrakini Bul menu.edit.find_previous = Öncekini Bul diff --git a/build/shared/lib/languages/PDE_uk.properties b/build/shared/lib/languages/PDE_uk.properties index 8ed7188b64..8a34b5a39f 100644 --- a/build/shared/lib/languages/PDE_uk.properties +++ b/build/shared/lib/languages/PDE_uk.properties @@ -40,8 +40,8 @@ menu.edit.paste = Вставити menu.edit.select_all = Виділити все menu.edit.auto_format = Автоформатування menu.edit.comment_uncomment = Коментувати/Розкоментувати -menu.edit.increase_indent = Збільшити відступ -menu.edit.decrease_indent = Зменшити відступ +menu.edit.increase_indent = → Збільшити відступ +menu.edit.decrease_indent = ← Зменшити відступ menu.edit.find = Знайти... menu.edit.find_next = Знайти наступне menu.edit.find_previous = Знайти попереднє diff --git a/build/shared/lib/languages/PDE_zh.properties b/build/shared/lib/languages/PDE_zh.properties index 6c2223bfa9..8cf6da2166 100644 --- a/build/shared/lib/languages/PDE_zh.properties +++ b/build/shared/lib/languages/PDE_zh.properties @@ -37,8 +37,8 @@ menu.edit.paste = 黏贴 menu.edit.select_all = 全部选择 menu.edit.auto_format = 自动对齐 menu.edit.comment_uncomment = 注释/取消注释 -menu.edit.increase_indent = 增加缩进量 -menu.edit.decrease_indent = 减少缩进量 +menu.edit.increase_indent = → 增加缩进量 +menu.edit.decrease_indent = ← 减少缩进量 menu.edit.find = 查找... menu.edit.find_next = 查找下一个 menu.edit.find_previous = 查找上一个 From bdd8fbc84119df941bee9950ba1cc8f3bab95d70 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jan 2019 18:28:43 -0500 Subject: [PATCH 071/172] rewrite key stroke handling; now multi-platform, overridable by prefs --- app/src/processing/app/ui/Editor.java | 19 ++---- app/src/processing/app/ui/EditorHeader.java | 34 ++-------- app/src/processing/app/ui/Toolkit.java | 66 ++++++++++++++----- build/shared/lib/languages/PDE.properties | 3 + java/src/processing/mode/java/JavaEditor.java | 9 +-- todo.txt | 1 + 6 files changed, 66 insertions(+), 66 deletions(-) diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index 8da45570c8..e71775d5de 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -881,13 +881,8 @@ protected JMenu buildEditMenu() { undoItem = Toolkit.newJMenuItem(undoAction = new UndoAction(), 'Z'); menu.add(undoItem); - // Gotta follow them interface guidelines - // http://code.google.com/p/processing/issues/detail?id=363 - if (Platform.isWindows()) { - redoItem = Toolkit.newJMenuItem(redoAction = new RedoAction(), 'Y'); - } else { // Linux and OS X - redoItem = Toolkit.newJMenuItemShift(redoAction = new RedoAction(), 'Z'); - } + redoItem = new JMenuItem(redoAction = new RedoAction()); + redoItem.setAccelerator(Toolkit.getKeyStrokeExt("menu.edit.redo")); menu.add(redoItem); menu.addSeparator(); @@ -956,8 +951,7 @@ public void actionPerformed(ActionEvent e) { }); menu.add(item); - item = Toolkit.newJMenuItem(Language.text("menu.edit.comment_uncomment"), - Language.text("menu.edit.comment_uncomment.keystroke")); + item = Toolkit.newJMenuItemExt("menu.edit.comment_uncomment"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCommentUncomment(); @@ -965,9 +959,7 @@ public void actionPerformed(ActionEvent e) { }); menu.add(item); - item = Toolkit.newJMenuItem("\u2192 " + Language.text("menu.edit.increase_indent"), - Language.text("menu.edit.increase_indent.keystroke")); - + item = Toolkit.newJMenuItemExt("menu.edit.increase_indent"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(true); @@ -975,8 +967,7 @@ public void actionPerformed(ActionEvent e) { }); menu.add(item); - item = Toolkit.newJMenuItem("\u2190 " + Language.text("menu.edit.decrease_indent"), - Language.text("menu.edit.decrease_indent.keystroke")); + item = Toolkit.newJMenuItemExt("menu.edit.decrease_indent"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(false); diff --git a/app/src/processing/app/ui/EditorHeader.java b/app/src/processing/app/ui/EditorHeader.java index 32a4cc7ea2..32a73189d0 100644 --- a/app/src/processing/app/ui/EditorHeader.java +++ b/app/src/processing/app/ui/EditorHeader.java @@ -494,51 +494,29 @@ public void actionPerformed(ActionEvent e) { // KeyEvent.VK_LEFT and VK_RIGHT will make Windows beep - final String prevTab = Language.text("editor.header.previous_tab"); - if (Platform.isLinux()) { - item = Toolkit.newJMenuItem(prevTab, KeyEvent.VK_PAGE_UP); - } else { - //item = Toolkit.newJMenuItemAlt(prevTab, KeyEvent.VK_LEFT); - item = Toolkit.newJMenuItem(prevTab, Language.text("editor.header.previous_tab.keystroke")); - } + mapKey = "editor.header.previous_tab"; + item = Toolkit.newJMenuItemExt(mapKey); action = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { editor.getSketch().handlePrevCode(); } }; - mapKey = "editor.header.previous_tab"; - if (Platform.isLinux()) { - keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, Toolkit.SHORTCUT_KEY_MASK); - } else { - //keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Toolkit.SHORTCUT_ALT_KEY_MASK); - keyStroke = KeyStroke.getKeyStroke(Language.text("editor.header.previous_tab.keystroke")); - } + keyStroke = item.getAccelerator(); inputMap.put(keyStroke, mapKey); actionMap.put(mapKey, action); item.addActionListener(action); menu.add(item); - final String nextTab = Language.text("editor.header.next_tab"); - if (Platform.isLinux()) { - item = Toolkit.newJMenuItem(nextTab, KeyEvent.VK_PAGE_DOWN); - } else { - //item = Toolkit.newJMenuItemAlt(nextTab, KeyEvent.VK_RIGHT); - item = Toolkit.newJMenuItem(nextTab, Language.text("editor.header.next_tab.keystroke")); - } + mapKey = "editor.header.next_tab"; + item = Toolkit.newJMenuItemExt(mapKey); action = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { editor.getSketch().handleNextCode(); } }; - mapKey = "editor.header.next_tab"; - if (Platform.isLinux()) { - keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, Toolkit.SHORTCUT_KEY_MASK); - } else { - //keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Toolkit.SHORTCUT_ALT_KEY_MASK); - keyStroke = KeyStroke.getKeyStroke(Language.text("editor.header.next_tab.keystroke")); - } + keyStroke = item.getAccelerator(); inputMap.put(keyStroke, mapKey); actionMap.put(mapKey, action); item.addActionListener(action); diff --git a/app/src/processing/app/ui/Toolkit.java b/app/src/processing/app/ui/Toolkit.java index b49987a46d..31a63e5700 100644 --- a/app/src/processing/app/ui/Toolkit.java +++ b/app/src/processing/app/ui/Toolkit.java @@ -103,6 +103,8 @@ public class Toolkit { static public final KeyStroke WINDOW_CLOSE_KEYSTROKE = KeyStroke.getKeyStroke('W', SHORTCUT_KEY_MASK); + static final String BAD_KEYSTROKE = + "'%s' is not understood, please re-read the Java reference for KeyStroke"; /** * Standardized width for buttons. Mac OS X 10.3 wants 70 as its default, @@ -118,16 +120,36 @@ static public int getButtonWidth() { /** - * A software engineer, somewhere, needs to have their abstraction - * taken away. Who crafts the sort of API that would require a - * five-line helper function just to set the shortcut key for a - * menu item? + * Return the correct KeyStroke per locale and platform. + * Also checks for any additional overrides in preferences.txt. + * @param base the localization key for the menu item + * (.keystroke and .platform will be added to the end) + * @return KeyStroke for base + .keystroke + .platform + * (or the value from preferences) or null if none found */ - static public JMenuItem newJMenuItem(String title, int what) { - JMenuItem menuItem = new JMenuItem(title); - int modifiers = awtToolkit.getMenuShortcutKeyMask(); - menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers)); - return menuItem; + static public KeyStroke getKeyStrokeExt(String base) { + String key = base + ".keystroke"; + + // see if there's an override in preferences.txt + String sequence = Preferences.get(key); + if (sequence != null) { + KeyStroke ks = KeyStroke.getKeyStroke(sequence); + if (ks != null) { + return ks; // user did good, we're all set + + } else { + System.err.format(BAD_KEYSTROKE, sequence); + } + } + + sequence = Language.text(key + "." + Platform.getName()); + KeyStroke ks = KeyStroke.getKeyStroke(sequence); + if (ks == null) { + // this can only happen if user has screwed up their language files + System.err.format(BAD_KEYSTROKE, sequence); + //return KeyStroke.getKeyStroke(0, 0); // badness + } + return ks; } @@ -138,22 +160,30 @@ static public JMenuItem newJMenuItem(String title, int what) { * @param sequence the name, as outlined by the KeyStroke API * @param fallback what to use if getKeyStroke() comes back null */ - static public JMenuItem newJMenuItem(String title, - String sequence) { - JMenuItem menuItem = new JMenuItem(title); - KeyStroke ks = KeyStroke.getKeyStroke(sequence); + static public JMenuItem newJMenuItemExt(String base) { + JMenuItem menuItem = new JMenuItem(Language.text(base)); + KeyStroke ks = getKeyStrokeExt(base); // will print error if necessary if (ks != null) { menuItem.setAccelerator(ks); - - } else { - System.err.println("'" + sequence + "' is not understood, " + - "pleae re-read the Java reference for KeyStroke"); - //ks = KeyStroke.getKeyStroke(fallback); } return menuItem; } + /** + * A software engineer, somewhere, needs to have their abstraction + * taken away. Who crafts the sort of API that would require a + * five-line helper function just to set the shortcut key for a + * menu item? + */ + static public JMenuItem newJMenuItem(String title, int what) { + JMenuItem menuItem = new JMenuItem(title); + int modifiers = awtToolkit.getMenuShortcutKeyMask(); + menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers)); + return menuItem; + } + + /** * @param action: use an Action, which sets the title, reaction * and enabled-ness all by itself. diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index fe575d7807..afc34f28f8 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -31,6 +31,9 @@ menu.file.quit = Quit menu.edit = Edit menu.edit.undo = Undo menu.edit.redo = Redo +menu.edit.redo.keystroke.macosx = shift meta pressed Z +menu.edit.redo.keystroke.windows = meta pressed Y +menu.edit.redo.keystroke.linux = shift ctrl pressed Z menu.edit.action.addition = addition menu.edit.action.deletion = deletion menu.edit.cut = Cut diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 53723ff023..1e68198fdf 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -1384,8 +1384,7 @@ public void actionPerformed(ActionEvent e) { // }); // debugMenu.add(item); - item = Toolkit.newJMenuItem(Language.text("menu.debug.step"), - Language.text("menu.debug.step.keystroke")); + item = Toolkit.newJMenuItemExt("menu.debug.step"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleStep(0); @@ -1394,8 +1393,7 @@ public void actionPerformed(ActionEvent e) { debugMenu.add(item); item.setEnabled(false); - item = Toolkit.newJMenuItem(Language.text("menu.debug.step_into"), - Language.text("menu.debug.step_into.keystroke")); + item = Toolkit.newJMenuItemExt("menu.debug.step_into"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleStep(ActionEvent.SHIFT_MASK); @@ -1404,8 +1402,7 @@ public void actionPerformed(ActionEvent e) { debugMenu.add(item); item.setEnabled(false); - item = Toolkit.newJMenuItem(Language.text("menu.debug.step_out"), - Language.text("menu.debug.step_out.keystroke")); + item = Toolkit.newJMenuItemExt("menu.debug.step_out"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleStep(ActionEvent.ALT_MASK); diff --git a/todo.txt b/todo.txt index eed92ada52..b90555f809 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,7 @@ 0268 (3.5.2) _ shortcuts not working on Windows/Linux (using meta) _ https://github.com/processing/processing/issues/5763 +_ update https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings _ Find in Reference disabled for various keywords (draw, for, if, catch, while) From 11aab09fc708e8adcdbf0856d5061f533679ee92 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Tue, 22 Jan 2019 15:35:02 -0800 Subject: [PATCH 072/172] Fix bug with control-click for RIGHT on Mac OS, addresses #5765 When a control-click occurs, the macosxLeftButtonWithCtrlPressed flag was set, but was never being unset due to accidental comparison with the button variable instead of action variable. All future mouse operations reported as right-click on Mac OS. This fixes the comparison so that only the operations from a mouse press with the control button down are reported as RIGHT. The flag is cleared after mouse release. --- core/src/processing/core/PApplet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 52d4f8068c..712db3766f 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -2697,7 +2697,7 @@ protected void handleMouseEvent(MouseEvent event) { event.getX(), event.getY(), button, event.getCount()); } - if (button == MouseEvent.RELEASE) { + if (action == MouseEvent.RELEASE) { macosxLeftButtonWithCtrlPressed = false; } } From 76170d860d66af4a278a4ed894fb27c411c37ce2 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jan 2019 18:57:55 -0500 Subject: [PATCH 073/172] preparing release notes --- build/shared/revisions.txt | 29 +++++++++++++++++++++++++++++ core/todo.txt | 3 +++ todo.txt | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index d34789a9f9..4091acfc8b 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,3 +1,32 @@ +PROCESSING 3.5.2 (REV 0268) - 22 January 2019 + +Fixed a pair of nasty regressions, and adding a couple key shortcuts +to the preferences file. + +Also: please help us localize the menu shortcuts that have been causing +trouble on non-US keyboards. See the Localization wiki for more details: +https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings + + +[ new feature! ] + ++ The nine menu shortcuts that can be localized can now also be overridden + by users in preferences.txt. Information is on the Localization page. + + +[ more regressions! ] + ++ Some Linux/Windows menu shortcuts were mapped to META instead of CTRL + https://github.com/processing/processing/issues/5763 + ++ Ctrl-click on Mac OS X result in all subsequent clicks reported as right-click + https://github.com/processing/processing/issues/5765 + https://github.com/processing/processing/pull/5766 + + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + PROCESSING 3.5.1 (REV 0267) - 21 January 2019 Should have known better than to try to fix a bug connnected to diff --git a/core/todo.txt b/core/todo.txt index 40d73ea724..ab3fe83ddc 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,4 +1,7 @@ 0268 (3.5.2) +X Ctrl-click on Mac OS X result in all subsequent clicks reported as right-click +X https://github.com/processing/processing/issues/5765 +X https://github.com/processing/processing/pull/5766 high-ish diff --git a/todo.txt b/todo.txt index b90555f809..87499a3db8 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,6 @@ 0268 (3.5.2) -_ shortcuts not working on Windows/Linux (using meta) -_ https://github.com/processing/processing/issues/5763 +X shortcuts not working on Windows/Linux (using meta) +X https://github.com/processing/processing/issues/5763 _ update https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings From 3ff6528c539e12bc45a959735ccfbe622b41d281 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jan 2019 19:06:09 -0500 Subject: [PATCH 074/172] update copyright years in processing.app.ui package --- app/src/processing/app/Preferences.java | 6 +++--- app/src/processing/app/ui/About.java | 2 +- app/src/processing/app/ui/ChangeDetector.java | 21 +++++++++++++++++++ app/src/processing/app/ui/ColorChooser.java | 3 ++- app/src/processing/app/ui/Editor.java | 2 +- app/src/processing/app/ui/EditorButton.java | 3 ++- app/src/processing/app/ui/EditorConsole.java | 6 +++--- .../processing/app/ui/EditorException.java | 2 +- app/src/processing/app/ui/EditorFooter.java | 2 +- app/src/processing/app/ui/EditorHeader.java | 4 ++-- app/src/processing/app/ui/EditorState.java | 1 + app/src/processing/app/ui/EditorStatus.java | 2 +- app/src/processing/app/ui/EditorToolbar.java | 2 +- app/src/processing/app/ui/ErrorTable.java | 3 ++- app/src/processing/app/ui/ExamplesFrame.java | 2 +- app/src/processing/app/ui/FindReplace.java | 5 +++-- app/src/processing/app/ui/MarkerColumn.java | 3 ++- .../processing/app/ui/PreferencesFrame.java | 2 +- app/src/processing/app/ui/Recent.java | 3 ++- .../processing/app/ui/SketchbookFrame.java | 2 +- app/src/processing/app/ui/Toolkit.java | 2 +- app/src/processing/app/ui/WebFrame.java | 2 +- app/src/processing/app/ui/Welcome.java | 2 +- app/src/processing/app/ui/Welcome2.java | 2 +- .../app/ui/ZoomTreeCellRenderer.java | 2 +- java/src/processing/mode/java/Debugger.java | 3 ++- 26 files changed, 59 insertions(+), 30 deletions(-) diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index 03018d99ac..1b05083e19 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2014 The Processing Foundation + Copyright (c) 2014-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 @@ -53,7 +53,7 @@ public class Preferences { static final String PREFS_FILE = "preferences.txt"; //$NON-NLS-1$ static Map defaults; - static Map table = new HashMap(); + static Map table = new HashMap<>(); static File preferencesFile; @@ -73,7 +73,7 @@ static public void init() { // Clone the defaults, then override any them with the user's preferences. // This ensures that any new/added preference will be present. - defaults = new HashMap(table); + defaults = new HashMap<>(table); // other things that have to be set explicitly for the defaults setColor("run.window.bgcolor", SystemColor.control); //$NON-NLS-1$ diff --git a/app/src/processing/app/ui/About.java b/app/src/processing/app/ui/About.java index a84a680c5a..526bc31de6 100644 --- a/app/src/processing/app/ui/About.java +++ b/app/src/processing/app/ui/About.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-15 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or diff --git a/app/src/processing/app/ui/ChangeDetector.java b/app/src/processing/app/ui/ChangeDetector.java index 024c2aa58f..6d95275d0a 100644 --- a/app/src/processing/app/ui/ChangeDetector.java +++ b/app/src/processing/app/ui/ChangeDetector.java @@ -1,3 +1,24 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2012-19 The Processing Foundation + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + package processing.app.ui; import java.awt.event.WindowEvent; diff --git a/app/src/processing/app/ui/ColorChooser.java b/app/src/processing/app/ui/ColorChooser.java index 1281206e2c..5693db6c66 100644 --- a/app/src/processing/app/ui/ColorChooser.java +++ b/app/src/processing/app/ui/ColorChooser.java @@ -3,7 +3,8 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2006-14 Ben Fry and Casey Reas + Copyright (c) 2012-19 The Processing Foundation + Copyright (c) 2006-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index e71775d5de..7bfacc238a 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-15 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology diff --git a/app/src/processing/app/ui/EditorButton.java b/app/src/processing/app/ui/EditorButton.java index 04dea5f011..f65f081398 100644 --- a/app/src/processing/app/ui/EditorButton.java +++ b/app/src/processing/app/ui/EditorButton.java @@ -2,7 +2,8 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2015 The Processing Foundation + + Copyright (c) 2015-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 diff --git a/app/src/processing/app/ui/EditorConsole.java b/app/src/processing/app/ui/EditorConsole.java index 653fe40c84..186e692b90 100644 --- a/app/src/processing/app/ui/EditorConsole.java +++ b/app/src/processing/app/ui/EditorConsole.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-17 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology @@ -233,8 +233,8 @@ public void message(String what, boolean err) { // https://github.com/processing/processing/issues/5462 // Some discussion on the Apple's developer forums seems to suggest that is not serious: // https://forums.developer.apple.com/thread/105244 - } else if (err && what.contains("NSWindow drag regions should only be invalidated on the Main Thread")) { - // Keep hiding warnings triggered by JOGL on recent macOS versions (this is from 10.14 onwards I think). + } else if (err && what.contains("NSWindow drag regions should only be invalidated on the Main Thread")) { + // Keep hiding warnings triggered by JOGL on recent macOS versions (this is from 10.14 onwards I think). } else if (err && what.contains("Make pbuffer:")) { // Remove initalization warning from LWJGL. } else if (err && what.contains("XInitThreads() called for concurrent")) { diff --git a/app/src/processing/app/ui/EditorException.java b/app/src/processing/app/ui/EditorException.java index 67c170a88f..9dc210edcb 100644 --- a/app/src/processing/app/ui/EditorException.java +++ b/app/src/processing/app/ui/EditorException.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2015 The Processing Foundation + Copyright (c) 2015-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 diff --git a/app/src/processing/app/ui/EditorFooter.java b/app/src/processing/app/ui/EditorFooter.java index 4abd04c51c..81b16fc685 100644 --- a/app/src/processing/app/ui/EditorFooter.java +++ b/app/src/processing/app/ui/EditorFooter.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2015 The Processing Foundation + Copyright (c) 2015-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/src/processing/app/ui/EditorHeader.java b/app/src/processing/app/ui/EditorHeader.java index 32a73189d0..50fa1b8bf8 100644 --- a/app/src/processing/app/ui/EditorHeader.java +++ b/app/src/processing/app/ui/EditorHeader.java @@ -3,8 +3,8 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-15 The Processing Foundation - Copyright (c) 2004-13 Ben Fry and Casey Reas + Copyright (c) 2012-19 The Processing Foundation + Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology This program is free software; you can redistribute it and/or modify diff --git a/app/src/processing/app/ui/EditorState.java b/app/src/processing/app/ui/EditorState.java index 8116042473..b560bf8ed8 100644 --- a/app/src/processing/app/ui/EditorState.java +++ b/app/src/processing/app/ui/EditorState.java @@ -3,6 +3,7 @@ /* Part of the Processing project - http://processing.org + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify diff --git a/app/src/processing/app/ui/EditorStatus.java b/app/src/processing/app/ui/EditorStatus.java index db77a932c0..8affa8c6a3 100644 --- a/app/src/processing/app/ui/EditorStatus.java +++ b/app/src/processing/app/ui/EditorStatus.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-18 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology diff --git a/app/src/processing/app/ui/EditorToolbar.java b/app/src/processing/app/ui/EditorToolbar.java index 6d192d7370..63fa851acf 100644 --- a/app/src/processing/app/ui/EditorToolbar.java +++ b/app/src/processing/app/ui/EditorToolbar.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyirght (c) 2012-15 The Processing Foundation + Copyirght (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology diff --git a/app/src/processing/app/ui/ErrorTable.java b/app/src/processing/app/ui/ErrorTable.java index 2696e33be4..f033dfc5b0 100644 --- a/app/src/processing/app/ui/ErrorTable.java +++ b/app/src/processing/app/ui/ErrorTable.java @@ -2,7 +2,8 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-15 The Processing Foundation + + Copyright (c) 2012-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 diff --git a/app/src/processing/app/ui/ExamplesFrame.java b/app/src/processing/app/ui/ExamplesFrame.java index af134f6a38..70258650d5 100644 --- a/app/src/processing/app/ui/ExamplesFrame.java +++ b/app/src/processing/app/ui/ExamplesFrame.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-15 The Processing Foundation + Copyright (c) 2013-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/src/processing/app/ui/FindReplace.java b/app/src/processing/app/ui/FindReplace.java index b9e9409cac..757ab96251 100644 --- a/app/src/processing/app/ui/FindReplace.java +++ b/app/src/processing/app/ui/FindReplace.java @@ -3,6 +3,7 @@ /* Part of the Processing project - http://processing.org + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology @@ -424,10 +425,10 @@ protected void setFound(boolean found) { */ public void replace(boolean isCompoundEdit) { editor.setSelectedText(replaceField.getText(), isCompoundEdit); - + editor.getSketch().setModified(true); // This necessary- calling replace() // doesn't seem to mark a sketch as modified - + setFound(false); } diff --git a/app/src/processing/app/ui/MarkerColumn.java b/app/src/processing/app/ui/MarkerColumn.java index 12a1ee6550..7169d92ec5 100644 --- a/app/src/processing/app/ui/MarkerColumn.java +++ b/app/src/processing/app/ui/MarkerColumn.java @@ -2,7 +2,8 @@ /* Part of the Processing project - http://processing.org -Copyright (c) 2012-16 The Processing Foundation + +Copyright (c) 2012-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 diff --git a/app/src/processing/app/ui/PreferencesFrame.java b/app/src/processing/app/ui/PreferencesFrame.java index d534384f8a..91c077b537 100644 --- a/app/src/processing/app/ui/PreferencesFrame.java +++ b/app/src/processing/app/ui/PreferencesFrame.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-17 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology diff --git a/app/src/processing/app/ui/Recent.java b/app/src/processing/app/ui/Recent.java index a722239460..92f62ba7c0 100644 --- a/app/src/processing/app/ui/Recent.java +++ b/app/src/processing/app/ui/Recent.java @@ -3,6 +3,7 @@ /* Part of the Processing project - http://processing.org + Copyright (c) 2012-19 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify @@ -77,7 +78,7 @@ static public void init(Base b) { static protected void load() throws IOException { - records = new ArrayList(); + records = new ArrayList<>(); if (file.exists()) { BufferedReader reader = PApplet.createReader(file); String version = reader.readLine(); diff --git a/app/src/processing/app/ui/SketchbookFrame.java b/app/src/processing/app/ui/SketchbookFrame.java index 6848c96c8b..ae36203a29 100644 --- a/app/src/processing/app/ui/SketchbookFrame.java +++ b/app/src/processing/app/ui/SketchbookFrame.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-15 The Processing Foundation + Copyright (c) 2013-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/src/processing/app/ui/Toolkit.java b/app/src/processing/app/ui/Toolkit.java index 31a63e5700..866190c6ed 100644 --- a/app/src/processing/app/ui/Toolkit.java +++ b/app/src/processing/app/ui/Toolkit.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-15 The Processing Foundation + Copyright (c) 2012-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 diff --git a/app/src/processing/app/ui/WebFrame.java b/app/src/processing/app/ui/WebFrame.java index 797abc9e17..f1f791d3f2 100644 --- a/app/src/processing/app/ui/WebFrame.java +++ b/app/src/processing/app/ui/WebFrame.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2015 The Processing Foundation + Copyright (c) 2015-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/processing/app/ui/Welcome.java b/app/src/processing/app/ui/Welcome.java index 9f74855168..9de89a1db8 100644 --- a/app/src/processing/app/ui/Welcome.java +++ b/app/src/processing/app/ui/Welcome.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2015 The Processing Foundation + Copyright (c) 2015-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/processing/app/ui/Welcome2.java b/app/src/processing/app/ui/Welcome2.java index bbf4f944f3..7c635dc115 100644 --- a/app/src/processing/app/ui/Welcome2.java +++ b/app/src/processing/app/ui/Welcome2.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2017-18 The Processing Foundation + Copyright (c) 2017-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/app/src/processing/app/ui/ZoomTreeCellRenderer.java b/app/src/processing/app/ui/ZoomTreeCellRenderer.java index 2589d517ec..616b63dbe9 100644 --- a/app/src/processing/app/ui/ZoomTreeCellRenderer.java +++ b/app/src/processing/app/ui/ZoomTreeCellRenderer.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2017 The Processing Foundation + Copyright (c) 2017-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/java/src/processing/mode/java/Debugger.java b/java/src/processing/mode/java/Debugger.java index 3fcb069d5d..7b37a96f96 100644 --- a/java/src/processing/mode/java/Debugger.java +++ b/java/src/processing/mode/java/Debugger.java @@ -2,7 +2,8 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2012-16 The Processing Foundation + + Copyright (c) 2012-19 The Processing Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 From f00e1838a776cfed17aeb404b76437c1d09cf875 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jan 2019 19:09:30 -0500 Subject: [PATCH 075/172] tweak wording --- build/shared/revisions.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 4091acfc8b..21ab9dda3d 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -8,12 +8,6 @@ trouble on non-US keyboards. See the Localization wiki for more details: https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings -[ new feature! ] - -+ The nine menu shortcuts that can be localized can now also be overridden - by users in preferences.txt. Information is on the Localization page. - - [ more regressions! ] + Some Linux/Windows menu shortcuts were mapped to META instead of CTRL @@ -24,6 +18,12 @@ https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bin https://github.com/processing/processing/pull/5766 +[ and a new feature! ] + ++ The nine menu shortcuts that can be localized can now also be overridden + by users in preferences.txt. Information is on the Localization page. + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . From 4607ac2455791a9b41e4fca45c36b2e86c500cde Mon Sep 17 00:00:00 2001 From: REAS Date: Tue, 22 Jan 2019 22:26:40 -0800 Subject: [PATCH 076/172] Changes to documentation for circle() and square() --- core/src/processing/core/PGraphics.java | 37 +++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index c05d34c383..4669f138f1 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -2729,7 +2729,25 @@ protected void rectImpl(float x1, float y1, float x2, float y2, endShape(CLOSE); } - + /** + * ( begin auto-generated from square.xml ) + * + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the + * rectMode() function. + * + * ( end auto-generated ) + * + * @webref shape:2d_primitives + * @param a x-coordinate of the rectangle by default + * @param b y-coordinate of the rectangle by default + * @param c width and height of the rectangle by default + * @see PGraphics#rect(int, int, int, int) + * @see PGraphics#rectMode(int) + */ public void square(float x, float y, float extent) { rect(x, y, extent, extent); } @@ -2910,7 +2928,22 @@ protected void arcImpl(float x, float y, float w, float h, showMissingWarning("arc"); } - + /** + * ( begin auto-generated from circle.xml ) + * + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() + * function. + * + * ( end auto-generated ) + * @webref shape:2d_primitives + * @param a x-coordinate of the ellipse + * @param b y-coordinate of the ellipse + * @param c width and height of the ellipse by default + * @see PApplet#ellipse(float, float, float, float) + * @see PApplet#ellipseMode(int) + */ public void circle(float x, float y, float extent) { ellipse(x, y, extent, extent); } From be8005e1990dd74e67838e72cc3de21d50625c2d Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Wed, 23 Jan 2019 08:09:46 -0500 Subject: [PATCH 077/172] circle() and square() reference --- core/src/processing/core/PApplet.java | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 712db3766f..6f6d986ab9 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -12109,6 +12109,25 @@ public void rect(float a, float b, float c, float d, } + /** + * ( begin auto-generated from square.xml ) + * + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the + * rectMode() function. + * + * ( end auto-generated ) + * + * @webref shape:2d_primitives + * @param a x-coordinate of the rectangle by default + * @param b y-coordinate of the rectangle by default + * @param c width and height of the rectangle by default + * @see PGraphics#rect(int, int, int, int) + * @see PGraphics#rectMode(int) + */ public void square(float x, float y, float extent) { if (recorder != null) recorder.square(x, y, extent); g.square(x, y, extent); @@ -12203,6 +12222,22 @@ public void arc(float a, float b, float c, float d, } + /** + * ( begin auto-generated from circle.xml ) + * + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() + * function. + * + * ( end auto-generated ) + * @webref shape:2d_primitives + * @param a x-coordinate of the ellipse + * @param b y-coordinate of the ellipse + * @param c width and height of the ellipse by default + * @see PApplet#ellipse(float, float, float, float) + * @see PApplet#ellipseMode(int) + */ public void circle(float x, float y, float extent) { if (recorder != null) recorder.circle(x, y, extent); g.circle(x, y, extent); From 7f56bbd04b31f89d4a0cec9842d3a3148e6733a9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Wed, 23 Jan 2019 08:09:53 -0500 Subject: [PATCH 078/172] starting the next release --- app/src/processing/app/Base.java | 4 ++-- core/done.txt | 6 ++++++ core/todo.txt | 7 +++---- done.txt | 6 ++++++ todo.txt | 5 +---- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 0ddd739d88..ca56ccea00 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -56,9 +56,9 @@ public class Base { // Added accessors for 0218 because the UpdateCheck class was not properly // updating the values, due to javac inlining the static final values. - static private final int REVISION = 268; + static private final int REVISION = 269; /** This might be replaced by main() if there's a lib/version.txt file. */ - static private String VERSION_NAME = "0268"; //$NON-NLS-1$ + static private String VERSION_NAME = "0269"; //$NON-NLS-1$ /** Set true if this a proper release rather than a numbered revision. */ /** diff --git a/core/done.txt b/core/done.txt index d32cba1ca2..616a6b0502 100644 --- a/core/done.txt +++ b/core/done.txt @@ -1,3 +1,9 @@ +0268 (3.5.2) +X Ctrl-click on Mac OS X result in all subsequent clicks reported as right-click +X https://github.com/processing/processing/issues/5765 +X https://github.com/processing/processing/pull/5766 + + 0267 (3.5.1) X no changes to core in this release diff --git a/core/todo.txt b/core/todo.txt index ab3fe83ddc..26d6bbf8db 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,7 +1,4 @@ -0268 (3.5.2) -X Ctrl-click on Mac OS X result in all subsequent clicks reported as right-click -X https://github.com/processing/processing/issues/5765 -X https://github.com/processing/processing/pull/5766 +0269 (3.5.3) high-ish @@ -21,6 +18,8 @@ _ mostly held up by cross-renderer inconsistency with these _ textAlign(CENTER) and pixelDensity(2) aligning incorrectly with Java2D _ https://github.com/processing/processing/issues/4020 _ calling textSize() fixes it, only hpapens with the default font +_ incorrect textWidth() with pixelDensity(2) when textFont() not used +_ https://github.com/processing/processing/issues/5768 retina/hi-dpi/sizing diff --git a/done.txt b/done.txt index 435cbd1028..338cc589ec 100644 --- a/done.txt +++ b/done.txt @@ -1,3 +1,9 @@ +0268 (3.5.2) +X shortcuts not working on Windows/Linux (using meta) +X https://github.com/processing/processing/issues/5763 +X update https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings + + 0267 (3.5.1) X size() command not working properly X https://github.com/processing/processing/issues/5759 diff --git a/todo.txt b/todo.txt index 87499a3db8..bf3eef9227 100755 --- a/todo.txt +++ b/todo.txt @@ -1,7 +1,4 @@ -0268 (3.5.2) -X shortcuts not working on Windows/Linux (using meta) -X https://github.com/processing/processing/issues/5763 -_ update https://github.com/processing/processing/wiki/Localization#shortcuts-and-key-bindings +0269 (3.5.3) _ Find in Reference disabled for various keywords (draw, for, if, catch, while) From 48b44cb303d1ac95fbe9355f3896b84a4aa69f05 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Wed, 23 Jan 2019 11:30:14 -0500 Subject: [PATCH 079/172] cleaning up from PRs, other todo items --- .../app/contrib/ContributionListing.java | 28 ++----------------- core/src/processing/core/PApplet.java | 25 ++++++++--------- core/todo.txt | 5 ++++ todo.txt | 4 +++ 4 files changed, 24 insertions(+), 38 deletions(-) diff --git a/app/src/processing/app/contrib/ContributionListing.java b/app/src/processing/app/contrib/ContributionListing.java index b054b2e977..6f35ca3fd7 100644 --- a/app/src/processing/app/contrib/ContributionListing.java +++ b/app/src/processing/app/contrib/ContributionListing.java @@ -159,7 +159,7 @@ private void addContribution(Contribution contribution) { Collections.sort(list, COMPARATOR); } else { - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); list.add(contribution); librariesByCategory.put(category, list); } @@ -210,7 +210,7 @@ protected AvailableContribution getAvailableContribution(Contribution info) { protected Set getCategories(Contribution.Filter filter) { - Set outgoing = new HashSet(); + Set outgoing = new HashSet<>(); Set categorySet = librariesByCategory.keySet(); for (String categoryName : categorySet) { @@ -426,28 +426,6 @@ public void run() { } - /* - boolean hasUpdates(Base base) { - for (ModeContribution mc : base.getModeContribs()) { - if (hasUpdates(mc)) { - return true; - } - } - for (Library lib : base.getActiveEditor().getMode().contribLibraries) { - if (hasUpdates(lib)) { - return true; - } - } - for (ToolContribution tc : base.getToolContribs()) { - if (hasUpdates(tc)) { - return true; - } - } - return false; - } - */ - - protected boolean hasUpdates(Contribution contribution) { if (contribution.isInstalled()) { Contribution advertised = getAvailableContribution(contribution); @@ -482,7 +460,7 @@ protected boolean hasListDownloadFailed() { private List parseContribList(File file) { List outgoing = - new ArrayList(); + new ArrayList<>(); if (file != null && file.exists()) { String[] lines = PApplet.loadStrings(file); diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index f036f501ca..22867676d3 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -141,7 +141,6 @@ public class PApplet implements PConstants { * Do not use; javaPlatform or javaVersionName are better options. * For instance, javaPlatform is useful when you need a number for * comparison, i.e. "if (javaPlatform >= 9)". - * @deprecated */ @Deprecated public static final float javaVersion = 1 + javaPlatform / 10f; @@ -8299,9 +8298,8 @@ static public void arrayCopy(Object src, Object dst) { System.arraycopy(src, 0, dst, 0, Array.getLength(src)); } - // /** - * @deprecated Use arrayCopy() instead. + * Use arrayCopy() instead. */ @Deprecated static public void arraycopy(Object src, int srcPosition, @@ -8311,7 +8309,7 @@ static public void arraycopy(Object src, int srcPosition, } /** - * @deprecated Use arrayCopy() instead. + * Use arrayCopy() instead. */ @Deprecated static public void arraycopy(Object src, Object dst, int length) { @@ -8319,13 +8317,14 @@ static public void arraycopy(Object src, Object dst, int length) { } /** - * @deprecated Use arrayCopy() instead. + * Use arrayCopy() instead. */ @Deprecated static public void arraycopy(Object src, Object dst) { System.arraycopy(src, 0, dst, 0, Array.getLength(src)); } + /** * ( begin auto-generated from expand.xml ) * @@ -12115,11 +12114,11 @@ public void rect(float a, float b, float c, float d, /** * ( begin auto-generated from square.xml ) * - * Draws a square to the screen. A square is a four-sided shape with - * every angle at ninety degrees and each side is the same length. - * By default, the first two parameters set the location of the - * upper-left corner, the third sets the width and height. The way - * these parameters are interpreted, however, may be changed with the + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the * rectMode() function. * * ( end auto-generated ) @@ -12228,9 +12227,9 @@ public void arc(float a, float b, float c, float d, /** * ( begin auto-generated from circle.xml ) * - * Draws a circle to the screen. By default, the first two parameters - * set the location of the center, and the third sets the shape's width - * and height. The origin may be changed with the ellipseMode() + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() * function. * * ( end auto-generated ) diff --git a/core/todo.txt b/core/todo.txt index 26d6bbf8db..0c2b2c79cc 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,6 +1,11 @@ 0269 (3.5.3) +contrib +X Update missing @Deprecated tags in PApplet.java +X https://github.com/processing/processing/pull/5686 + + high-ish _ add separator option to loadTable() _ https://github.com/processing/processing/issues/5068 diff --git a/todo.txt b/todo.txt index bf3eef9227..32de9ef44c 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,10 @@ 0269 (3.5.3) +contrib +X update translation of "sketch" for Russian speakers +X https://github.com/processing/processing/pull/5673 + _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 From 818b9bafe99426a53b4a7f44fca0a0628266b184 Mon Sep 17 00:00:00 2001 From: REAS Date: Wed, 23 Jan 2019 09:23:42 -0800 Subject: [PATCH 080/172] Update for circle() and square() reference --- core/src/processing/core/PApplet.java | 30 ++++++++++++------------- core/src/processing/core/PGraphics.java | 14 ++++++------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 22867676d3..5e22359e51 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -12114,20 +12114,20 @@ public void rect(float a, float b, float c, float d, /** * ( begin auto-generated from square.xml ) * - * Draws a square to the screen. A square is a four-sided shape with - * every angle at ninety degrees and each side is the same length. - * By default, the first two parameters set the location of the - * upper-left corner, the third sets the width and height. The way - * these parameters are interpreted, however, may be changed with the + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the * rectMode() function. * * ( end auto-generated ) * * @webref shape:2d_primitives - * @param a x-coordinate of the rectangle by default - * @param b y-coordinate of the rectangle by default - * @param c width and height of the rectangle by default - * @see PGraphics#rect(int, int, int, int) + * @param x x-coordinate of the rectangle by default + * @param y y-coordinate of the rectangle by default + * @param extent width and height of the rectangle by default + * @see PGraphics#rect(float, float, float, float) * @see PGraphics#rectMode(int) */ public void square(float x, float y, float extent) { @@ -12227,16 +12227,16 @@ public void arc(float a, float b, float c, float d, /** * ( begin auto-generated from circle.xml ) * - * Draws a circle to the screen. By default, the first two parameters - * set the location of the center, and the third sets the shape's width - * and height. The origin may be changed with the ellipseMode() + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() * function. * * ( end auto-generated ) * @webref shape:2d_primitives - * @param a x-coordinate of the ellipse - * @param b y-coordinate of the ellipse - * @param c width and height of the ellipse by default + * @param x x-coordinate of the ellipse + * @param y y-coordinate of the ellipse + * @param extent width and height of the ellipse by default * @see PApplet#ellipse(float, float, float, float) * @see PApplet#ellipseMode(int) */ diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 4669f138f1..231e158bf0 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -2742,10 +2742,10 @@ protected void rectImpl(float x1, float y1, float x2, float y2, * ( end auto-generated ) * * @webref shape:2d_primitives - * @param a x-coordinate of the rectangle by default - * @param b y-coordinate of the rectangle by default - * @param c width and height of the rectangle by default - * @see PGraphics#rect(int, int, int, int) + * @param x x-coordinate of the rectangle by default + * @param y y-coordinate of the rectangle by default + * @param extent width and height of the rectangle by default + * @see PGraphics#rect(float, float, float, float) * @see PGraphics#rectMode(int) */ public void square(float x, float y, float extent) { @@ -2938,9 +2938,9 @@ protected void arcImpl(float x, float y, float w, float h, * * ( end auto-generated ) * @webref shape:2d_primitives - * @param a x-coordinate of the ellipse - * @param b y-coordinate of the ellipse - * @param c width and height of the ellipse by default + * @param x x-coordinate of the ellipse + * @param y y-coordinate of the ellipse + * @param extent width and height of the ellipse by default * @see PApplet#ellipse(float, float, float, float) * @see PApplet#ellipseMode(int) */ From 6dd0aaa5f904bbc8419f26fa466dfd6cdfad0962 Mon Sep 17 00:00:00 2001 From: REAS Date: Wed, 23 Jan 2019 10:10:06 -0800 Subject: [PATCH 081/172] Update for pop() and push() reference --- core/src/processing/core/PGraphics.java | 68 +++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 231e158bf0..0c63c34de7 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-15 The Processing Foundation + Copyright (c) 2013-19 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology @@ -5164,13 +5164,75 @@ protected void textCharScreenImpl(PImage glyph, // PARITY WITH P5.JS - + /** + * ( begin auto-generated from push.xml ) + * + * The push() function saves the current drawing style + * settings and transformations, while pop() restores these + * settings. Note that these functions are always used together. + * They allow you to change the style and transformation settings + * and later return to what you had. When a new state is started + * with push(), it builds on the current style and transform + * information.
+ *
+ * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), + * textMode(), textSize(), textLeading().
+ *
+ * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles + * at the same time. + * + * ( end auto-generated ) + * + * @webref structure + * @see PGraphics#pop() + */ public void push() { pushStyle(); pushMatrix(); } - + /** + * ( begin auto-generated from pop.xml ) + * + * The pop() function restores the previous drawing style + * settings and transformations after push() has changed them. + * Note that these functions are always used together. They allow + * you to change the style and transformation settings and later + * return to what you had. When a new state is started with push(), + * it builds on the current style and transform information.
+ *
+ *
+ * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), + * textMode(), textSize(), textLeading().
+ *
+ * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles + * at the same time. + * + * ( end auto-generated ) + * + * @webref structure + * @see PGraphics#push() + */ public void pop() { popStyle(); popMatrix(); From 829cc9c5cf0d5a79d79b64cea8c86f8e682735f8 Mon Sep 17 00:00:00 2001 From: REAS Date: Wed, 23 Jan 2019 10:12:35 -0800 Subject: [PATCH 082/172] Update for pop() and push() reference, re-genererated PApplet --- core/src/processing/core/PApplet.java | 64 +++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 5e22359e51..4c110bf3f4 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -13268,12 +13268,76 @@ public void text(float num, float x, float y, float z) { } + /** + * ( begin auto-generated from push.xml ) + * + * The push() function saves the current drawing style + * settings and transformations, while pop() restores these + * settings. Note that these functions are always used together. + * They allow you to change the style and transformation settings + * and later return to what you had. When a new state is started + * with push(), it builds on the current style and transform + * information.
+ *
+ * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), + * textMode(), textSize(), textLeading().
+ *
+ * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles + * at the same time. + * + * ( end auto-generated ) + * + * @webref structure + * @see PGraphics#pop() + */ public void push() { if (recorder != null) recorder.push(); g.push(); } + /** + * ( begin auto-generated from pop.xml ) + * + * The pop() function restores the previous drawing style + * settings and transformations after push() has changed them. + * Note that these functions are always used together. They allow + * you to change the style and transformation settings and later + * return to what you had. When a new state is started with push(), + * it builds on the current style and transform information.
+ *
+ *
+ * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), + * textMode(), textSize(), textLeading().
+ *
+ * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles + * at the same time. + * + * ( end auto-generated ) + * + * @webref structure + * @see PGraphics#push() + */ public void pop() { if (recorder != null) recorder.pop(); g.pop(); From 15d5fd4626a66ba68681e21e7212cfc6d2b967d3 Mon Sep 17 00:00:00 2001 From: REAS Date: Wed, 23 Jan 2019 10:16:06 -0800 Subject: [PATCH 083/172] Update for pop() and push() reference, correction --- core/src/processing/core/PApplet.java | 4 ++-- core/src/processing/core/PGraphics.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 4c110bf3f4..029c9483ee 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -13279,7 +13279,7 @@ public void text(float num, float x, float y, float z) { * with push(), it builds on the current style and transform * information.
*
- * push() stores information related to the current + * push() stores information related to the current * transformation state and style settings controlled by the * following functions: rotate(), translate(), * scale(), fill(), stroke(), tint(), @@ -13317,7 +13317,7 @@ public void push() { * it builds on the current style and transform information.
*
*
- * push() stores information related to the current + * push() stores information related to the current * transformation state and style settings controlled by the * following functions: rotate(), translate(), * scale(), fill(), stroke(), tint(), diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 0c63c34de7..65bcb280d0 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -5175,7 +5175,7 @@ protected void textCharScreenImpl(PImage glyph, * with push(), it builds on the current style and transform * information.
*
- * push() stores information related to the current + * push() stores information related to the current * transformation state and style settings controlled by the * following functions: rotate(), translate(), * scale(), fill(), stroke(), tint(), @@ -5212,7 +5212,7 @@ public void push() { * it builds on the current style and transform information.
*
*
- * push() stores information related to the current + * push() stores information related to the current * transformation state and style settings controlled by the * following functions: rotate(), translate(), * scale(), fill(), stroke(), tint(), From 34360518e98e932a7f110f50317f7af8bddc6046 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 26 Jan 2019 13:03:28 -0500 Subject: [PATCH 084/172] fix the key shortcut for Redo on Windows (fixes #5773) --- build/shared/lib/languages/PDE.properties | 2 +- todo.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index afc34f28f8..5682fcc094 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -32,7 +32,7 @@ menu.edit = Edit menu.edit.undo = Undo menu.edit.redo = Redo menu.edit.redo.keystroke.macosx = shift meta pressed Z -menu.edit.redo.keystroke.windows = meta pressed Y +menu.edit.redo.keystroke.windows = ctrl pressed Y menu.edit.redo.keystroke.linux = shift ctrl pressed Z menu.edit.action.addition = addition menu.edit.action.deletion = deletion diff --git a/todo.txt b/todo.txt index 32de9ef44c..6701238c53 100755 --- a/todo.txt +++ b/todo.txt @@ -1,10 +1,13 @@ 0269 (3.5.3) +X redo key command for Windows screwed up +X https://github.com/processing/processing/issues/5773 contrib X update translation of "sketch" for Russian speakers X https://github.com/processing/processing/pull/5673 + _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 From d3e06933bf702ed3085641b99ddd133e57300cd0 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 28 Jan 2019 15:10:56 -0500 Subject: [PATCH 085/172] handle fall-through cases for plain text file editing (fixes #5628) --- .../processing/app/syntax/JEditTextArea.java | 7 +-- .../app/syntax/TextAreaPainter.java | 54 ++++++++----------- todo.txt | 4 ++ 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/app/src/processing/app/syntax/JEditTextArea.java b/app/src/processing/app/syntax/JEditTextArea.java index ddaa3fa681..b63084c63a 100644 --- a/app/src/processing/app/syntax/JEditTextArea.java +++ b/app/src/processing/app/syntax/JEditTextArea.java @@ -594,8 +594,7 @@ public int lineToY(int line) { public int yToLine(int y) { FontMetrics fm = painter.getFontMetrics(); int height = fm.getHeight(); - return Math.max(0,Math.min(getLineCount() - 1, - y / height + firstLine)); + return Math.max(0, Math.min(getLineCount() - 1, y / height + firstLine)); } @@ -1033,8 +1032,10 @@ public final void getText(int start, int len, Segment segment) { try { document.getText(start,len,segment); - } catch(BadLocationException bl) { + } catch (BadLocationException bl) { bl.printStackTrace(); + System.err.format("Bad Location: %d for start %d and length %d", + bl.offsetRequested(), start, len); segment.offset = segment.count = 0; } } diff --git a/app/src/processing/app/syntax/TextAreaPainter.java b/app/src/processing/app/syntax/TextAreaPainter.java index 7919c0ecf3..86e1ce2dc1 100644 --- a/app/src/processing/app/syntax/TextAreaPainter.java +++ b/app/src/processing/app/syntax/TextAreaPainter.java @@ -604,12 +604,6 @@ public Segment getCurrentLine() { } -// /** Old paintLine() method with kooky args order, kept around for X Mode. */ -// @Deprecated -// protected void paintLine(Graphics gfx, TokenMarker tokenMarker, -// int line, int x) { -// Font defaultFont = getFont(); -// Color defaultColor = getForeground(); protected void paintLine(Graphics gfx, int line, int x, TokenMarkerState tokenMarker) { currentLineIndex = line; @@ -625,40 +619,37 @@ protected void paintLine(Graphics gfx, int line, int x, } -// protected void paintLine(Graphics gfx, int line, int x, -// TokenMarker tokenMarker) { -// paintLine(gfx, tokenMarker, line, x); -// } - - -// protected void paintPlainLine(Graphics gfx, int line, Font defaultFont, -// Color defaultColor, int x, int y) { protected void paintPlainLine(Graphics gfx, int line, int x, int y) { - paintHighlight(gfx,line,y); - textArea.getLineText(line, currentLine); + paintHighlight(gfx, line, y); -// gfx.setFont(plainFont); -// gfx.setFont(defaultFont); -// gfx.setColor(defaultColor); + // don't try to draw lines past where they exist in the document + // https://github.com/processing/processing/issues/5628 + if (line < textArea.getLineCount()) { + textArea.getLineText(line, currentLine); - int x0 = x - textArea.getHorizontalOffset(); + int x0 = x - textArea.getHorizontalOffset(); + // prevent the blinking from drawing with last color used + // https://github.com/processing/processing/issues/5628 + gfx.setColor(defaults.fgcolor); + gfx.setFont(plainFont); - y += fm.getHeight(); - // doesn't respect fixed width like it should + y += fm.getHeight(); + // doesn't respect fixed width like it should // x = Utilities.drawTabbedText(currentLine, x, y, gfx, this, 0); // int w = fm.charWidth(' '); - for (int i = 0; i < currentLine.count; i++) { - gfx.drawChars(currentLine.array, currentLine.offset+i, 1, x, y); - x = currentLine.array[currentLine.offset + i] == '\t' ? + for (int i = 0; i < currentLine.count; i++) { + gfx.drawChars(currentLine.array, currentLine.offset+i, 1, x, y); + x = currentLine.array[currentLine.offset + i] == '\t' ? x0 + (int)nextTabStop(x - x0, i) : x + fm.charWidth(currentLine.array[currentLine.offset+i]); - textArea.offsetToX(line, currentLine.offset + i); - } + //textArea.offsetToX(line, currentLine.offset + i); + } - // Draw characters via input method. - if (compositionTextPainter != null && + // Draw characters via input method. + if (compositionTextPainter != null && compositionTextPainter.hasComposedTextLayout()) { - compositionTextPainter.draw(gfx, defaults.lineHighlightColor); + compositionTextPainter.draw(gfx, defaults.lineHighlightColor); + } } if (defaults.eolMarkers) { gfx.setColor(defaults.eolMarkerColor); @@ -667,9 +658,6 @@ protected void paintPlainLine(Graphics gfx, int line, int x, int y) { } -// protected void paintSyntaxLine(Graphics gfx, TokenMarker tokenMarker, -// int line, Font defaultFont, -// Color defaultColor, int x, int y) { protected void paintSyntaxLine(Graphics gfx, int line, int x, int y, TokenMarkerState tokenMarker) { textArea.getLineText(currentLineIndex, currentLine); diff --git a/todo.txt b/todo.txt index 6701238c53..a53d68f2b4 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,10 @@ 0269 (3.5.3) +X added reference for circle(), square(), push(), pop() +_ has the reference.zip file been fixed? X redo key command for Windows screwed up X https://github.com/processing/processing/issues/5773 +X fix an editor problem with plain text (css, etc) files +X https://github.com/processing/processing/issues/5628 contrib From 5ab60c84ac61b9c8c5ac0f1c81d0420d75918c2e Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 28 Jan 2019 16:13:24 -0500 Subject: [PATCH 086/172] default to using Desktop methods for URLs and files when available on Linux --- .../app/platform/LinuxPlatform.java | 40 +++++++++++-------- todo.txt | 2 + 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/app/src/processing/app/platform/LinuxPlatform.java b/app/src/processing/app/platform/LinuxPlatform.java index ace99d1762..fe3d7ce859 100644 --- a/app/src/processing/app/platform/LinuxPlatform.java +++ b/app/src/processing/app/platform/LinuxPlatform.java @@ -23,6 +23,7 @@ package processing.app.platform; import java.io.File; +import java.awt.Desktop; import java.awt.Toolkit; import processing.app.Base; @@ -97,26 +98,34 @@ static public String getHomeDir(String user) throws Exception { } + @Override public File getSettingsFolder() throws Exception { return new File(getHomeDir(), ".processing"); } + @Override public File getDefaultSketchbookFolder() throws Exception { return new File(getHomeDir(), "sketchbook"); } + @Override public void openURL(String url) throws Exception { - if (openFolderAvailable()) { - String launcher = Preferences.get("launcher"); - if (launcher != null) { - Runtime.getRuntime().exec(new String[] { launcher, url }); - } + if (Desktop.isDesktopSupported()) { + super.openURL(url); + + } else if (openFolderAvailable()) { + String launcher = Preferences.get("launcher"); // guaranteed non-null + Runtime.getRuntime().exec(new String[] { launcher, url }); + + } else { + System.err.println("No launcher set, cannot open " + url); } } + @Override public boolean openFolderAvailable() { if (Preferences.get("launcher") != null) { return true; @@ -151,19 +160,18 @@ public boolean openFolderAvailable() { } + @Override public void openFolder(File file) throws Exception { - if (openFolderAvailable()) { - String lunch = Preferences.get("launcher"); - try { - String[] params = new String[] { lunch, file.getAbsolutePath() }; - //processing.core.PApplet.println(params); - /*Process p =*/ Runtime.getRuntime().exec(params); - /*int result =*/ //p.waitFor(); - } catch (Exception e) { - e.printStackTrace(); - } + if (Desktop.isDesktopSupported()) { + super.openFolder(file); + + } else if (openFolderAvailable()) { + String launcher = Preferences.get("launcher"); + String[] params = new String[] { launcher, file.getAbsolutePath() }; + Runtime.getRuntime().exec(params); + } else { - System.out.println("No launcher set, cannot open " + + System.err.println("No launcher set, cannot open " + file.getAbsolutePath()); } } diff --git a/todo.txt b/todo.txt index a53d68f2b4..ef64b5ffd6 100755 --- a/todo.txt +++ b/todo.txt @@ -5,6 +5,8 @@ X redo key command for Windows screwed up X https://github.com/processing/processing/issues/5773 X fix an editor problem with plain text (css, etc) files X https://github.com/processing/processing/issues/5628 +X default to using Desktop methods for URLs and files when available on Linux +X also cover a few weird cases that were failing silently contrib From b9049243bd74c8a6395f102944f04ca5196ec43d Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 28 Jan 2019 17:01:23 -0500 Subject: [PATCH 087/172] ignore .class files in META-INF subfolder (fixes #5778) --- app/src/processing/app/Util.java | 15 +++++++-------- todo.txt | 3 ++- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/processing/app/Util.java b/app/src/processing/app/Util.java index dd98d4b604..6fdc75c9de 100644 --- a/app/src/processing/app/Util.java +++ b/app/src/processing/app/Util.java @@ -559,15 +559,14 @@ static private void packageListFromZip(String filename, StringList list) { if (!entry.isDirectory()) { String name = entry.getName(); - if (name.endsWith(".class")) { + // Avoid META-INF because some jokers but .class files in there + // https://github.com/processing/processing/issues/5778 + if (name.endsWith(".class") && !name.startsWith("META-INF/")) { int slash = name.lastIndexOf('/'); - if (slash == -1) continue; - - String pname = name.substring(0, slash); -// if (map.get(pname) == null) { -// map.put(pname, new Object()); -// } - list.appendUnique(pname); + if (slash != -1) { + String packageName = name.substring(0, slash); + list.appendUnique(packageName); + } } } } diff --git a/todo.txt b/todo.txt index ef64b5ffd6..c90286dd55 100755 --- a/todo.txt +++ b/todo.txt @@ -7,7 +7,8 @@ X fix an editor problem with plain text (css, etc) files X https://github.com/processing/processing/issues/5628 X default to using Desktop methods for URLs and files when available on Linux X also cover a few weird cases that were failing silently - +X The package "META" does not exist when .class files found in META-INF folder +X https://github.com/processing/processing/issues/5778 contrib X update translation of "sketch" for Russian speakers From 69f2e895521bab922f905884f7ba3c00d6eafee3 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 28 Jan 2019 17:18:46 -0500 Subject: [PATCH 088/172] check on the reference --- todo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/todo.txt b/todo.txt index c90286dd55..c3b7dc9346 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,6 @@ 0269 (3.5.3) X added reference for circle(), square(), push(), pop() -_ has the reference.zip file been fixed? +X has the reference.zip file been fixed? (yep) X redo key command for Windows screwed up X https://github.com/processing/processing/issues/5773 X fix an editor problem with plain text (css, etc) files From e168043c2be5576e5a2782a2e888198a53bb15a8 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Wed, 30 Jan 2019 19:49:39 -0500 Subject: [PATCH 089/172] cleaning up the list a bit --- done.txt | 1 + todo.txt | 130 ++++++++++++++++++++++++++----------------------------- 2 files changed, 62 insertions(+), 69 deletions(-) diff --git a/done.txt b/done.txt index 338cc589ec..a4734cba50 100644 --- a/done.txt +++ b/done.txt @@ -494,6 +494,7 @@ X https://github.com/processing/processing/issues/3965 X https://github.com/processing/processing/pull/4762 X Report missing brace in correct tab, suppress other errors until fixed X https://github.com/processing/processing/pull/4777 +X https://github.com/processing/processing/issues/4702 X Improvements to sketch launching and stopping X https://github.com/processing/processing/pull/4848 X several Contribution Manager fixes diff --git a/todo.txt b/todo.txt index c3b7dc9346..b55b6995e7 100755 --- a/todo.txt +++ b/todo.txt @@ -14,17 +14,31 @@ contrib X update translation of "sketch" for Russian speakers X https://github.com/processing/processing/pull/5673 +cleaning +o modify line number color when no lines extend that far? +o https://github.com/processing/processing/pull/4560 +o when opening new editor window, open on the same display as current +o https://github.com/processing/processing/issues/4526 +X closing as dupe of the other issue + +contrib +_ Saving sketch with the same name as a class +_ https://github.com/processing/processing/pull/4033 +_ Pasting text into PDE results in "Clipboard does not contain a string" +_ https://github.com/processing/processing/pull/4040 + + +high _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 - - -high-ish _ errors inside setup() aren't coming through at all? _ seen in Eclipse; have to turn on the debugger... same as #4703? _ Welcome screen doesn't size properly for HiDPI screens _ https://github.com/processing/processing/issues/4896 +_ sketch window resets position after each run (regression from 3.4?) +_ https://github.com/processing/processing/issues/5781 temp @@ -60,6 +74,8 @@ _ allow modes to specify their own base file name _ need to move "is this a sketch?" handling into Mode _ fix extension check for other modes _ https://github.com/processing/processing/issues/3980 +_ mode list does not update after changing sketchbook folder +_ already reported? sketch/launching @@ -81,27 +97,11 @@ _ see the 'examples' section below _ how are file associations handled in Linux? (for .pde, .psk) -_ Implement fallback fonts so we can use Source et al with CJK/Greek/Arabic -_ https://github.com/processing/processing/issues/5023 - -_ "Required files could not be found" when trying to run from the .zip file -_ https://github.com/processing/processing/issues/5022 -_ use an installer instead? - -_ mode list does not update after changing sketchbook folder -_ already reported? - -_ "error during export" message, but no error message contents come through -_ e.g. https://github.com/processing/processing/issues/4792 - +teaching +_ teacher wants user input on the console +_ https://github.com/processing/processing/issues/5779 _ did we lose settings.path because it was too buggy? _ https://github.com/processing/processing/issues/3948 - -_ update list of optional JRE files for Java 8 -_ Andres provided some updates -_ https://github.com/processing/processing/issues/3288 -_ these will change again for Java 11, so wait until then - _ proxy trouble with p5? since adding the system proxy? _ https://github.com/processing/processing/pull/3251/files _ larger problem thread https://github.com/processing/processing/issues/3891 @@ -111,60 +111,28 @@ _ docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html _ https://github.com/processing/processing/issues/1476#issuecomment-23229990 -_ fix appbundler problems due to rollback -_ https://github.com/processing/processing/issues/3790 -_ the rollback re-introduces two bugs (serial export and scrolling) -_ and any other changes later than 16 November 2014: -_ https://github.com/processing/processing/commits/master/build/macosx/appbundler.jar -_ https://github.com/processing/processing/commits/master/build/macosx/appbundler/native/main.m -_ https://github.com/processing/processing/commit/fa27b983e76fdbc5c4c1451a1f0d854c652b1639 -_ https://bitbucket.org/infinitekind/appbundler +_ "Required files could not be found" when trying to run from the .zip file +_ https://github.com/processing/processing/issues/5022 +_ use an installer instead? -_ right bracket missing error -_ https://github.com/processing/processing/issues/4702 +_ "error during export" message, but no error message contents come through +_ e.g. https://github.com/processing/processing/issues/4792 -_ library compilations handled oddly +_ library compilations not ordered properly w/ sorting +_ do we still support library compilations? that was from 2016 _ https://github.com/processing/processing/issues/4630 _ editor windows always open on display 1 _ https://github.com/processing/processing/issues/1566 -_ modify line number color when no lines extend that far? -_ https://github.com/processing/processing/pull/4560 -_ text gutter doesn't seem to be hidpi -X or is it b/c screen not quite 2x? (nope) -_ swap out the fonts? - - -medium -_ detect changes in case with libraries -_ https://github.com/processing/processing/issues/4507 -_ when opening new editor window, open on the same display as current -_ https://github.com/processing/processing/issues/4526 -_ Library path mismatch between processing-java and export -_ https://github.com/processing/processing/issues/4493 - -needs more review +needs review _ createPreprocessor() added to JavaEditor, creating a mess _ https://github.com/processing/processing/commit/2ecdc36ac7c680eb36e271d17ad80b657b3ae6a0 _ patch to core classpath by Manindra? -_ spacing of the updates number/circle in the lower right is off -_ https://github.com/processing/processing/issues/4094 -_ https://github.com/processing/processing/pull/4097 -_ solution is to create a sprite sheet as a psd that'll have better type -_ no way we're gonna fix the sizing and spacing for all platforms - - -more contribs -_ Saving sketch with the same name as a class -_ https://github.com/processing/processing/pull/4033 -_ Pasting text into PDE results in "Clipboard does not contain a string" -_ https://github.com/processing/processing/pull/4040 - known issues _ launch4j doesn't work from folders with non-native charsets _ anything in CP1252 on an English Windows system is fine @@ -179,14 +147,14 @@ _ related: https://github.com/processing/processing/issues/3543 _ mouse events (i.e. toggle breakpoint) seem to be firing twice -run/debug -_ Tweak Mode sometimes freezes while running, require a force quit -_ https://github.com/processing/processing/issues/3928 -_ TweakMode listener mess in JavaTextArea -_ https://github.com/processing/processing/issues/4605 - - gui +_ spacing of the updates number/circle in the lower right is off +_ https://github.com/processing/processing/issues/4094 +_ https://github.com/processing/processing/pull/4097 +_ solution is to create a sprite sheet as a psd that'll have better type +_ no way we're gonna fix the sizing and spacing for all platforms +_ text gutter doesn't seem to be hidpi +X or is it b/c screen not quite 2x? (nope) _ Tooltip over variable decl has wrong style and content _ make all tooltips run through our style _ https://github.com/processing/processing/issues/3940 @@ -225,9 +193,23 @@ _ how are we going to handle fonts for other languages? _ two new fonts have been added, other languages will need more _ need a decent sans with with Unicode coverage _ i.e. https://github.com/processing/processing/pull/3025 +_ Implement fallback fonts so we can use Source et al with CJK/Greek/Arabic +_ https://github.com/processing/processing/issues/5023 pde/build +_ update list of optional JRE files for Java 8 +_ Andres provided some updates +_ https://github.com/processing/processing/issues/3288 +_ these will change again for Java 11, so wait until then +_ fix appbundler problems due to rollback +_ https://github.com/processing/processing/issues/3790 +_ the rollback re-introduces two bugs (serial export and scrolling) +_ and any other changes later than 16 November 2014: +_ https://github.com/processing/processing/commits/master/build/macosx/appbundler.jar +_ https://github.com/processing/processing/commits/master/build/macosx/appbundler/native/main.m +_ https://github.com/processing/processing/commit/fa27b983e76fdbc5c4c1451a1f0d854c652b1639 +_ https://bitbucket.org/infinitekind/appbundler _ unsupported java version when trying ant run with 7u65 _ no helpful message about how to automatically download 8u51 _ ignore-tools in build.xml not being called for some reason @@ -287,6 +269,10 @@ _ might be something with libraries (native or otherwise) medium +_ detect changes in case with libraries +_ https://github.com/processing/processing/issues/4507 +_ Library path mismatch between processing-java and export +_ https://github.com/processing/processing/issues/4493 _ remove toolbar menu references and code to rebuild _ fix single instance server on OS X to load double-clicked files _ when run from Eclipse, the single instance thing punts @@ -790,6 +776,12 @@ _ https://github.com/processing/processing/issues/4445 _ need to set dock icon title on osx +PDE / Tweak + +_ TweakMode listener mess in JavaTextArea +_ https://github.com/processing/processing/issues/4605 + + PDE / Sketch & Sketchbook _ Large number of files in sketchbook folder can cause slow startup From 062126539522882727bc87b82e908cc3f983682e Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 31 Jan 2019 17:53:36 -0500 Subject: [PATCH 090/172] couple notes and trying to fix resource leaks --- core/src/processing/core/PApplet.java | 14 +++++++++++++- core/todo.txt | 2 ++ todo.txt | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 029c9483ee..75e48d507c 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -7298,10 +7298,10 @@ public byte[] loadBytes(String filename) { // If this looks like a URL, try to load it that way. Use the fact that // URL connections may have a content length header to size the array. if (filename.contains(":")) { // at least smells like URL + InputStream input = null; try { URL url = new URL(filename); URLConnection conn = url.openConnection(); - InputStream input = null; int length = -1; if (conn instanceof HttpURLConnection) { @@ -7347,6 +7347,15 @@ public byte[] loadBytes(String filename) { } catch (IOException e) { printStackTrace(e); return null; + + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + // just deal + } + } } } } @@ -7768,6 +7777,9 @@ public void saveBytes(String filename, byte[] data) { */ static private File createTempFile(File file) throws IOException { File parentDir = file.getParentFile(); + if (!parentDir.exists()) { + parentDir.mkdirs(); + } String name = file.getName(); String prefix; String suffix = null; diff --git a/core/todo.txt b/core/todo.txt index 0c2b2c79cc..0b70bd7f5f 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,4 +1,6 @@ 0269 (3.5.3) +X deal with possible resource leak when loading URLs +X create intermediate folders when saving temp files contrib diff --git a/todo.txt b/todo.txt index b55b6995e7..1a9a698cbd 100755 --- a/todo.txt +++ b/todo.txt @@ -153,6 +153,7 @@ _ https://github.com/processing/processing/issues/4094 _ https://github.com/processing/processing/pull/4097 _ solution is to create a sprite sheet as a psd that'll have better type _ no way we're gonna fix the sizing and spacing for all platforms +_ more than a certain amount should just be 10+, +, or whatever _ text gutter doesn't seem to be hidpi X or is it b/c screen not quite 2x? (nope) _ Tooltip over variable decl has wrong style and content From 21522274da7ba44284e362eec21a7fe78fa9ee28 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 31 Jan 2019 18:57:21 -0500 Subject: [PATCH 091/172] fixing more resource leaks in loadJSONObject() and loadJSONArray() --- core/src/processing/core/PApplet.java | 128 ++++++++++++++++---------- core/todo.txt | 1 + 2 files changed, 82 insertions(+), 47 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 75e48d507c..b54d0e91b3 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -6076,14 +6076,31 @@ public JSONObject parseJSONObject(String input) { * @see PApplet#saveJSONArray(JSONArray, String) */ public JSONObject loadJSONObject(String filename) { - return new JSONObject(createReader(filename)); + // can't pass of createReader() to the constructor b/c of resource leak + BufferedReader reader = createReader(filename); + JSONObject outgoing = new JSONObject(reader); + try { + reader.close(); + } catch (IOException e) { // not sure what would cause this + e.printStackTrace(); + } + return outgoing; } + /** * @nowebref */ static public JSONObject loadJSONObject(File file) { - return new JSONObject(createReader(file)); + // can't pass of createReader() to the constructor b/c of resource leak + BufferedReader reader = createReader(file); + JSONObject outgoing = new JSONObject(reader); + try { + reader.close(); + } catch (IOException e) { // not sure what would cause this + e.printStackTrace(); + } + return outgoing; } @@ -6101,6 +6118,7 @@ public boolean saveJSONObject(JSONObject json, String filename) { return saveJSONObject(json, filename, null); } + /** * @param options "compact" and "indent=N", replace N with the number of spaces */ @@ -6129,12 +6147,28 @@ public JSONArray parseJSONArray(String input) { * @see PApplet#saveJSONArray(JSONArray, String) */ public JSONArray loadJSONArray(String filename) { - return new JSONArray(createReader(filename)); + // can't pass of createReader() to the constructor b/c of resource leak + BufferedReader reader = createReader(filename); + JSONArray outgoing = new JSONArray(reader); + try { + reader.close(); + } catch (IOException e) { // not sure what would cause this + e.printStackTrace(); + } + return outgoing; } static public JSONArray loadJSONArray(File file) { - return new JSONArray(createReader(file)); + // can't pass of createReader() to the constructor b/c of resource leak + BufferedReader reader = createReader(file); + JSONArray outgoing = new JSONArray(reader); + try { + reader.close(); + } catch (IOException e) { // not sure what would cause this + e.printStackTrace(); + } + return outgoing; } @@ -12126,11 +12160,11 @@ public void rect(float a, float b, float c, float d, /** * ( begin auto-generated from square.xml ) * - * Draws a square to the screen. A square is a four-sided shape with - * every angle at ninety degrees and each side is the same length. - * By default, the first two parameters set the location of the - * upper-left corner, the third sets the width and height. The way - * these parameters are interpreted, however, may be changed with the + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the * rectMode() function. * * ( end auto-generated ) @@ -12239,9 +12273,9 @@ public void arc(float a, float b, float c, float d, /** * ( begin auto-generated from circle.xml ) * - * Draws a circle to the screen. By default, the first two parameters - * set the location of the center, and the third sets the shape's width - * and height. The origin may be changed with the ellipseMode() + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() * function. * * ( end auto-generated ) @@ -13283,28 +13317,28 @@ public void text(float num, float x, float y, float z) { /** * ( begin auto-generated from push.xml ) * - * The push() function saves the current drawing style - * settings and transformations, while pop() restores these - * settings. Note that these functions are always used together. - * They allow you to change the style and transformation settings - * and later return to what you had. When a new state is started - * with push(), it builds on the current style and transform + * The push() function saves the current drawing style + * settings and transformations, while pop() restores these + * settings. Note that these functions are always used together. + * They allow you to change the style and transformation settings + * and later return to what you had. When a new state is started + * with push(), it builds on the current style and transform * information.
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) @@ -13321,28 +13355,28 @@ public void push() { /** * ( begin auto-generated from pop.xml ) * - * The pop() function restores the previous drawing style - * settings and transformations after push() has changed them. - * Note that these functions are always used together. They allow - * you to change the style and transformation settings and later - * return to what you had. When a new state is started with push(), + * The pop() function restores the previous drawing style + * settings and transformations after push() has changed them. + * Note that these functions are always used together. They allow + * you to change the style and transformation settings and later + * return to what you had. When a new state is started with push(), * it builds on the current style and transform information.
*
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) diff --git a/core/todo.txt b/core/todo.txt index 0b70bd7f5f..27e28e6ed1 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,6 +1,7 @@ 0269 (3.5.3) X deal with possible resource leak when loading URLs X create intermediate folders when saving temp files +X fix resource leaks (open files) in loadJSONObject and loadJSONArray contrib From f8b794db63f7b2e849880ae516baea8fe1f3d08f Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 1 Feb 2019 16:57:22 -0500 Subject: [PATCH 092/172] write release notes --- build/shared/revisions.txt | 44 ++++++++++++++++++++++++++++++++++++++ core/todo.txt | 8 +++---- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 21ab9dda3d..870b9014c6 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,3 +1,47 @@ +PROCESSING 3.5.3 (REV 0269) - 1 February 2019 + +This fixes a typo that left the "Redo" command with the wrong +key shortcut on Windows in the last release, adds updated reference, +and includes a handful of other smaller fixes. + + +[ fixes ] + ++ "Redo" key shortcut for Windows screwed up + https://github.com/processing/processing/issues/5773 + ++ Fix an editor problem with plain text (css, etc) files + https://github.com/processing/processing/issues/5628 + ++ Default to using java.awt.Desktop methods for URLs/files when available + on Linux. Also cover a few weird cases that were failing silently. + ++ Ignore .class files found in the META-INF folder for imported JARs + https://github.com/processing/processing/issues/5778 + + ++ Fix up and clean a few file i/o issues that were causing resource + leaks with loadXxxx() commands, and intermediate folders not being + created for temporary files used by the saveXxxx() commands. + + +[ additions ] + ++ Added reference for circle(), square(), push(), pop() + + +[ contributions ] + ++ Updated translation of the word "sketch" for Russian speakers + https://github.com/processing/processing/pull/5673 + ++ Update missing @Deprecated tags in PApplet.java + https://github.com/processing/processing/pull/5686 + + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + PROCESSING 3.5.2 (REV 0268) - 22 January 2019 Fixed a pair of nasty regressions, and adding a couple key shortcuts diff --git a/core/todo.txt b/core/todo.txt index 27e28e6ed1..3265b5a332 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,8 +1,8 @@ 0269 (3.5.3) -X deal with possible resource leak when loading URLs -X create intermediate folders when saving temp files -X fix resource leaks (open files) in loadJSONObject and loadJSONArray - +X fix/clean a few file i/o issues +X deal with possible resource leak when loading URLs +X create intermediate folders when saving temp files +X fix resource leaks (open files) in loadJSONObject and loadJSONArray contrib X Update missing @Deprecated tags in PApplet.java From ff1dc3f56123c75e76a12619d7377da3b8ca2cc7 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 3 Feb 2019 16:04:45 -0500 Subject: [PATCH 093/172] updating date for release --- build/shared/revisions.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 870b9014c6..06c5d4ba71 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,4 +1,4 @@ -PROCESSING 3.5.3 (REV 0269) - 1 February 2019 +PROCESSING 3.5.3 (REV 0269) - 3 February 2019 This fixes a typo that left the "Redo" command with the wrong key shortcut on Windows in the last release, adds updated reference, From dd9f2404f8be15cffbdf815dca6cb328f47b6617 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 3 Feb 2019 16:22:17 -0500 Subject: [PATCH 094/172] fix "could not parse -1 for --display" message --- build/shared/revisions.txt | 1 + core/src/processing/core/PApplet.java | 8 +++++--- core/todo.txt | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 06c5d4ba71..90daa44f8e 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -19,6 +19,7 @@ and includes a handful of other smaller fixes. + Ignore .class files found in the META-INF folder for imported JARs https://github.com/processing/processing/issues/5778 ++ Get rid of errant 'Could not parse -1 for display' message. + Fix up and clean a few file i/o issues that were causing resource leaks with loadXxxx() commands, and intermediate folders not being diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index b54d0e91b3..af6eb7f1e7 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -10758,9 +10758,11 @@ public void uncaughtException(Thread t, Throwable e) { editorLocation = parseInt(split(value, ',')); } else if (param.equals(ARGS_DISPLAY)) { - displayNum = parseInt(value, -1); - if (displayNum == -1) { - System.err.println("Could not parse " + value + " for " + ARGS_DISPLAY); + displayNum = parseInt(value, -2); + if (displayNum == -2) { + // this means the display value couldn't be parsed properly + System.err.println(value + " is not a valid choice for " + ARGS_DISPLAY); + displayNum = -1; // use the default } } else if (param.equals(ARGS_WINDOW_COLOR)) { diff --git a/core/todo.txt b/core/todo.txt index 3265b5a332..228834415f 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -3,6 +3,7 @@ X fix/clean a few file i/o issues X deal with possible resource leak when loading URLs X create intermediate folders when saving temp files X fix resource leaks (open files) in loadJSONObject and loadJSONArray +X get rid of errant 'Could not parse -1 for display' message contrib X Update missing @Deprecated tags in PApplet.java From 13fa808ccb35482f6b9ab4f9c732e2ad465fb0d2 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 3 Feb 2019 16:40:30 -0500 Subject: [PATCH 095/172] space removal --- core/src/processing/core/PApplet.java | 86 +++++++++++++-------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index af6eb7f1e7..db2f562ba4 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -12162,11 +12162,11 @@ public void rect(float a, float b, float c, float d, /** * ( begin auto-generated from square.xml ) * - * Draws a square to the screen. A square is a four-sided shape with - * every angle at ninety degrees and each side is the same length. - * By default, the first two parameters set the location of the - * upper-left corner, the third sets the width and height. The way - * these parameters are interpreted, however, may be changed with the + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the * rectMode() function. * * ( end auto-generated ) @@ -12275,9 +12275,9 @@ public void arc(float a, float b, float c, float d, /** * ( begin auto-generated from circle.xml ) * - * Draws a circle to the screen. By default, the first two parameters - * set the location of the center, and the third sets the shape's width - * and height. The origin may be changed with the ellipseMode() + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() * function. * * ( end auto-generated ) @@ -13319,28 +13319,28 @@ public void text(float num, float x, float y, float z) { /** * ( begin auto-generated from push.xml ) * - * The push() function saves the current drawing style - * settings and transformations, while pop() restores these - * settings. Note that these functions are always used together. - * They allow you to change the style and transformation settings - * and later return to what you had. When a new state is started - * with push(), it builds on the current style and transform + * The push() function saves the current drawing style + * settings and transformations, while pop() restores these + * settings. Note that these functions are always used together. + * They allow you to change the style and transformation settings + * and later return to what you had. When a new state is started + * with push(), it builds on the current style and transform * information.
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) @@ -13357,28 +13357,28 @@ public void push() { /** * ( begin auto-generated from pop.xml ) * - * The pop() function restores the previous drawing style - * settings and transformations after push() has changed them. - * Note that these functions are always used together. They allow - * you to change the style and transformation settings and later - * return to what you had. When a new state is started with push(), + * The pop() function restores the previous drawing style + * settings and transformations after push() has changed them. + * Note that these functions are always used together. They allow + * you to change the style and transformation settings and later + * return to what you had. When a new state is started with push(), * it builds on the current style and transform information.
*
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) From be7e25187b289f9bfa622113c400e26dd76dc89b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 3 Feb 2019 17:12:08 -0500 Subject: [PATCH 096/172] starting the next release --- app/src/processing/app/Base.java | 4 ++-- core/done.txt | 12 ++++++++++++ core/todo.txt | 11 +---------- done.txt | 24 ++++++++++++++++++++++++ todo.txt | 23 +---------------------- 5 files changed, 40 insertions(+), 34 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index ca56ccea00..91472a09e9 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -56,9 +56,9 @@ public class Base { // Added accessors for 0218 because the UpdateCheck class was not properly // updating the values, due to javac inlining the static final values. - static private final int REVISION = 269; + static private final int REVISION = 270; /** This might be replaced by main() if there's a lib/version.txt file. */ - static private String VERSION_NAME = "0269"; //$NON-NLS-1$ + static private String VERSION_NAME = "0270"; //$NON-NLS-1$ /** Set true if this a proper release rather than a numbered revision. */ /** diff --git a/core/done.txt b/core/done.txt index 616a6b0502..abbdd66c29 100644 --- a/core/done.txt +++ b/core/done.txt @@ -1,3 +1,15 @@ +0269 (3.5.3) +X fix/clean a few file i/o issues +X deal with possible resource leak when loading URLs +X create intermediate folders when saving temp files +X fix resource leaks (open files) in loadJSONObject and loadJSONArray +X get rid of errant 'Could not parse -1 for display' message + +contrib +X Update missing @Deprecated tags in PApplet.java +X https://github.com/processing/processing/pull/5686 + + 0268 (3.5.2) X Ctrl-click on Mac OS X result in all subsequent clicks reported as right-click X https://github.com/processing/processing/issues/5765 diff --git a/core/todo.txt b/core/todo.txt index 228834415f..460e75a176 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,13 +1,4 @@ -0269 (3.5.3) -X fix/clean a few file i/o issues -X deal with possible resource leak when loading URLs -X create intermediate folders when saving temp files -X fix resource leaks (open files) in loadJSONObject and loadJSONArray -X get rid of errant 'Could not parse -1 for display' message - -contrib -X Update missing @Deprecated tags in PApplet.java -X https://github.com/processing/processing/pull/5686 +0270 (3.5.4 or 3.6) high-ish diff --git a/done.txt b/done.txt index a4734cba50..1da976c40b 100644 --- a/done.txt +++ b/done.txt @@ -1,3 +1,27 @@ +0269 (3.5.3) +X added reference for circle(), square(), push(), pop() +X has the reference.zip file been fixed? (yep) +X redo key command for Windows screwed up +X https://github.com/processing/processing/issues/5773 +X fix an editor problem with plain text (css, etc) files +X https://github.com/processing/processing/issues/5628 +X default to using Desktop methods for URLs and files when available on Linux +X also cover a few weird cases that were failing silently +X The package "META" does not exist when .class files found in META-INF folder +X https://github.com/processing/processing/issues/5778 + +contrib +X update translation of "sketch" for Russian speakers +X https://github.com/processing/processing/pull/5673 + +cleaning +o modify line number color when no lines extend that far? +o https://github.com/processing/processing/pull/4560 +o when opening new editor window, open on the same display as current +o https://github.com/processing/processing/issues/4526 +X closing as dupe of the other issue + + 0268 (3.5.2) X shortcuts not working on Windows/Linux (using meta) X https://github.com/processing/processing/issues/5763 diff --git a/todo.txt b/todo.txt index 1a9a698cbd..0a95844339 100755 --- a/todo.txt +++ b/todo.txt @@ -1,25 +1,4 @@ -0269 (3.5.3) -X added reference for circle(), square(), push(), pop() -X has the reference.zip file been fixed? (yep) -X redo key command for Windows screwed up -X https://github.com/processing/processing/issues/5773 -X fix an editor problem with plain text (css, etc) files -X https://github.com/processing/processing/issues/5628 -X default to using Desktop methods for URLs and files when available on Linux -X also cover a few weird cases that were failing silently -X The package "META" does not exist when .class files found in META-INF folder -X https://github.com/processing/processing/issues/5778 - -contrib -X update translation of "sketch" for Russian speakers -X https://github.com/processing/processing/pull/5673 - -cleaning -o modify line number color when no lines extend that far? -o https://github.com/processing/processing/pull/4560 -o when opening new editor window, open on the same display as current -o https://github.com/processing/processing/issues/4526 -X closing as dupe of the other issue +0270 (3.5.4 or 3.6) contrib From 0f7c9ccea318e257de0acce2f272d55ab6b8cbb2 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 15 Feb 2019 14:59:39 -0500 Subject: [PATCH 097/172] use ctrl-page up/down for tabs on Windows (fixes #5794) --- build/shared/lib/languages/PDE.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index 5682fcc094..0f312730fd 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -331,11 +331,11 @@ editor.header.rename = Rename editor.header.delete = Delete editor.header.previous_tab = Previous Tab editor.header.previous_tab.keystroke.macosx = meta alt pressed LEFT -editor.header.previous_tab.keystroke.windows = ctrl alt pressed LEFT +editor.header.previous_tab.keystroke.windows = ctrl pressed PAGE_UP editor.header.previous_tab.keystroke.linux = ctrl pressed PAGE_UP editor.header.next_tab = Next Tab editor.header.next_tab.keystroke.macosx = meta alt pressed RIGHT -editor.header.next_tab.keystroke.windows = ctrl alt pressed RIGHT +editor.header.next_tab.keystroke.windows = ctrl pressed PAGE_DOWN editor.header.next_tab.keystroke.linux = ctrl pressed PAGE_DOWN editor.header.delete.warning.title = Yeah, no. editor.header.delete.warning.text = You cannot delete the main tab of the only open sketch. From 799234487be3dd7f393a0a7f50f94fece1ec7b17 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 15 Feb 2019 16:05:16 -0500 Subject: [PATCH 098/172] recent issues --- core/todo.txt | 2 ++ todo.txt | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/core/todo.txt b/core/todo.txt index 460e75a176..210aa85be9 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,4 +1,6 @@ 0270 (3.5.4 or 3.6) +_ size() issues on Mojave? +_ https://github.com/processing/processing/issues/5791 high-ish diff --git a/todo.txt b/todo.txt index 0a95844339..e78251c37c 100755 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,16 @@ 0270 (3.5.4 or 3.6) +X use ctrl-page up/down for tabs on Windows +X https://github.com/processing/processing/issues/5794 + + +_ show the recommended sw version on the download page +_ just skip the welcome screen on Windows hidpi dipslays? + +_ refresh option for sketchbook +_ import option for sketchbook +_ 'show sketch folder' weird when in temp folder +_ ask to save first (sketch has not been saved yet) +_ same with adding files to an unsaved sketch, do we block that? contrib @@ -9,9 +21,13 @@ _ https://github.com/processing/processing/pull/4040 high +_ run button not deactivating +_ https://github.com/processing/processing/issues/5786 _ Find in Reference disabled for various keywords (draw, for, if, catch, while) _ https://github.com/processing/processing/issues/5562 _ https://github.com/processing/processing/pull/5642 +_ sketch window placement not recorded +_ https://github.com/processing/processing/issues/5781 _ errors inside setup() aren't coming through at all? _ seen in Eclipse; have to turn on the debugger... same as #4703? _ Welcome screen doesn't size properly for HiDPI screens From 880fdac3352518637f1b2cd54d54919ff58f8ed5 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 2 Mar 2019 17:53:48 -0500 Subject: [PATCH 099/172] documentation note about 0-indexing --- app/src/processing/app/Problem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/processing/app/Problem.java b/app/src/processing/app/Problem.java index 7cd93db511..cb12ad5e3e 100644 --- a/app/src/processing/app/Problem.java +++ b/app/src/processing/app/Problem.java @@ -26,7 +26,7 @@ public interface Problem { public boolean isWarning(); public int getTabIndex(); - public int getLineNumber(); + public int getLineNumber(); // 0-indexed public String getMessage(); public int getStartOffset(); From 09ed4763aa47da3acf4aecfc249f7fd3ece637d3 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 2 Mar 2019 17:55:50 -0500 Subject: [PATCH 100/172] fix typo with error highlighting? --- app/src/processing/app/ui/Editor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index 7bfacc238a..6780a53100 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -3083,9 +3083,9 @@ public void updateErrorTable(List problems) { } - public void highlight(Problem p) { + public void highlight(Problem p) { if (p != null) { - highlight(p.getTabIndex(), p.getStartOffset(), p.getStartOffset()); + highlight(p.getTabIndex(), p.getStartOffset(), p.getStopOffset()); } } From e0defac4a8d05d6a91090a8dcf964d25671edc9d Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 2 Mar 2019 17:57:42 -0500 Subject: [PATCH 101/172] clean up some formatting and ordering issues --- .../mode/java/VariableInspector.java | 8 ++-- .../mode/java/pdex/ErrorChecker.java | 42 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/java/src/processing/mode/java/VariableInspector.java b/java/src/processing/mode/java/VariableInspector.java index 8f6b2fc2d0..66eeba869a 100644 --- a/java/src/processing/mode/java/VariableInspector.java +++ b/java/src/processing/mode/java/VariableInspector.java @@ -244,10 +244,10 @@ Container createScrollPane() { //System.out.println("renderer: " + tree.getDefaultRenderer(String.class).getClass()); //System.out.println("editor: " + tree.getDefaultEditor(String.class).getClass()); - callStack = new ArrayList(); - locals = new ArrayList(); - thisFields = new ArrayList(); - declaredThisFields = new ArrayList(); + callStack = new ArrayList<>(); + locals = new ArrayList<>(); + thisFields = new ArrayList<>(); + declaredThisFields = new ArrayList<>(); // Remove ugly (and unused) focus border on OS X scrollPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); diff --git a/java/src/processing/mode/java/pdex/ErrorChecker.java b/java/src/processing/mode/java/pdex/ErrorChecker.java index 8a4d387d40..4c735bc7f9 100644 --- a/java/src/processing/mode/java/pdex/ErrorChecker.java +++ b/java/src/processing/mode/java/pdex/ErrorChecker.java @@ -144,18 +144,21 @@ private void handleSketchProblems(PreprocessedSketch ps) { EventQueue.invokeLater(() -> editor.setProblemList(problems)); } }; - scheduledUiUpdate = scheduler.schedule(uiUpdater, delay, - TimeUnit.MILLISECONDS); + scheduledUiUpdate = + scheduler.schedule(uiUpdater, delay, TimeUnit.MILLISECONDS); } + static private JavaProblem convertIProblem(IProblem iproblem, PreprocessedSketch ps) { SketchInterval in = ps.mapJavaToSketch(iproblem); - if (in == SketchInterval.BEFORE_START) return null; - String badCode = ps.getPdeCode(in); - int line = ps.tabOffsetToTabLine(in.tabIndex, in.startTabOffset); - JavaProblem p = JavaProblem.fromIProblem(iproblem, in.tabIndex, line, badCode); - p.setPDEOffsets(in.startTabOffset, in.stopTabOffset); - return p; + if (in != SketchInterval.BEFORE_START) { + String badCode = ps.getPdeCode(in); + int line = ps.tabOffsetToTabLine(in.tabIndex, in.startTabOffset); + JavaProblem p = JavaProblem.fromIProblem(iproblem, in.tabIndex, line, badCode); + p.setPDEOffsets(in.startTabOffset, in.stopTabOffset); + return p; + } + return null; } @@ -168,23 +171,20 @@ static private boolean isUndefinedTypeProblem(IProblem iproblem) { static private boolean isMissingBraceProblem(IProblem iproblem) { - switch (iproblem.getID()) { - case IProblem.ParsingErrorInsertToComplete: { - char brace = iproblem.getArguments()[0].charAt(0); - return brace == '{' || brace == '}'; - } - case IProblem.ParsingErrorInsertTokenAfter: { - char brace = iproblem.getArguments()[1].charAt(0); - return brace == '{' || brace == '}'; - } - default: - return false; + if (iproblem.getID() == IProblem.ParsingErrorInsertToComplete) { + char brace = iproblem.getArguments()[0].charAt(0); + return brace == '{' || brace == '}'; + + } else if (iproblem.getID() == IProblem.ParsingErrorInsertTokenAfter) { + char brace = iproblem.getArguments()[1].charAt(0); + return brace == '{' || brace == '}'; } + return false; } - private static final Pattern CURLY_QUOTE_REGEX = - Pattern.compile("([“”‘’])", Pattern.UNICODE_CHARACTER_CLASS); + static private final Pattern CURLY_QUOTE_REGEX = + Pattern.compile("([“”‘’])", Pattern.UNICODE_CHARACTER_CLASS); static private List checkForCurlyQuotes(PreprocessedSketch ps) { List problems = new ArrayList<>(0); From cec3ae3b6e336e48c2a2eef5358c94bf3700c130 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 2 Mar 2019 17:57:58 -0500 Subject: [PATCH 102/172] notes about current status --- core/todo.txt | 2 ++ todo.txt | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/core/todo.txt b/core/todo.txt index 210aa85be9..739c891398 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,6 +1,8 @@ 0270 (3.5.4 or 3.6) _ size() issues on Mojave? _ https://github.com/processing/processing/issues/5791 +_ use exit event to set mouseY to 0 on macOS +_ https://github.com/processing/processing/pull/5796/files high-ish diff --git a/todo.txt b/todo.txt index e78251c37c..1d7abd5487 100755 --- a/todo.txt +++ b/todo.txt @@ -1,7 +1,15 @@ 0270 (3.5.4 or 3.6) X use ctrl-page up/down for tabs on Windows X https://github.com/processing/processing/issues/5794 +X fix potential highlighting issue that wasn't selecting portions of text +_ "Could not get the settings folder" isn't very helpful +_ https://github.com/processing/processing/issues/5744 +_ need to check the locations it'd be writing to, and see if available +_ then tell the user which folder to fix + +_ i18n support for Modes +_ https://github.com/processing/processing/commit/0ed2fc139c3c5dfe0a1702ed8348987b3c6a5c9d _ show the recommended sw version on the download page _ just skip the welcome screen on Windows hidpi dipslays? From 676bcec1ca79aa0fceec2445e5febecdf9d3eb53 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 9 Mar 2019 13:38:22 -0500 Subject: [PATCH 103/172] note about possible pdf fix --- core/todo.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/todo.txt b/core/todo.txt index 739c891398..a5d49046a3 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -4,6 +4,9 @@ _ https://github.com/processing/processing/issues/5791 _ use exit event to set mouseY to 0 on macOS _ https://github.com/processing/processing/pull/5796/files +_ possible fix for precision issues with PDF +_ https://github.com/processing/processing/issues/5801#issuecomment-466632459 + high-ish _ add separator option to loadTable() From 8a3b2f191ea811959fab475d5a5579c886e30fe9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 21 Apr 2019 08:12:20 -0400 Subject: [PATCH 104/172] preserve file attributes so things don't appear modified; fix some indents lost in tab conversion --- build/build.xml | 17 ++++---- core/build.xml | 27 +++++++------ java/build.xml | 105 +++++++++++++++++++++++------------------------- 3 files changed, 73 insertions(+), 76 deletions(-) diff --git a/build/build.xml b/build/build.xml index fdd1d9a08a..bcc3ca42a4 100644 --- a/build/build.xml +++ b/build/build.xml @@ -388,11 +388,11 @@ message="Do not call assemble from the command line." /> - + - + @@ -403,7 +403,8 @@ - + @@ -643,7 +644,7 @@ - + @@ -785,7 +786,7 @@ - + @@ -818,7 +819,7 @@ - + @@ -1073,7 +1074,7 @@ - + @@ -1094,7 +1095,7 @@ - + diff --git a/core/build.xml b/core/build.xml index 0b82eba67e..e1bf0fd5fc 100644 --- a/core/build.xml +++ b/core/build.xml @@ -15,20 +15,20 @@ - - + - @@ -51,8 +51,8 @@ includeAntRuntime="false" debug="true" destdir="bin" - classpath="apple.jar; - library/jogl-all.jar; + classpath="apple.jar; + library/jogl-all.jar; library/gluegen-rt.jar" nowarn="true"> @@ -61,23 +61,24 @@ - + - + - + - + - + diff --git a/java/build.xml b/java/build.xml index 32932744b5..0fda9c2c55 100644 --- a/java/build.xml +++ b/java/build.xml @@ -1,15 +1,15 @@ - + - + - + @@ -23,12 +23,12 @@ - - - - - - + + + + + + @@ -37,9 +37,9 @@ - + @@ -49,28 +49,24 @@ - + - + - + - + @@ -86,38 +82,37 @@ - - + + https://github.com/processing/processing/issues/1792 --> + debug="on" + nowarn="true" + compiler="org.eclipse.jdt.core.JDTCompilerAdapter"> - From f25160db77d31004e1321d51c279dcb808b6ae7b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 21 Apr 2019 08:30:47 -0400 Subject: [PATCH 105/172] update AppBundler, use newer macOS SDK, preserve attributes where possible --- build/macosx/appbundler.jar | Bin 143975 -> 139110 bytes build/macosx/appbundler/build.xml | 13 +++++++------ .../com/oracle/appbundler/AppBundlerTask.java | 13 +++++++++---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/build/macosx/appbundler.jar b/build/macosx/appbundler.jar index 0102f306a9e0e01ca9f283e047c30891056380a5..42cc8f18cdc81f88ddfa7442762c0fb2ae4d6487 100644 GIT binary patch delta 19088 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∨4|G5+n%oO*EyIHwi5&bH3XATP1Lg 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 MtQaTv-A6(BKfwDM`v3p{ diff --git a/build/macosx/appbundler/build.xml b/build/macosx/appbundler/build.xml index 9b48b2bb5c..4d02204175 100644 --- a/build/macosx/appbundler/build.xml +++ b/build/macosx/appbundler/build.xml @@ -33,8 +33,8 @@ questions. version=1.0ea --> - - + + @@ -73,7 +73,8 @@ questions. - + + @@ -87,10 +88,10 @@ questions. - - + + diff --git a/build/macosx/appbundler/src/com/oracle/appbundler/AppBundlerTask.java b/build/macosx/appbundler/src/com/oracle/appbundler/AppBundlerTask.java index 8009c78b25..df4c26bc73 100644 --- a/build/macosx/appbundler/src/com/oracle/appbundler/AppBundlerTask.java +++ b/build/macosx/appbundler/src/com/oracle/appbundler/AppBundlerTask.java @@ -458,6 +458,7 @@ private void copyResources(File resourcesDirectory) throws IOException { } finally { outputStream.close(); } + file.setLastModified(zipEntry.getTime()); } zipEntry = zipInputStream.getNextEntry(); } @@ -729,7 +730,9 @@ private static void delete(File file) throws IOException { private static void copy(URL location, File file) throws IOException { try (InputStream in = location.openStream()) { - Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING); + Files.copy(in, file.toPath(), + // can't do attributes when coming from URL + StandardCopyOption.REPLACE_EXISTING); } } @@ -740,13 +743,15 @@ private static void copy(File source, File destination) throws IOException { destination.getParentFile().mkdirs(); - Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING, LinkOption.NOFOLLOW_LINKS); + Files.copy(sourcePath, destinationPath, + StandardCopyOption.REPLACE_EXISTING, + StandardCopyOption.COPY_ATTRIBUTES, + LinkOption.NOFOLLOW_LINKS); if (Files.isDirectory(sourcePath, LinkOption.NOFOLLOW_LINKS)) { String[] files = source.list(); - for (int i = 0; i < files.length; i++) { - String file = files[i]; + for (String file : files) { copy(new File(source, file), new File(destination, file)); } } From 238b75d7c261997cce3794db94deeae049affd2c Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 21 Apr 2019 09:17:42 -0400 Subject: [PATCH 106/172] notes about build changes --- todo.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/todo.txt b/todo.txt index 1d7abd5487..6e714bdb8f 100755 --- a/todo.txt +++ b/todo.txt @@ -2,6 +2,8 @@ X use ctrl-page up/down for tabs on Windows X https://github.com/processing/processing/issues/5794 X fix potential highlighting issue that wasn't selecting portions of text +X update AppBundler to use newer SDK, recompile +X edit build.xml files and appbundler to preserve more attributes _ "Could not get the settings folder" isn't very helpful _ https://github.com/processing/processing/issues/5744 From 37108add372272d7b1fc23d2500dce911c4d1098 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 22 Apr 2019 20:30:32 -0400 Subject: [PATCH 107/172] attempt to use 8u212, but Oracle has broken the download --- build/build.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/build.xml b/build/build.xml index bcc3ca42a4..c7061c2c3d 100644 --- a/build/build.xml +++ b/build/build.xml @@ -77,6 +77,12 @@ or http://stackoverflow.com/q/10268583 --> + + From 5ce3b56b828ecc5f01d55f4f80c392d11ae8113d Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 11:46:35 -0700 Subject: [PATCH 108/172] Hide 'items' param for StringList --- core/src/processing/data/StringList.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/processing/data/StringList.java b/core/src/processing/data/StringList.java index c4de6d33c0..2123a61432 100644 --- a/core/src/processing/data/StringList.java +++ b/core/src/processing/data/StringList.java @@ -49,6 +49,8 @@ public StringList(String[] list) { /** * Construct a StringList from a random pile of objects. Null values will * stay null, but all the others will be converted to String values. + * + * @nowebref */ public StringList(Object... items) { count = items.length; From 2811c75fe891366a9a51c3017073408c7ccec632 Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 12:23:02 -0700 Subject: [PATCH 109/172] curvePoint() reference update --- core/src/processing/core/PGraphics.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 65bcb280d0..c4168a362c 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -3424,17 +3424,17 @@ public void bezier(float x1, float y1, float z1, * ( begin auto-generated from curvePoint.xml ) * * Evalutes the curve at point t for points a, b, c, d. The parameter t - * varies between 0 and 1, a and d are points on the curve, and b and c are - * the control points. This can be done once with the x coordinates and a + * varies between 0 and 1, a and d are the control points, and b and c are + * the points on the curve. This can be done once with the x coordinates and a * second time with the y coordinates to get the location of a curve at t. * * ( end auto-generated ) * * @webref shape:curves - * @param a coordinate of first point on the curve - * @param b coordinate of second point on the curve - * @param c coordinate of third point on the curve - * @param d coordinate of fourth point on the curve + * @param a coordinate of first control point + * @param b coordinate of first point on the curve + * @param c coordinate of second point on the curve + * @param d coordinate of second control point * @param t value between 0 and 1 * @see PGraphics#curve(float, float, float, float, float, float, float, float, float, float, float, float) * @see PGraphics#curveVertex(float, float) From 19657b6d45a689471a65bffe4c3085bb665db890 Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 12:42:01 -0700 Subject: [PATCH 110/172] Reference change to PApplet --- core/src/processing/core/PApplet.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index db2f562ba4..7f22ac3570 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -12573,17 +12573,17 @@ public void bezier(float x1, float y1, float z1, * ( begin auto-generated from curvePoint.xml ) * * Evalutes the curve at point t for points a, b, c, d. The parameter t - * varies between 0 and 1, a and d are points on the curve, and b and c are - * the control points. This can be done once with the x coordinates and a + * varies between 0 and 1, a and d are the control points, and b and c are + * the points on the curve. This can be done once with the x coordinates and a * second time with the y coordinates to get the location of a curve at t. * * ( end auto-generated ) * * @webref shape:curves - * @param a coordinate of first point on the curve - * @param b coordinate of second point on the curve - * @param c coordinate of third point on the curve - * @param d coordinate of fourth point on the curve + * @param a coordinate of first control point + * @param b coordinate of first point on the curve + * @param c coordinate of second point on the curve + * @param d coordinate of second control point * @param t value between 0 and 1 * @see PGraphics#curve(float, float, float, float, float, float, float, float, float, float, float, float) * @see PGraphics#curveVertex(float, float) From 985dfdaccfd0f85ac468dc24395b7a4aa1630fc5 Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 12:47:22 -0700 Subject: [PATCH 111/172] Remove redundant params for Server reference --- java/libraries/net/src/processing/net/Server.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/libraries/net/src/processing/net/Server.java b/java/libraries/net/src/processing/net/Server.java index e027142fa9..61a877202a 100644 --- a/java/libraries/net/src/processing/net/Server.java +++ b/java/libraries/net/src/processing/net/Server.java @@ -73,8 +73,6 @@ public Server(PApplet parent, int port) { /** - * @param parent typically use "this" - * @param port port used to transfer data * @param host when multiple NICs are in use, the ip (or name) to bind from */ public Server(PApplet parent, int port, String host) { From 48ab85c55d6f6f37e5af6840df3eaa4a81ddc53b Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 14:08:47 -0700 Subject: [PATCH 112/172] Reference update for XML getChild() --- core/src/processing/data/XML.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/processing/data/XML.java b/core/src/processing/data/XML.java index 49880c8887..7089e65db3 100644 --- a/core/src/processing/data/XML.java +++ b/core/src/processing/data/XML.java @@ -440,8 +440,7 @@ public XML[] getChildren() { /** * Quick accessor for an element at a particular index. * - * @webref xml:method - * @brief Returns the child element with the specified index value or path + * @nowebref */ public XML getChild(int index) { checkChildren(); @@ -452,6 +451,8 @@ public XML getChild(int index) { /** * Get a child by its name or path. * + * @webref xml:method + * @brief Returns the child element with the specified index value or path * @param name element name or path/to/element * @return the first matching element or null if no match */ From 63394a8744330582c5fbead1b4d254de8ae2f7f2 Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 14:52:53 -0700 Subject: [PATCH 113/172] Reference documentation for the 'str' parameter for text() --- core/src/processing/core/PApplet.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 7f22ac3570..35c3f848c1 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -13220,6 +13220,8 @@ public void text(char c, float x, float y, float z) { * Newlines that are \n (Unix newline or linefeed char, ascii 10) * are honored, but \r (carriage return, Windows and Mac OS) are * ignored. + * + * @param str the String to be displayed */ public void text(String str, float x, float y) { if (recorder != null) recorder.text(str, x, y); From de0dca8397f7d05ccaf9d131e9aaf9786d765499 Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 14:56:54 -0700 Subject: [PATCH 114/172] Reference, add more related functions to size() --- core/src/processing/core/PApplet.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 35c3f848c1..8250890238 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -2000,6 +2000,9 @@ public void fullScreen(String renderer, int display) { * @param height height of the display window in units of pixels * @see PApplet#width * @see PApplet#height + * @see PApplet#setup() + * @see PApplet#settings() + * @see PApplet#fullscreen() */ public void size(int width, int height) { // Check to make sure the width/height have actually changed. It's ok to From 62d3e6524da540358c53608abfe2c180f86b1181 Mon Sep 17 00:00:00 2001 From: REAS Date: Thu, 25 Jul 2019 16:43:59 -0700 Subject: [PATCH 115/172] Add 'gray' parameter info to reference --- core/src/processing/core/PApplet.java | 8 +++++--- core/src/processing/core/PGraphics.java | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 8250890238..00de12c62b 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -2002,7 +2002,7 @@ public void fullScreen(String renderer, int display) { * @see PApplet#height * @see PApplet#setup() * @see PApplet#settings() - * @see PApplet#fullscreen() + * @see PApplet#fullScreen() */ public void size(int width, int height) { // Check to make sure the width/height have actually changed. It's ok to @@ -13223,8 +13223,6 @@ public void text(char c, float x, float y, float z) { * Newlines that are \n (Unix newline or linefeed char, ascii 10) * are honored, but \r (carriage return, Windows and Mac OS) are * ignored. - * - * @param str the String to be displayed */ public void text(String str, float x, float y) { if (recorder != null) recorder.text(str, x, y); @@ -14860,6 +14858,8 @@ public void specular(int rgb) { /** * gray number specifying value between white and black + * + * @param gray value between black and white, by default 0 to 255 */ public void specular(float gray) { if (recorder != null) recorder.specular(gray); @@ -14925,6 +14925,8 @@ public void emissive(int rgb) { /** * gray number specifying value between white and black + * + * @param gray value between black and white, by default 0 to 255 */ public void emissive(float gray) { if (recorder != null) recorder.emissive(gray); diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index c4168a362c..032b69928d 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -6940,6 +6940,8 @@ public void specular(int rgb) { /** * gray number specifying value between white and black + * + * @param gray value between black and white, by default 0 to 255 */ public void specular(float gray) { colorCalc(gray); @@ -7017,6 +7019,8 @@ public void emissive(int rgb) { /** * gray number specifying value between white and black + * + * @param gray value between black and white, by default 0 to 255 */ public void emissive(float gray) { colorCalc(gray); From a279738d8c2f7af96601e20a91258362ecc33ec3 Mon Sep 17 00:00:00 2001 From: REAS Date: Fri, 26 Jul 2019 14:54:20 -0700 Subject: [PATCH 116/172] Changes for pixel reference for density --- core/src/processing/core/PApplet.java | 6 +++++- core/src/processing/core/PImage.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 00de12c62b..4492d6ae00 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -281,6 +281,9 @@ public class PApplet implements PConstants { * @see PApplet#get(int, int, int, int) * @see PApplet#set(int, int, int) * @see PImage + * @see PApplet#pixelDensity() + * @see PApplet#pixelWidth + * @see PApplet#pixelHeight */ public int[] pixels; @@ -1210,7 +1213,8 @@ public int displayDensity(int display) { /** * @webref environment * @param density 1 or 2 - * + * @see PApplet#pixelWidth + * @see PApplet#pixelHeight */ public void pixelDensity(int density) { //println(density + " " + this.pixelDensity); diff --git a/core/src/processing/core/PImage.java b/core/src/processing/core/PImage.java index 049d198f44..e21520d58f 100644 --- a/core/src/processing/core/PImage.java +++ b/core/src/processing/core/PImage.java @@ -90,7 +90,7 @@ public class PImage implements PConstants, Cloneable { * * @webref image:pixels * @usage web_application - * @brief Array containing the color of every pixel in the image + * @brief Array containing the color of every pixel in the image */ public int[] pixels; From e77ce475015844094e687a94a0b18060f9ccac52 Mon Sep 17 00:00:00 2001 From: REAS Date: Fri, 26 Jul 2019 15:47:21 -0700 Subject: [PATCH 117/172] Removing DoubleDict DoubleList LongDict LongList from Reference --- core/src/processing/data/DoubleDict.java | 2 +- core/src/processing/data/DoubleList.java | 2 +- core/src/processing/data/LongDict.java | 2 +- core/src/processing/data/LongList.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/processing/data/DoubleDict.java b/core/src/processing/data/DoubleDict.java index f2a9adf10f..5cec4d6e18 100644 --- a/core/src/processing/data/DoubleDict.java +++ b/core/src/processing/data/DoubleDict.java @@ -12,7 +12,7 @@ /** * A simple table class to use a String as a lookup for an double value. * - * @webref data:composite + * @nowebref * @see IntDict * @see StringDict */ diff --git a/core/src/processing/data/DoubleList.java b/core/src/processing/data/DoubleList.java index ae47a84420..6c364130c9 100644 --- a/core/src/processing/data/DoubleList.java +++ b/core/src/processing/data/DoubleList.java @@ -17,7 +17,7 @@ * Functions like sort() and shuffle() always act on the list itself. To get * a sorted copy, use list.copy().sort(). * - * @webref data:composite + * @nowebref * @see IntList * @see StringList */ diff --git a/core/src/processing/data/LongDict.java b/core/src/processing/data/LongDict.java index 5292468625..c9bf408216 100644 --- a/core/src/processing/data/LongDict.java +++ b/core/src/processing/data/LongDict.java @@ -11,7 +11,7 @@ /** * A simple class to use a String as a lookup for an int value. * - * @webref data:composite + * @nowebref * @see FloatDict * @see StringDict */ diff --git a/core/src/processing/data/LongList.java b/core/src/processing/data/LongList.java index 77bbd8b159..adfb1ea83c 100644 --- a/core/src/processing/data/LongList.java +++ b/core/src/processing/data/LongList.java @@ -22,7 +22,7 @@ * Functions like sort() and shuffle() always act on the list itself. To get * a sorted copy, use list.copy().sort(). * - * @webref data:composite + * @nowebref * @see FloatList * @see StringList */ From af1e2ee4ef95d689904565379f56319490cdc0f6 Mon Sep 17 00:00:00 2001 From: Jeremy Douglass Date: Sun, 11 Aug 2019 23:29:43 -0700 Subject: [PATCH 118/172] rename-variable menu allows Java identifiers Previously it was limited to unicode identifiers--for example a beginning with _ was forbidden; not so in Java. Closes #5828 "rename-variable dialog doesn't allow 1st-char underscore" --- java/src/processing/mode/java/pdex/Rename.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/src/processing/mode/java/pdex/Rename.java b/java/src/processing/mode/java/pdex/Rename.java index 7c5c6bca27..b143cd721a 100644 --- a/java/src/processing/mode/java/pdex/Rename.java +++ b/java/src/processing/mode/java/pdex/Rename.java @@ -129,8 +129,8 @@ public void componentHidden(ComponentEvent e) { final String newName = textField.getText().trim(); if (!newName.isEmpty()) { if (newName.length() >= 1 && - newName.chars().limit(1).allMatch(Character::isUnicodeIdentifierStart) && - newName.chars().skip(1).allMatch(Character::isUnicodeIdentifierPart)) { + newName.chars().limit(1).allMatch(Character::isJavaIdentifierStart) && + newName.chars().skip(1).allMatch(Character::isJavaIdentifierPart)) { rename(ps, binding, newName); window.setVisible(false); } else { @@ -332,4 +332,4 @@ void dispose() { window.dispose(); } } -} \ No newline at end of file +} From 05eb23a8daa3ea2fb92d88a929e4799c69cecd6a Mon Sep 17 00:00:00 2001 From: Gal Sasson Date: Sat, 17 Aug 2019 01:04:16 +0300 Subject: [PATCH 119/172] tweakmode fix: needs editor reference on launch --- java/src/processing/mode/java/JavaEditor.java | 2 +- java/src/processing/mode/java/JavaMode.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 1e68198fdf..6b87398c15 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -1098,7 +1098,7 @@ protected void handleLaunch(boolean present, boolean tweak) { if (!tweak) { runtime = jmode.handleLaunch(sketch, listener, present); } else { - runtime = jmode.handleTweak(sketch, listener); + runtime = jmode.handleTweak(sketch, listener, JavaEditor.this); } } } diff --git a/java/src/processing/mode/java/JavaMode.java b/java/src/processing/mode/java/JavaMode.java index c201dd7ca7..54a70462bb 100644 --- a/java/src/processing/mode/java/JavaMode.java +++ b/java/src/processing/mode/java/JavaMode.java @@ -140,9 +140,7 @@ public void run() { /** Start a sketch in tweak mode */ public Runner handleTweak(Sketch sketch, - RunnerListener listener) throws SketchException { -// final boolean present) throws SketchException { - final JavaEditor editor = (JavaEditor) listener; + RunnerListener listener, JavaEditor editor) throws SketchException { // first try to build the unmodified code JavaBuild build = new JavaBuild(sketch); From 5d4f4dd9c98ccefaa8cc49548b2f7d708e540295 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 3 Oct 2019 18:40:44 -0400 Subject: [PATCH 120/172] deal with an NPE inside PShape --- core/src/processing/core/PShape.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/src/processing/core/PShape.java b/core/src/processing/core/PShape.java index b587e3e9b0..0c622d18b8 100644 --- a/core/src/processing/core/PShape.java +++ b/core/src/processing/core/PShape.java @@ -2963,12 +2963,16 @@ public boolean isClosed() { */ public boolean contains(float x, float y) { if (family == PATH) { - // apply the inverse transformation matrix to the point coordinates - PMatrix inverseCoords = matrix.get(); - inverseCoords.invert(); // maybe cache this? - inverseCoords.invert(); // maybe cache this? - PVector p = new PVector(); - inverseCoords.mult(new PVector(x,y),p); + PVector p = new PVector(x, y); + if (matrix != null) { + // apply the inverse transformation matrix to the point coordinates + PMatrix inverseCoords = matrix.get(); + // TODO why is this called twice? [fry 190724] + // commit was https://github.com/processing/processing/commit/027fc7a4f8e8d0a435366eae754304eea282512a + inverseCoords.invert(); // maybe cache this? + inverseCoords.invert(); // maybe cache this? + inverseCoords.mult(new PVector(x, y), p); + } // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html boolean c = false; From 0f00a68f497714f4448d6370f154b61a2721cbd9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 3 Oct 2019 18:40:52 -0400 Subject: [PATCH 121/172] notes about recent bugs --- todo.txt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/todo.txt b/todo.txt index 6e714bdb8f..5ef2bc1a6e 100755 --- a/todo.txt +++ b/todo.txt @@ -5,6 +5,29 @@ X fix potential highlighting issue that wasn't selecting portions of text X update AppBundler to use newer SDK, recompile X edit build.xml files and appbundler to preserve more attributes +_ windows anti-malware leaves browser stuck at 100% +_ https://github.com/processing/processing/issues/5893 + +_ startup errors in contrib manager +_ https://github.com/processing/processing/issues/5482 +_ https://github.com/processing/processing/issues/5916 +_ https://github.com/processing/processing/issues/5823 + +fork issues +_ processing-sam/build/macosx/jdk-0u1_macosx_64.tgz + +from Casey +_ Issue with https and downloading the binaries, +Checksums? +_ https://github.com/processing/processing-docs/issues/766 +_ Math for BLEND incorrect in the reference? +_ https://github.com/processing/processing-docs/issues/762 +_ .setAngle() for PVector? +_ https://github.com/processing/processing-docs/issues/744 +_ Installation on Linux +_ https://github.com/processing/processing-docs/issues/645 +_ How much of the attrib*() functions should be documented? +_ https://github.com/processing/processing-docs/issues/172 + _ "Could not get the settings folder" isn't very helpful _ https://github.com/processing/processing/issues/5744 _ need to check the locations it'd be writing to, and see if available From faf7271291c3484e9eee79685eef256f06b8243c Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 3 Oct 2019 20:15:02 -0400 Subject: [PATCH 122/172] another todo note --- todo.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/todo.txt b/todo.txt index 5ef2bc1a6e..0a779e299d 100755 --- a/todo.txt +++ b/todo.txt @@ -698,6 +698,8 @@ PDE / Manager _ Manager fails to complete install of PythonMode when no windows open _ https://github.com/processing/processing/issues/5309 +_ Python Mode not downloading? +_ https://github.com/processing/processing/issues/5918 _ an incompatible Mode prevents the PDE from quitting after last window is closed _ https://github.com/processing/processing/issues/5112 _ “could not move the contribution to the backup folder” message while updating From 4734fd33f08b64d034a75a15f077b58bf58d3bf1 Mon Sep 17 00:00:00 2001 From: Rostyslav Zatserkovnyi Date: Mon, 28 Oct 2019 00:26:04 +0200 Subject: [PATCH 123/172] Add new strings to Ukrainian translation --- build/shared/lib/languages/PDE_uk.properties | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/build/shared/lib/languages/PDE_uk.properties b/build/shared/lib/languages/PDE_uk.properties index 8a34b5a39f..9eb9050fbb 100644 --- a/build/shared/lib/languages/PDE_uk.properties +++ b/build/shared/lib/languages/PDE_uk.properties @@ -31,6 +31,9 @@ menu.file.quit = Вийти menu.edit = Редагування menu.edit.undo = Скасувати menu.edit.redo = Повторити +menu.edit.redo.keystroke.macosx = shift meta pressed Z +menu.edit.redo.keystroke.windows = ctrl pressed Y +menu.edit.redo.keystroke.linux = shift ctrl pressed Z menu.edit.action.addition = додавання menu.edit.action.deletion = видалення menu.edit.cut = Вирізати @@ -40,8 +43,17 @@ menu.edit.paste = Вставити menu.edit.select_all = Виділити все menu.edit.auto_format = Автоформатування menu.edit.comment_uncomment = Коментувати/Розкоментувати +menu.edit.comment_uncomment.keystroke.macosx = meta pressed SLASH +menu.edit.comment_uncomment.keystroke.windows = ctrl pressed SLASH +menu.edit.comment_uncomment.keystroke.linux = ctrl pressed SLASH menu.edit.increase_indent = → Збільшити відступ +menu.edit.increase_indent.keystroke.macosx = meta pressed CLOSE_BRACKET +menu.edit.increase_indent.keystroke.windows = ctrl pressed CLOSE_BRACKET +menu.edit.increase_indent.keystroke.linux = ctrl pressed CLOSE_BRACKET menu.edit.decrease_indent = ← Зменшити відступ +menu.edit.decrease_indent.keystroke.macosx = meta pressed OPEN_BRACKET +menu.edit.decrease_indent.keystroke.windows = ctrl pressed OPEN_BRACKET +menu.edit.decrease_indent.keystroke.linux = ctrl pressed OPEN_BRACKET menu.edit.find = Знайти... menu.edit.find_next = Знайти наступне menu.edit.find_previous = Знайти попереднє @@ -77,8 +89,17 @@ menu.debug.toggle_breakpoint = Додати / вилучити точку зуп # --- # used for both menus and toolbars menu.debug.step = Крок +menu.debug.step.keystroke.macosx = meta pressed J +menu.debug.step.keystroke.windows = ctrl pressed J +menu.debug.step.keystroke.linux = ctrl pressed J menu.debug.step_into = Крок із заходом +menu.debug.step_into.keystroke.macosx = shift meta pressed J +menu.debug.step_into.keystroke.windows = shift ctrl pressed J +menu.debug.step_into.keystroke.linux = shift ctrl pressed J menu.debug.step_out = Крок із виходом +menu.debug.step_out.keystroke.macosx = meta alt pressed J +menu.debug.step_out.keystroke.windows = ctrl alt pressed J +menu.debug.step_out.keystroke.linux = ctrl alt pressed J menu.debug.continue = Продовжити # --- #menu.debug.print_stack_trace = Друкувати стек викликів @@ -166,6 +187,8 @@ preferences.editor_and_console_font = Шрифт редактора і конс preferences.editor_and_console_font.tip = Виберіть шрифт, що використовуватиметься у редакторі та консолі.
Можна використовувати лише моноширинні шрифти. preferences.editor_font_size = Розмір шрифту редактора preferences.console_font_size = Розмір шрифту консолі +preferences.zoom = Розмір інтерфейсу +preferences.zoom.auto = Автоматичний preferences.background_color = Колір фону в режимі презентації preferences.background_color.tip = Виберіть фоновий колір для режиму презентації.
Режим презентації використовується для повноекранної презентації ескізу
і доступний з меню Ескіз. preferences.use_smooth_text = Використовувати згладжений текст у вікні редактора @@ -311,7 +334,13 @@ editor.header.new_tab = Нова вкладка editor.header.rename = Перейменувати editor.header.delete = Видалити editor.header.previous_tab = Попередня вкладка +editor.header.previous_tab.keystroke.macosx = meta alt pressed LEFT +editor.header.previous_tab.keystroke.windows = ctrl pressed PAGE_UP +editor.header.previous_tab.keystroke.linux = ctrl pressed PAGE_UP editor.header.next_tab = Наступна вкладка +editor.header.next_tab.keystroke.macosx = meta alt pressed RIGHT +editor.header.next_tab.keystroke.windows = ctrl pressed PAGE_DOWN +editor.header.next_tab.keystroke.linux = ctrl pressed PAGE_DOWN editor.header.delete.warning.title = Хех, ні. editor.header.delete.warning.text = Не можна видалити головну вкладку єдиного відкритого ескізу. @@ -362,6 +391,7 @@ editor.status.missing.right_paren = Відсутня ")" editor.status.missing.left_curly_bracket = Відсутня "{" editor.status.missing.right_curly_bracket = Відсутня "}" editor.status.missing.add = Спробуйте додати "%s" +editor.status.bad_curly_quote = Фігурні лапки %s не працюють. Використовуйте прямі лапки. Ctrl-T для автозаміни. editor.status.reserved_words = "color" і "int" - зарезервовані ідентифікатори і не можуть бути назвами змінних editor.status.undefined_method = Функція "%s(%s)" не існує editor.status.undefined_constructor = Конструктор "%s(%s)" не існує @@ -371,10 +401,12 @@ editor.status.undef_global_var = Глобальна змінна "%s" не іс editor.status.undef_class = Клас "%s" не існує editor.status.undef_var = Змінна "%s" не існує editor.status.undef_name = Ім’я "%s" не може бути розпізнано +editor.status.unterm_string_curly = Рядковий літерал не оточений прямими лапками. Фігурні лапки %s не працюють. editor.status.type_mismatch = Неспівпадіння типів "%s" та "%s" editor.status.unused_variable = Локальна змінна "%s" ніде не використовується editor.status.uninitialized_variable = Локальна змінна "%s" може бути не ініціалізована editor.status.no_effect_assignment = Присвоєння змінної "%s" не має чинності +editor.status.hiding_enclosing_type = Клас "%s" не може мати ім'я ескізу або батьківського класу. # Footer buttons editor.footer.errors = Помилки @@ -449,6 +481,18 @@ ensure_exist.messages.unrecoverable.description = Не вдалось повто # Check name check_name.messages.is_name_modified = Ім’я ескізу потрібно було змінити. Імена ескізів можуть містити\nтільки ASCII-символи і числа (але не можуть починатися з числа).\nКрім того, вони мають бути не довшими за 64 символи. +# External changes detector +change_detect.reload.title=Вкладка змінена ззовні +change_detect.reload.question="%s" була змінена іншою програмою. +change_detect.reload.comment=Бажаєте залишити цю версію чи завантажити зміни ззовні?\nТак чи інакше, файл буде збережено в папці з ескізами. +change_detect.button.keep=Залишити +change_detect.button.load_new=Завантажити зміни ззовні +change_detect.delete.title=Вкладка видалена +change_detect.delete.question="%s" зникла з папки з ескізами. +change_detect.delete.comment=Бажаєте повторно її зберегти чи видалити зі свого ескізу? +change_detect.button.discard=Видалити назавжди +change_detect.button.resave=Повторно зберегти + # --------------------------------------- # Contributions @@ -533,6 +577,8 @@ contrib.import.errors.link = Помилка: У бібліотеки %s неді warn.delete = Видалення warn.delete.sketch = Ви впевнені, що хочете видалити цей ескіз? warn.delete.file = Ви впевнені, що хочете видалити "%s"? +warn.cannot_change_mode.title = Зміна режиму неможлива +warn.cannot_change_mode.body = Зміна режиму неможлива,\nоскільки режим "%s" несумісний з поточним режимом. # --------------------------------------- From d6b30602a703e1d0280392c54794486ee34bca8c Mon Sep 17 00:00:00 2001 From: REAS Date: Fri, 22 Nov 2019 10:55:45 -0800 Subject: [PATCH 124/172] Update keywords.txt --- java/keywords.txt | 1078 +++++++++++++++++++++++---------------------- 1 file changed, 541 insertions(+), 537 deletions(-) diff --git a/java/keywords.txt b/java/keywords.txt index a59b071766..b71cbf66ba 100644 --- a/java/keywords.txt +++ b/java/keywords.txt @@ -1,17 +1,18 @@ -# THE TEXT BELOW IS HAND WRITTEN AND FOUND IN THE FILE "keywords_base.txt" -# IN THE PROCESSING-DOCS REPO. DON'T EDITS THE keywords.txt FILE DIRECTLY. +# THIS TEXT IS FROM keywords_base.txt IN THE PROCESSING-DOCS REPO: +# https://github.com/processing/processing-docs/blob/master/generate/keywords_base.txt +# MAKE CHANGES THERE: DO NOT EDIT THE keywords.txt FILE DIRECTLY. -# For an explanation of these tags, see Token.java +# For an explanation of these tags, see Token.java # trunk/processing/app/src/processing/app/syntax/Token.java ADD LITERAL2 blend_ -ALIGN_CENTER LITERAL2 -ALIGN_LEFT LITERAL2 -ALIGN_RIGHT LITERAL2 +ALIGN_CENTER LITERAL2 +ALIGN_LEFT LITERAL2 +ALIGN_RIGHT LITERAL2 ALPHA LITERAL2 ALPHA_MASK LITERAL2 ALT LITERAL2 -AMBIENT LITERAL2 +AMBIENT LITERAL2 ARC LITERAL2 createShape_ ARROW LITERAL2 cursor_ ARGB LITERAL2 @@ -24,7 +25,7 @@ BLUR LITERAL2 filter_ BOTTOM LITERAL2 textAlign_ BOX LITERAL2 createShape_ BURN LITERAL2 blend_ -CENTER LITERAL2 +CENTER LITERAL2 CHATTER LITERAL2 CHORD LITERAL2 arc_ CLAMP LITERAL2 @@ -88,7 +89,7 @@ GIF LITERAL2 GRAY LITERAL2 filter_ GREEN_MASK LITERAL2 GROUP LITERAL2 -HALF LITERAL2 +HALF LITERAL2 HALF_PI LITERAL2 HALF_PI HAND LITERAL2 cursor_ HARD_LIGHT LITERAL2 blend_ @@ -97,7 +98,7 @@ HSB LITERAL2 colorMode_ IMAGE LITERAL2 textureMode_ INVERT LITERAL2 filter_ JAVA2D LITERAL2 size_ -JPEG LITERAL2 +JPEG LITERAL2 LEFT LITERAL2 keyCode LIGHTEST LITERAL2 blend_ LINE LITERAL2 createShape_ @@ -105,18 +106,18 @@ LINES LITERAL2 beginShape_ LINUX LITERAL2 MACOSX LITERAL2 MAX_FLOAT LITERAL2 -MAX_INT LITERAL2 +MAX_INT LITERAL2 MIN_FLOAT LITERAL2 MIN_INT LITERAL2 MITER LITERAL2 stokeJoin_ MODEL LITERAL2 textMode_ MOVE LITERAL2 cursor_ MULTIPLY LITERAL2 blend_ -NORMAL LITERAL2 +NORMAL LITERAL2 NORMALIZED LITERAL2 textureMode_ NO_DEPTH_TEST LITERAL2 NTSC LITERAL2 -ONE LITERAL2 +ONE LITERAL2 OPAQUE LITERAL2 filter_ OPEN LITERAL2 ORTHOGRAPHIC LITERAL2 @@ -127,13 +128,13 @@ P2D LITERAL2 size_ P3D LITERAL2 size_ PERSPECTIVE LITERAL2 PI LITERAL2 PI -PIE LITERAL2 +PIE LITERAL2 PIXEL_CENTER LITERAL2 POINT LITERAL2 -POINTS LITERAL2 +POINTS LITERAL2 POSTERIZE LITERAL2 filter_ PRESS LITERAL2 -PROBLEM LITERAL2 +PROBLEM LITERAL2 PROJECT LITERAL2 strokeCap_ QUAD LITERAL2 createShape_ QUAD_STRIP LITERAL2 beginShape_ @@ -146,23 +147,23 @@ RECT LITERAL2 RED_MASK LITERAL2 RELEASE LITERAL2 REPEAT LITERAL2 -REPLACE LITERAL2 +REPLACE LITERAL2 RETURN LITERAL2 RGB LITERAL2 colorMode_ RIGHT LITERAL2 keyCode ROUND LITERAL2 strokeCap_ SCREEN LITERAL2 blend_ -SECAM LITERAL2 +SECAM LITERAL2 SHAPE LITERAL2 textMode_ SHIFT LITERAL2 -SPAN LITERAL2 fullScreen_ +SPAN LITERAL2 fullScreen_ SPECULAR LITERAL2 SPHERE LITERAL2 createShape_ SOFT_LIGHT LITERAL2 blend_ SQUARE LITERAL2 strokeCap_ SUBTRACT LITERAL2 blend_ SVG LITERAL2 -SVIDEO LITERAL2 +SVIDEO LITERAL2 TAB LITERAL2 keyCode TARGA LITERAL2 TAU LITERAL2 TAU @@ -181,17 +182,17 @@ TWO LITERAL2 TWO_PI LITERAL2 TWO_PI UP LITERAL2 keyCode WAIT LITERAL2 cursor_ -WHITESPACE LITERAL2 +WHITESPACE LITERAL2 # Java keywords (void, import, , etc.) - + abstract KEYWORD1 break KEYWORD1 break class KEYWORD1 class continue KEYWORD1 continue -default KEYWORD1 default -enum KEYWORD1 +default KEYWORD1 default +enum KEYWORD1 extends KEYWORD1 extends false KEYWORD1 false final KEYWORD1 final @@ -199,17 +200,17 @@ finally KEYWORD1 implements KEYWORD1 implements import KEYWORD1 import instanceof KEYWORD1 -interface KEYWORD1 +interface KEYWORD1 native KEYWORD1 new KEYWORD1 new null KEYWORD1 null -package KEYWORD1 +package KEYWORD1 private KEYWORD1 private -protected KEYWORD1 +protected KEYWORD1 public KEYWORD1 public static KEYWORD1 static -strictfp KEYWORD1 -throws KEYWORD1 +strictfp KEYWORD1 +throws KEYWORD1 transient KEYWORD1 true KEYWORD1 true void KEYWORD1 void @@ -220,7 +221,7 @@ volatile KEYWORD1 assert KEYWORD6 case KEYWORD6 case -return KEYWORD6 return +return KEYWORD6 return super KEYWORD6 super this KEYWORD6 this throw KEYWORD6 @@ -230,18 +231,17 @@ throw KEYWORD6 Array KEYWORD5 Array ArrayList KEYWORD5 ArrayList -Boolean KEYWORD5 -Byte KEYWORD5 +Boolean KEYWORD5 +Byte KEYWORD5 BufferedReader KEYWORD5 BufferedReader -Character KEYWORD5 +Character KEYWORD5 Class KEYWORD5 class -Double KEYWORD5 -Float KEYWORD5 -Integer KEYWORD5 +Float KEYWORD5 +Integer KEYWORD5 HashMap KEYWORD5 HashMap PrintWriter KEYWORD5 PrintWriter String KEYWORD5 String -StringBuffer KEYWORD5 +StringBuffer KEYWORD5 StringBuilder KEYWORD5 Thread KEYWORD5 boolean KEYWORD5 boolean @@ -252,7 +252,6 @@ double KEYWORD5 double float KEYWORD5 float int KEYWORD5 int long KEYWORD5 long -short KEYWORD5 # Flow structures @@ -386,549 +385,554 @@ pixelHeight KEYWORD4 pixelHeight # # THE TEXT BELOW IS AUTO-GENERATED # -# SO -# DON'T -# TOUCH +# SO +# DON'T +# TOUCH # IT -abs FUNCTION1 abs_ -acos FUNCTION1 acos_ -alpha FUNCTION1 alpha_ -ambient FUNCTION1 ambient_ -ambientLight FUNCTION1 ambientLight_ -append FUNCTION1 append_ -applyMatrix FUNCTION1 applyMatrix_ -arc FUNCTION1 arc_ -arrayCopy FUNCTION1 arrayCopy_ -asin FUNCTION1 asin_ -atan FUNCTION1 atan_ -atan2 FUNCTION1 atan2_ -background FUNCTION1 background_ -beginCamera FUNCTION1 beginCamera_ -beginContour FUNCTION1 beginContour_ -beginRaw FUNCTION1 beginRaw_ -beginRecord FUNCTION1 beginRecord_ -beginShape FUNCTION1 beginShape_ -bezier FUNCTION1 bezier_ -bezierDetail FUNCTION1 bezierDetail_ +JSONObject KEYWORD5 JSONObject +cross FUNCTION2 PVector_cross_ +hasValue FUNCTION2 StringList_hasValue_ +PVector KEYWORD5 PVector +endCamera FUNCTION1 endCamera_ +min FUNCTION1 min_ +printCamera FUNCTION1 printCamera_ +strokeWeight FUNCTION1 strokeWeight_ +scale FUNCTION1 scale_ +copy FUNCTION2 PImage_copy_ +get FUNCTION2 IntList_get_ +mouseDragged FUNCTION4 mouseDragged +setString FUNCTION2 JSONArray_setString_ +setString FUNCTION2 TableRow_setString_ +keyReleased FUNCTION4 keyReleased +frameRate FUNCTION1 frameRate_ +PShape KEYWORD5 PShape +hasKey FUNCTION2 FloatDict_hasKey_ +randomSeed FUNCTION1 randomSeed_ +sortReverse FUNCTION2 FloatList_sortReverse_ +getParent FUNCTION2 XML_getParent_ +loadPixels FUNCTION2 PImage_loadPixels_ +save FUNCTION2 PImage_save_ +increment FUNCTION2 IntList_increment_ +hue FUNCTION1 hue_ bezierPoint FUNCTION1 bezierPoint_ -bezierTangent FUNCTION1 bezierTangent_ -bezierVertex FUNCTION1 bezierVertex_ -binary FUNCTION1 binary_ -blend FUNCTION1 blend_ -blendColor FUNCTION1 blendColor_ -blendMode FUNCTION1 blendMode_ -blue FUNCTION1 blue_ -box FUNCTION1 box_ -brightness FUNCTION1 brightness_ -camera FUNCTION1 camera_ -ceil FUNCTION1 ceil_ -clear FUNCTION1 clear_ -clip FUNCTION1 clip_ -color FUNCTION1 color_ -colorMode FUNCTION1 colorMode_ -concat FUNCTION1 concat_ -constrain FUNCTION1 constrain_ -copy FUNCTION1 copy_ -cos FUNCTION1 cos_ -createFont FUNCTION1 createFont_ -createGraphics FUNCTION1 createGraphics_ -createImage FUNCTION1 createImage_ -createInput FUNCTION1 createInput_ -createOutput FUNCTION1 createOutput_ -createReader FUNCTION1 createReader_ -createShape FUNCTION1 createShape_ -createWriter FUNCTION1 createWriter_ +getFloat FUNCTION2 JSONArray_getFloat_ +degrees FUNCTION1 degrees_ +loadPixels FUNCTION1 loadPixels_ cursor FUNCTION1 cursor_ -curve FUNCTION1 curve_ +beginContour FUNCTION1 beginContour_ +loadTable FUNCTION1 loadTable_ +keyPressed KEYWORD4 keyPressed +resetMatrix FUNCTION2 PShape_resetMatrix_ +dist FUNCTION1 dist_ +sub FUNCTION2 IntList_sub_ +removeColumn FUNCTION2 Table_removeColumn_ +updatePixels FUNCTION1 updatePixels_ +set FUNCTION2 FloatDict_set_ +disableStyle FUNCTION2 PShape_disableStyle_ +saveStream FUNCTION1 saveStream_ +mask FUNCTION2 PImage_mask_ +set FUNCTION2 StringList_set_ +createWriter FUNCTION1 createWriter_ +join FUNCTION1 join_ +findRow FUNCTION2 Table_findRow_ +append FUNCTION2 IntList_append_ +loadXML FUNCTION1 loadXML_ +splice FUNCTION1 splice_ +mult FUNCTION2 IntList_mult_ +mult FUNCTION2 PVector_mult_ +noiseDetail FUNCTION1 noiseDetail_ curveDetail FUNCTION1 curveDetail_ -curvePoint FUNCTION1 curvePoint_ -curveTangent FUNCTION1 curveTangent_ -curveTightness FUNCTION1 curveTightness_ -curveVertex FUNCTION1 curveVertex_ +textLeading FUNCTION1 textLeading_ +noCursor FUNCTION1 noCursor_ +sphere FUNCTION1 sphere_ day FUNCTION1 day_ -degrees FUNCTION1 degrees_ -delay FUNCTION1 delay_ -directionalLight FUNCTION1 directionalLight_ -displayDensity FUNCTION1 displayDensity_ -displayHeight KEYWORD4 displayHeight -displayWidth KEYWORD4 displayWidth -dist FUNCTION1 dist_ -draw FUNCTION4 draw -ellipse FUNCTION1 ellipse_ -ellipseMode FUNCTION1 ellipseMode_ -emissive FUNCTION1 emissive_ -endCamera FUNCTION1 endCamera_ -endContour FUNCTION1 endContour_ -endRaw FUNCTION1 endRaw_ -endRecord FUNCTION1 endRecord_ -endShape FUNCTION1 endShape_ -exit FUNCTION1 exit_ -exp FUNCTION1 exp_ +month FUNCTION1 month_ +IntDict KEYWORD5 IntDict +popMatrix FUNCTION1 popMatrix_ +size FUNCTION2 StringList_size_ +loadImage FUNCTION1 loadImage_ +shininess FUNCTION1 shininess_ +setJSONArray FUNCTION2 JSONObject_setJSONArray_ +values FUNCTION2 IntDict_values_ +scale FUNCTION2 PShape_scale_ +ceil FUNCTION1 ceil_ +getFloat FUNCTION2 TableRow_getFloat_ +randomGaussian FUNCTION1 randomGaussian_ +setContent FUNCTION2 XML_setContent_ +size FUNCTION1 size_ +clear FUNCTION2 StringList_clear_ +mouseX KEYWORD4 mouseX expand FUNCTION1 expand_ -fill FUNCTION1 fill_ -filter FUNCTION1 filter_ -FloatDict KEYWORD5 FloatDict -add FUNCTION2 FloatDict_add_ -clear FUNCTION2 FloatDict_clear_ -div FUNCTION2 FloatDict_div_ -get FUNCTION2 FloatDict_get_ -hasKey FUNCTION2 FloatDict_hasKey_ -keyArray FUNCTION2 FloatDict_keyArray_ -keys FUNCTION2 FloatDict_keys_ -mult FUNCTION2 FloatDict_mult_ -remove FUNCTION2 FloatDict_remove_ -set FUNCTION2 FloatDict_set_ -size FUNCTION2 FloatDict_size_ -sortKeys FUNCTION2 FloatDict_sortKeys_ -sortKeysReverse FUNCTION2 FloatDict_sortKeysReverse_ -sortValues FUNCTION2 FloatDict_sortValues_ -sortValuesReverse FUNCTION2 FloatDict_sortValuesReverse_ -sub FUNCTION2 FloatDict_sub_ -valueArray FUNCTION2 FloatDict_valueArray_ -values FUNCTION2 FloatDict_values_ -FloatList KEYWORD5 FloatList -add FUNCTION2 FloatList_add_ -append FUNCTION2 FloatList_append_ +sort FUNCTION2 Table_sort_ +setBoolean FUNCTION2 JSONArray_setBoolean_ +pushMatrix FUNCTION1 pushMatrix_ +mouseY KEYWORD4 mouseY +lerpColor FUNCTION1 lerpColor_ array FUNCTION2 FloatList_array_ -clear FUNCTION2 FloatList_clear_ -div FUNCTION2 FloatList_div_ -get FUNCTION2 FloatList_get_ -hasValue FUNCTION2 FloatList_hasValue_ -max FUNCTION2 FloatList_max_ -min FUNCTION2 FloatList_min_ +ellipse FUNCTION1 ellipse_ +stroke FUNCTION1 stroke_ +imageMode FUNCTION1 imageMode_ +settings FUNCTION4 settings +pixelWidth FUNCTION4 pixelWidth +getName FUNCTION2 XML_getName_ +setVertex FUNCTION2 PShape_setVertex_ mult FUNCTION2 FloatList_mult_ remove FUNCTION2 FloatList_remove_ -reverse FUNCTION2 FloatList_reverse_ -set FUNCTION2 FloatList_set_ -shuffle FUNCTION2 FloatList_shuffle_ -size FUNCTION2 FloatList_size_ -sort FUNCTION2 FloatList_sort_ -sortReverse FUNCTION2 FloatList_sortReverse_ -sub FUNCTION2 FloatList_sub_ -floor FUNCTION1 floor_ +createGraphics FUNCTION1 createGraphics_ +min FUNCTION2 IntList_min_ +rows FUNCTION2 Table_rows_ focused KEYWORD4 focused -frameCount KEYWORD4 frameCount -frameRate KEYWORD4 frameRate -frameRate FUNCTION1 frameRate_ -frustum FUNCTION1 frustum_ -fullScreen FUNCTION1 fullScreen_ +endContour FUNCTION1 endContour_ +hasValue FUNCTION2 IntList_hasValue_ +setString FUNCTION2 Table_setString_ +sortKeysReverse FUNCTION2 FloatDict_sortKeysReverse_ +saveStrings FUNCTION1 saveStrings_ +resetMatrix FUNCTION1 resetMatrix_ +set FUNCTION2 PImage_set_ +add FUNCTION2 IntList_add_ +removeChild FUNCTION2 XML_removeChild_ +key KEYWORD4 key +requestImage FUNCTION1 requestImage_ +array FUNCTION2 StringList_array_ +saveBytes FUNCTION1 saveBytes_ get FUNCTION1 get_ -green FUNCTION1 green_ -HALF_PI LITERAL2 HALF_PI -hex FUNCTION1 hex_ -hint FUNCTION1 hint_ +emissive FUNCTION1 emissive_ +getColumnCount FUNCTION2 Table_getColumnCount_ +noStroke FUNCTION1 noStroke_ +textureWrap FUNCTION1 textureWrap_ +addChild FUNCTION2 XML_addChild_ +setMag FUNCTION2 PVector_setMag_ +FloatDict KEYWORD5 FloatDict +matchRow FUNCTION2 Table_matchRow_ +div FUNCTION2 FloatList_div_ +getBoolean FUNCTION2 JSONObject_getBoolean_ +vertex FUNCTION1 vertex_ +setFloat FUNCTION2 JSONObject_setFloat_ +copy FUNCTION2 PVector_copy_ +remove FUNCTION2 StringDict_remove_ +lower FUNCTION2 StringList_lower_ +format FUNCTION2 XML_format_ +setStroke FUNCTION2 PShape_setStroke_ +clear FUNCTION2 FloatList_clear_ +isNull FUNCTION2 JSONObject_isNull_ +mousePressed FUNCTION4 mousePressed +sortValuesReverse FUNCTION2 FloatDict_sortValuesReverse_ +sortValuesReverse FUNCTION2 StringDict_sortValuesReverse_ +selectInput FUNCTION1 selectInput_ +lerp FUNCTION2 PVector_lerp_ +div FUNCTION2 IntList_div_ +sort FUNCTION2 FloatList_sort_ +setInt FUNCTION2 JSONArray_setInt_ +createReader FUNCTION1 createReader_ +strokeJoin FUNCTION1 strokeJoin_ hour FUNCTION1 hour_ -hue FUNCTION1 hue_ -image FUNCTION1 image_ -imageMode FUNCTION1 imageMode_ -IntDict KEYWORD5 IntDict -add FUNCTION2 IntDict_add_ -clear FUNCTION2 IntDict_clear_ -div FUNCTION2 IntDict_div_ -get FUNCTION2 IntDict_get_ -hasKey FUNCTION2 IntDict_hasKey_ -increment FUNCTION2 IntDict_increment_ -keyArray FUNCTION2 IntDict_keyArray_ -keys FUNCTION2 IntDict_keys_ -mult FUNCTION2 IntDict_mult_ -remove FUNCTION2 IntDict_remove_ -set FUNCTION2 IntDict_set_ -size FUNCTION2 IntDict_size_ -sortKeys FUNCTION2 IntDict_sortKeys_ -sortKeysReverse FUNCTION2 IntDict_sortKeysReverse_ -sortValues FUNCTION2 IntDict_sortValues_ +getRowCount FUNCTION2 Table_getRowCount_ +hasAttribute FUNCTION2 XML_hasAttribute_ +setFloat FUNCTION2 TableRow_setFloat_ +values FUNCTION2 FloatDict_values_ +getInt FUNCTION2 TableRow_getInt_ +getString FUNCTION2 JSONObject_getString_ +round FUNCTION1 round_ +strokeCap FUNCTION1 strokeCap_ +sortKeysReverse FUNCTION2 StringDict_sortKeysReverse_ +ortho FUNCTION1 ortho_ +getVertexCount FUNCTION2 PShape_getVertexCount_ +parseJSONObject FUNCTION1 parseJSONObject_ +textFont FUNCTION1 textFont_ +clear FUNCTION1 clear_ +getChildren FUNCTION2 XML_getChildren_ +loadBytes FUNCTION1 loadBytes_ +ambient FUNCTION1 ambient_ sortValuesReverse FUNCTION2 IntDict_sortValuesReverse_ -sub FUNCTION2 IntDict_sub_ -valueArray FUNCTION2 IntDict_valueArray_ -values FUNCTION2 IntDict_values_ -IntList KEYWORD5 IntList -add FUNCTION2 IntList_add_ -append FUNCTION2 IntList_append_ -array FUNCTION2 IntList_array_ -clear FUNCTION2 IntList_clear_ -div FUNCTION2 IntList_div_ -get FUNCTION2 IntList_get_ -hasValue FUNCTION2 IntList_hasValue_ -increment FUNCTION2 IntList_increment_ -max FUNCTION2 IntList_max_ -min FUNCTION2 IntList_min_ -mult FUNCTION2 IntList_mult_ +keyTyped FUNCTION4 keyTyped +HALF_PI LITERAL2 HALF_PI +loadFont FUNCTION1 loadFont_ +frameRate FUNCTION1 frameRate_ +map FUNCTION1 map_ +min FUNCTION2 FloatList_min_ +mag FUNCTION1 mag_ +minute FUNCTION1 minute_ +beginRecord FUNCTION1 beginRecord_ +add FUNCTION2 FloatList_add_ +alpha FUNCTION1 alpha_ +clear FUNCTION2 StringDict_clear_ +noClip FUNCTION1 noClip_ +TWO_PI LITERAL2 TWO_PI +normalize FUNCTION2 PVector_normalize_ +abs FUNCTION1 abs_ remove FUNCTION2 IntList_remove_ +saveXML FUNCTION1 saveXML_ +blend FUNCTION2 PImage_blend_ +sortKeys FUNCTION2 FloatDict_sortKeys_ +blue FUNCTION1 blue_ reverse FUNCTION2 IntList_reverse_ -set FUNCTION2 IntList_set_ -shuffle FUNCTION2 IntList_shuffle_ -size FUNCTION2 IntList_size_ -sort FUNCTION2 IntList_sort_ -sortReverse FUNCTION2 IntList_sortReverse_ -sub FUNCTION2 IntList_sub_ -join FUNCTION1 join_ -JSONArray KEYWORD5 JSONArray -append FUNCTION2 JSONArray_append_ -getBoolean FUNCTION2 JSONArray_getBoolean_ -getFloat FUNCTION2 JSONArray_getFloat_ -getInt FUNCTION2 JSONArray_getInt_ +getContent FUNCTION2 XML_getFloatContent_ +keys FUNCTION2 StringDict_keys_ +clear FUNCTION2 FloatDict_clear_ +year FUNCTION1 year_ +nfc FUNCTION1 nfc_ +rotate FUNCTION1 rotate_ +getChild FUNCTION2 XML_getChild_ +parseJSONArray FUNCTION1 parseJSONArray_ +pixels KEYWORD4 pixels getIntArray FUNCTION2 JSONArray_getIntArray_ +saveFrame FUNCTION1 saveFrame_ +getFloat FUNCTION2 JSONObject_getFloat_ +size FUNCTION2 StringDict_size_ +splitTokens FUNCTION1 splitTokens_ +mult FUNCTION2 IntDict_mult_ +atan FUNCTION1 atan_ +setName FUNCTION2 XML_setName_ +XML KEYWORD5 XML +circle FUNCTION1 circle_ +bezierDetail FUNCTION1 bezierDetail_ +draw FUNCTION4 draw +getContent FUNCTION2 XML_getContent_ +cos FUNCTION1 cos_ +sq FUNCTION1 sq_ +TAU LITERAL2 TAU +delay FUNCTION1 delay_ +fullScreen FUNCTION1 fullScreen_ +endRaw FUNCTION1 endRaw_ +setVisible FUNCTION2 PShape_setVisible_ +increment FUNCTION2 IntDict_increment_ +shuffle FUNCTION2 IntList_shuffle_ getJSONArray FUNCTION2 JSONArray_getJSONArray_ -getJSONObject FUNCTION2 JSONArray_getJSONObject_ -getString FUNCTION2 JSONArray_getString_ -getStringArray FUNCTION2 JSONArray_getStringArray_ -isNull FUNCTION2 JSONArray_isNull_ -remove FUNCTION2 JSONArray_remove_ -setBoolean FUNCTION2 JSONArray_setBoolean_ +translate FUNCTION1 translate_ +sort FUNCTION2 IntList_sort_ setFloat FUNCTION2 JSONArray_setFloat_ -setInt FUNCTION2 JSONArray_setInt_ -setJSONArray FUNCTION2 JSONArray_setJSONArray_ -setJSONObject FUNCTION2 JSONArray_setJSONObject_ -setString FUNCTION2 JSONArray_setString_ -size FUNCTION2 JSONArray_size_ -JSONObject KEYWORD5 JSONObject -getBoolean FUNCTION2 JSONObject_getBoolean_ -getFloat FUNCTION2 JSONObject_getFloat_ -getInt FUNCTION2 JSONObject_getInt_ -getJSONArray FUNCTION2 JSONObject_getJSONArray_ -getJSONObject FUNCTION2 JSONObject_getJSONObject_ -getString FUNCTION2 JSONObject_getString_ -isNull FUNCTION2 JSONObject_isNull_ +nfp FUNCTION1 nfp_ +upper FUNCTION2 StringList_upper_ +setInt FUNCTION2 TableRow_setInt_ +hasKey FUNCTION2 IntDict_hasKey_ +blendMode FUNCTION1 blendMode_ +sin FUNCTION1 sin_ +mouseButton KEYWORD4 mouseButton +QUARTER_PI LITERAL2 QUARTER_PI +clip FUNCTION1 clip_ +sub FUNCTION2 FloatList_sub_ +getInt FUNCTION2 JSONArray_getInt_ +getBoolean FUNCTION2 JSONArray_getBoolean_ +set FUNCTION2 IntDict_set_ +displayHeight KEYWORD4 displayHeight +findRows FUNCTION2 Table_findRows_ +hex FUNCTION1 hex_ +TableRow KEYWORD5 TableRow +PI LITERAL2 PI +updatePixels FUNCTION2 PImage_updatePixels_ +beginShape FUNCTION1 beginShape_ +StringDict KEYWORD5 StringDict +mult FUNCTION2 FloatDict_mult_ +append FUNCTION2 FloatList_append_ +trim FUNCTION1 trim_ +pmouseX KEYWORD4 pmouseX +textDescent FUNCTION1 textDescent_ +createShape FUNCTION1 createShape_ +keyArray FUNCTION2 FloatDict_keyArray_ +get FUNCTION2 FloatList_get_ +getStringColumn FUNCTION2 Table_getStringColumn_ +pmouseY KEYWORD4 pmouseY +pixels KEYWORD2 PImage_pixels +nfs FUNCTION1 nfs_ setBoolean FUNCTION2 JSONObject_setBoolean_ -setFloat FUNCTION2 JSONObject_setFloat_ -setInt FUNCTION2 JSONObject_setInt_ -setJSONArray FUNCTION2 JSONObject_setJSONArray_ -setJSONObject FUNCTION2 JSONObject_setJSONObject_ -setString FUNCTION2 JSONObject_setString_ -key KEYWORD4 key -keyCode KEYWORD4 keyCode +JSONArray KEYWORD5 JSONArray +displayDensity FUNCTION1 displayDensity_ +createFont FUNCTION1 createFont_ +applyMatrix FUNCTION1 applyMatrix_ keyPressed FUNCTION4 keyPressed -keyPressed KEYWORD4 keyPressed -keyReleased FUNCTION4 keyReleased -keyTyped FUNCTION4 keyTyped -launch FUNCTION1 launch_ -lerp FUNCTION1 lerp_ -lerpColor FUNCTION1 lerpColor_ -lightFalloff FUNCTION1 lightFalloff_ -lights FUNCTION1 lights_ -lightSpecular FUNCTION1 lightSpecular_ -line FUNCTION1 line_ -loadBytes FUNCTION1 loadBytes_ -loadFont FUNCTION1 loadFont_ -loadImage FUNCTION1 loadImage_ -loadJSONArray FUNCTION1 loadJSONArray_ -loadJSONObject FUNCTION1 loadJSONObject_ -loadPixels FUNCTION1 loadPixels_ -loadShader FUNCTION1 loadShader_ -loadShape FUNCTION1 loadShape_ -loadStrings FUNCTION1 loadStrings_ -loadTable FUNCTION1 loadTable_ -loadXML FUNCTION1 loadXML_ -log FUNCTION1 log_ -loop FUNCTION1 loop_ -mag FUNCTION1 mag_ -map FUNCTION1 map_ -match FUNCTION1 match_ +getColumnTitle FUNCTION2 TableRow_getColumnTitle_ +getString FUNCTION2 XML_getString_ +point FUNCTION1 point_ +background FUNCTION1 background_ +pixelDensity FUNCTION1 pixelDensity_ +set FUNCTION2 PVector_set_ +triangle FUNCTION1 triangle_ +rect FUNCTION1 rect_ +shape FUNCTION1 shape_ +saveTable FUNCTION1 saveTable_ matchAll FUNCTION1 matchAll_ +get FUNCTION2 StringDict_get_ +noLights FUNCTION1 noLights_ max FUNCTION1 max_ -millis FUNCTION1 millis_ -min FUNCTION1 min_ -minute FUNCTION1 minute_ -modelX FUNCTION1 modelX_ -modelY FUNCTION1 modelY_ -modelZ FUNCTION1 modelZ_ -month FUNCTION1 month_ -mouseButton KEYWORD4 mouseButton -mouseClicked FUNCTION4 mouseClicked -mouseDragged FUNCTION4 mouseDragged -mouseMoved FUNCTION4 mouseMoved -mousePressed FUNCTION4 mousePressed -mousePressed KEYWORD4 mousePressed -mouseReleased FUNCTION4 mouseReleased +keys FUNCTION2 FloatDict_keys_ mouseWheel FUNCTION4 mouseWheel -mouseX KEYWORD4 mouseX -mouseY KEYWORD4 mouseY -nf FUNCTION1 nf_ -nfc FUNCTION1 nfc_ -nfp FUNCTION1 nfp_ -nfs FUNCTION1 nfs_ -noClip FUNCTION1 noClip_ -noCursor FUNCTION1 noCursor_ -noFill FUNCTION1 noFill_ -noise FUNCTION1 noise_ -noiseDetail FUNCTION1 noiseDetail_ -noiseSeed FUNCTION1 noiseSeed_ -noLights FUNCTION1 noLights_ -noLoop FUNCTION1 noLoop_ -norm FUNCTION1 norm_ -normal FUNCTION1 normal_ -noSmooth FUNCTION1 noSmooth_ -noStroke FUNCTION1 noStroke_ -noTint FUNCTION1 noTint_ -ortho FUNCTION1 ortho_ -parseJSONArray FUNCTION1 parseJSONArray_ -parseJSONObject FUNCTION1 parseJSONObject_ -parseXML FUNCTION1 parseXML_ -perspective FUNCTION1 perspective_ -PFont KEYWORD5 PFont -list FUNCTION1 PFont_list_ -PGraphics KEYWORD5 PGraphics -beginDraw FUNCTION2 PGraphics_beginDraw_ -endDraw FUNCTION2 PGraphics_endDraw_ -PI LITERAL2 PI +set FUNCTION1 set_ PImage KEYWORD5 PImage -blend FUNCTION2 PImage_blend_ -copy FUNCTION2 PImage_copy_ -filter FUNCTION2 PImage_filter_ +printProjection FUNCTION1 printProjection_ +popStyle FUNCTION1 popStyle_ +lerp FUNCTION1 lerp_ +clearRows FUNCTION2 Table_clearRows_ +perspective FUNCTION1 perspective_ +print FUNCTION1 print_ get FUNCTION2 PImage_get_ -loadPixels FUNCTION2 PImage_loadPixels_ -mask FUNCTION2 PImage_mask_ -pixels KEYWORD2 PImage_pixels -resize FUNCTION2 PImage_resize_ -save FUNCTION2 PImage_save_ -set FUNCTION2 PImage_set_ -updatePixels FUNCTION2 PImage_updatePixels_ -pixelDensity FUNCTION1 pixelDensity_ -pixelHeight FUNCTION1 pixelHeight_ -pixels KEYWORD4 pixels -pixelWidth KEYWORD4 pixelWidth -pmouseX KEYWORD4 pmouseX -pmouseY KEYWORD4 pmouseY -point FUNCTION1 point_ -pointLight FUNCTION1 pointLight_ -popMatrix FUNCTION1 popMatrix_ -popStyle FUNCTION1 popStyle_ -pow FUNCTION1 pow_ -print FUNCTION1 print_ -printArray FUNCTION1 printArray_ -printCamera FUNCTION1 printCamera_ -println FUNCTION1 println_ -printMatrix FUNCTION1 printMatrix_ -printProjection FUNCTION1 printProjection_ -PShader KEYWORD5 PShader -PShader FUNCTION2 PShader_set_ -PShape KEYWORD5 PShape +addColumn FUNCTION2 Table_addColumn_ +fill FUNCTION1 fill_ +loadJSONObject FUNCTION1 loadJSONObject_ +filter FUNCTION2 PImage_filter_ +getFloat FUNCTION2 Table_getFloat_ +redraw FUNCTION1 redraw_ +sortKeys FUNCTION2 StringDict_sortKeys_ +textAlign FUNCTION1 textAlign_ +append FUNCTION2 StringList_append_ +bezier FUNCTION1 bezier_ +size FUNCTION2 FloatDict_size_ addChild FUNCTION2 PShape_addChild_ -beginContour FUNCTION2 PShape_beginContour_ -beginShape FUNCTION2 PShape_beginShape_ -disableStyle FUNCTION2 PShape_disableStyle_ -enableStyle FUNCTION2 PShape_enableStyle_ -endContour FUNCTION2 PShape_endContour_ -endShape FUNCTION2 PShape_endShape_ -getChild FUNCTION2 PShape_getChild_ -getChildCount FUNCTION2 PShape_getChildCount_ -getVertex FUNCTION2 PShape_getVertex_ -getVertexCount FUNCTION2 PShape_getVertexCount_ -isVisible FUNCTION2 PShape_isVisible_ -resetMatrix FUNCTION2 PShape_resetMatrix_ -rotate FUNCTION2 PShape_rotate_ -rotateX FUNCTION2 PShape_rotateX_ -rotateY FUNCTION2 PShape_rotateY_ -rotateZ FUNCTION2 PShape_rotateZ_ -scale FUNCTION2 PShape_scale_ -setFill FUNCTION2 PShape_setFill_ -setStroke FUNCTION2 PShape_setStroke_ -setVertex FUNCTION2 PShape_setVertex_ -setVisible FUNCTION2 PShape_setVisible_ -translate FUNCTION2 PShape_translate_ -pushMatrix FUNCTION1 pushMatrix_ -pushStyle FUNCTION1 pushStyle_ -PVector KEYWORD5 PVector -add FUNCTION2 PVector_add_ +setFloat FUNCTION2 XML_setFloat_ +smooth FUNCTION1 smooth_ +blendColor FUNCTION1 blendColor_ +displayWidth KEYWORD4 displayWidth angleBetween FUNCTION2 PVector_angleBetween_ -array FUNCTION2 PVector_array_ -copy FUNCTION2 PVector_copy_ -cross FUNCTION2 PVector_cross_ -dist FUNCTION2 PVector_dist_ +removeRow FUNCTION2 Table_removeRow_ div FUNCTION2 PVector_div_ -dot FUNCTION2 PVector_dot_ -fromAngle FUNCTION2 PVector_fromAngle_ -get FUNCTION2 PVector_get_ -heading FUNCTION2 PVector_heading_ -lerp FUNCTION2 PVector_lerp_ -limit FUNCTION2 PVector_limit_ -mag FUNCTION2 PVector_mag_ -magSq FUNCTION2 PVector_magSq_ -mult FUNCTION2 PVector_mult_ -normalize FUNCTION2 PVector_normalize_ -random2D FUNCTION2 PVector_random2D_ -random3D FUNCTION2 PVector_random3D_ +println FUNCTION1 println_ +add FUNCTION2 FloatDict_add_ +brightness FUNCTION1 brightness_ +loadJSONArray FUNCTION1 loadJSONArray_ +tan FUNCTION1 tan_ +printMatrix FUNCTION1 printMatrix_ +lights FUNCTION1 lights_ +loadShape FUNCTION1 loadShape_ +random FUNCTION1 random_ +shuffle FUNCTION2 FloatList_shuffle_ rotate FUNCTION2 PVector_rotate_ -set FUNCTION2 PVector_set_ -setMag FUNCTION2 PVector_setMag_ -sub FUNCTION2 PVector_sub_ -quad FUNCTION1 quad_ +getJSONObject FUNCTION2 JSONObject_getJSONObject_ quadraticVertex FUNCTION1 quadraticVertex_ -QUARTER_PI LITERAL2 QUARTER_PI +sort FUNCTION2 StringList_sort_ +bezierVertex FUNCTION1 bezierVertex_ +exp FUNCTION1 exp_ +setJSONArray FUNCTION2 JSONArray_setJSONArray_ +setString FUNCTION2 JSONObject_setString_ +textureMode FUNCTION1 textureMode_ +specular FUNCTION1 specular_ +noSmooth FUNCTION1 noSmooth_ +pow FUNCTION1 pow_ +blend FUNCTION1 blend_ +listChildren FUNCTION2 XML_listChildren_ +keyArray FUNCTION2 IntDict_keyArray_ +green FUNCTION1 green_ +magSq FUNCTION2 PVector_magSq_ +listAttributes FUNCTION2 XML_listAttributes_ +createOutput FUNCTION1 createOutput_ +div FUNCTION2 IntDict_div_ +isNull FUNCTION2 JSONArray_isNull_ +getContent FUNCTION2 XML_getIntContent_ +setString FUNCTION2 XML_setString_ +get FUNCTION2 StringList_get_ +translate FUNCTION2 PShape_translate_ +concat FUNCTION1 concat_ +bezierTangent FUNCTION1 bezierTangent_ +mouseReleased FUNCTION4 mouseReleased +arrayCopy FUNCTION1 arrayCopy_ +beginCamera FUNCTION1 beginCamera_ +asin FUNCTION1 asin_ +remove FUNCTION2 IntDict_remove_ +lightFalloff FUNCTION1 lightFalloff_ +color FUNCTION1 color_ +shader FUNCTION1 shader_ +size FUNCTION2 IntDict_size_ +beginShape FUNCTION2 PShape_beginShape_ +getStringArray FUNCTION2 JSONArray_getStringArray_ +reverse FUNCTION2 FloatList_reverse_ +get FUNCTION2 FloatDict_get_ +rotateZ FUNCTION1 rotateZ_ +sortValues FUNCTION2 FloatDict_sortValues_ radians FUNCTION1 radians_ -random FUNCTION1 random_ -randomGaussian FUNCTION1 randomGaussian_ -randomSeed FUNCTION1 randomSeed_ -rect FUNCTION1 rect_ -rectMode FUNCTION1 rectMode_ -red FUNCTION1 red_ -redraw FUNCTION1 redraw_ -requestImage FUNCTION1 requestImage_ -resetMatrix FUNCTION1 resetMatrix_ -resetShader FUNCTION1 resetShader_ +keyArray FUNCTION2 StringDict_keyArray_ +curveTightness FUNCTION1 curveTightness_ +filter FUNCTION1 filter_ +getChildCount FUNCTION2 PShape_getChildCount_ +setJSONObject FUNCTION2 JSONArray_setJSONObject_ +heading FUNCTION2 PVector_heading_ +keys FUNCTION2 IntDict_keys_ +PFont KEYWORD5 PFont +noFill FUNCTION1 noFill_ +noise FUNCTION1 noise_ +acos FUNCTION1 acos_ +frameCount KEYWORD4 frameCount +curvePoint FUNCTION1 curvePoint_ +sort FUNCTION1 sort_ reverse FUNCTION1 reverse_ -rotate FUNCTION1 rotate_ -rotateX FUNCTION1 rotateX_ -rotateY FUNCTION1 rotateY_ -rotateZ FUNCTION1 rotateZ_ -round FUNCTION1 round_ -saturation FUNCTION1 saturation_ -save FUNCTION1 save_ -saveBytes FUNCTION1 saveBytes_ -saveFrame FUNCTION1 saveFrame_ -saveJSONArray FUNCTION1 saveJSONArray_ -saveJSONObject FUNCTION1 saveJSONObject_ -saveStream FUNCTION1 saveStream_ -saveStrings FUNCTION1 saveStrings_ -saveTable FUNCTION1 saveTable_ -saveXML FUNCTION1 saveXML_ -scale FUNCTION1 scale_ -screenX FUNCTION1 screenX_ -screenY FUNCTION1 screenY_ -screenZ FUNCTION1 screenZ_ +sphereDetail FUNCTION1 sphereDetail_ +sortReverse FUNCTION2 IntList_sortReverse_ +constrain FUNCTION1 constrain_ +frustum FUNCTION1 frustum_ +list FUNCTION1 PFont_list_ +max FUNCTION2 IntList_max_ +mag FUNCTION2 PVector_mag_ +sub FUNCTION2 FloatDict_sub_ second FUNCTION1 second_ -selectFolder FUNCTION1 selectFolder_ -selectInput FUNCTION1 selectInput_ -selectOutput FUNCTION1 selectOutput_ -set FUNCTION1 set_ -settings FUNCTION4 settings -setup FUNCTION4 setup -shader FUNCTION1 shader_ -shape FUNCTION1 shape_ -shapeMode FUNCTION1 shapeMode_ +set FUNCTION2 IntList_set_ +valueArray FUNCTION2 IntDict_valueArray_ +binary FUNCTION1 binary_ +StringList KEYWORD5 StringList +isVisible FUNCTION2 PShape_isVisible_ +push FUNCTION1 push_ +normal FUNCTION1 normal_ +PShader FUNCTION2 PShader_set_ +append FUNCTION2 JSONArray_append_ +pop FUNCTION1 pop_ shearX FUNCTION1 shearX_ +saveJSONObject FUNCTION1 saveJSONObject_ +enableStyle FUNCTION2 PShape_enableStyle_ +rotateY FUNCTION1 rotateY_ +rotateX FUNCTION1 rotateX_ +endShape FUNCTION1 endShape_ +sortKeys FUNCTION2 IntDict_sortKeys_ shearY FUNCTION1 shearY_ -shininess FUNCTION1 shininess_ -shorten FUNCTION1 shorten_ -sin FUNCTION1 sin_ -size FUNCTION1 size_ -smooth FUNCTION1 smooth_ -sort FUNCTION1 sort_ -specular FUNCTION1 specular_ -sphere FUNCTION1 sphere_ -sphereDetail FUNCTION1 sphereDetail_ -splice FUNCTION1 splice_ -split FUNCTION1 split_ -splitTokens FUNCTION1 splitTokens_ -spotLight FUNCTION1 spotLight_ -sq FUNCTION1 sq_ +shapeMode FUNCTION1 shapeMode_ +norm FUNCTION1 norm_ +saveJSONArray FUNCTION1 saveJSONArray_ +match FUNCTION1 match_ +values FUNCTION2 StringDict_values_ +sortValues FUNCTION2 StringDict_sortValues_ +floor FUNCTION1 floor_ +quad FUNCTION1 quad_ +pixelHeight FUNCTION1 pixelHeight_ +parseXML FUNCTION1 parseXML_ +exit FUNCTION1 exit_ +texture FUNCTION1 texture_ +clear FUNCTION2 IntDict_clear_ +size FUNCTION2 JSONArray_size_ +setup FUNCTION4 setup +getJSONObject FUNCTION2 JSONArray_getJSONObject_ +modelX FUNCTION1 modelX_ +dot FUNCTION2 PVector_dot_ +rotateX FUNCTION2 PShape_rotateX_ +valueArray FUNCTION2 FloatDict_valueArray_ +selectFolder FUNCTION1 selectFolder_ +random3D FUNCTION2 PVector_random3D_ sqrt FUNCTION1 sqrt_ -StringDict KEYWORD5 StringDict -clear FUNCTION2 StringDict_clear_ -get FUNCTION2 StringDict_get_ -hasKey FUNCTION2 StringDict_hasKey_ -keyArray FUNCTION2 StringDict_keyArray_ -keys FUNCTION2 StringDict_keys_ -remove FUNCTION2 StringDict_remove_ +sortReverse FUNCTION2 StringList_sortReverse_ +limit FUNCTION2 PVector_limit_ +log FUNCTION1 log_ +remove FUNCTION2 FloatDict_remove_ +shuffle FUNCTION2 StringList_shuffle_ +curveTangent FUNCTION1 curveTangent_ +unhex FUNCTION1 unhex_ +array FUNCTION2 IntList_array_ +size FUNCTION2 FloatList_size_ +remove FUNCTION2 StringList_remove_ +get FUNCTION2 PVector_get_ +createInput FUNCTION1 createInput_ set FUNCTION2 StringDict_set_ -size FUNCTION2 StringDict_size_ -sortKeys FUNCTION2 StringDict_sortKeys_ -sortKeysReverse FUNCTION2 StringDict_sortKeysReverse_ -sortValues FUNCTION2 StringDict_sortValues_ -sortValuesReverse FUNCTION2 StringDict_sortValuesReverse_ +thread FUNCTION1 thread_ +max FUNCTION2 FloatList_max_ +sub FUNCTION2 IntDict_sub_ +beginRaw FUNCTION1 beginRaw_ +set FUNCTION2 FloatList_set_ +getInt FUNCTION2 JSONObject_getInt_ +fromAngle FUNCTION2 PVector_fromAngle_ +rotateY FUNCTION2 PShape_rotateY_ +modelY FUNCTION1 modelY_ +ambientLight FUNCTION1 ambientLight_ +getJSONArray FUNCTION2 JSONObject_getJSONArray_ valueArray FUNCTION2 StringDict_valueArray_ -values FUNCTION2 StringDict_values_ -StringList KEYWORD5 StringList -append FUNCTION2 StringList_append_ -array FUNCTION2 StringList_array_ -clear FUNCTION2 StringList_clear_ -get FUNCTION2 StringList_get_ -hasValue FUNCTION2 StringList_hasValue_ -lower FUNCTION2 StringList_lower_ -remove FUNCTION2 StringList_remove_ -reverse FUNCTION2 StringList_reverse_ -set FUNCTION2 StringList_set_ -shuffle FUNCTION2 StringList_shuffle_ -size FUNCTION2 StringList_size_ -sort FUNCTION2 StringList_sort_ -sortReverse FUNCTION2 StringList_sortReverse_ -upper FUNCTION2 StringList_upper_ -stroke FUNCTION1 stroke_ -strokeCap FUNCTION1 strokeCap_ -strokeJoin FUNCTION1 strokeJoin_ -strokeWeight FUNCTION1 strokeWeight_ -subset FUNCTION1 subset_ -Table KEYWORD5 Table -addColumn FUNCTION2 Table_addColumn_ -addRow FUNCTION2 Table_addRow_ -clearRows FUNCTION2 Table_clearRows_ -findRow FUNCTION2 Table_findRow_ -findRows FUNCTION2 Table_findRows_ -getColumnCount FUNCTION2 Table_getColumnCount_ -getFloat FUNCTION2 Table_getFloat_ -getInt FUNCTION2 Table_getInt_ -getRow FUNCTION2 Table_getRow_ -getRowCount FUNCTION2 Table_getRowCount_ -getString FUNCTION2 Table_getString_ -getStringColumn FUNCTION2 Table_getStringColumn_ -matchRow FUNCTION2 Table_matchRow_ -matchRows FUNCTION2 Table_matchRows_ -removeColumn FUNCTION2 Table_removeColumn_ -removeRow FUNCTION2 Table_removeRow_ -removeTokens FUNCTION2 Table_removeTokens_ -rows FUNCTION2 Table_rows_ -setFloat FUNCTION2 Table_setFloat_ setInt FUNCTION2 Table_setInt_ -setString FUNCTION2 Table_setString_ -trim FUNCTION2 Table_trim_ -TableRow KEYWORD5 TableRow -getColumnCount FUNCTION2 TableRow_getColumnCount_ -getColumnTitle FUNCTION2 TableRow_getColumnTitle_ -getFloat FUNCTION2 TableRow_getFloat_ -getInt FUNCTION2 TableRow_getInt_ +rectMode FUNCTION1 rectMode_ +arc FUNCTION1 arc_ +setInt FUNCTION2 XML_setInt_ +getRow FUNCTION2 Table_getRow_ getString FUNCTION2 TableRow_getString_ -setFloat FUNCTION2 TableRow_setFloat_ -setInt FUNCTION2 TableRow_setInt_ -setString FUNCTION2 TableRow_setString_ -tan FUNCTION1 tan_ -TAU LITERAL2 TAU -text FUNCTION1 text_ -textAlign FUNCTION1 textAlign_ -textAscent FUNCTION1 textAscent_ -textDescent FUNCTION1 textDescent_ -textFont FUNCTION1 textFont_ -textLeading FUNCTION1 textLeading_ +noTint FUNCTION1 noTint_ +clear FUNCTION2 IntList_clear_ +beginContour FUNCTION2 PShape_beginContour_ +matchRows FUNCTION2 Table_matchRows_ +setFill FUNCTION2 PShape_setFill_ +shorten FUNCTION1 shorten_ +dist FUNCTION2 PVector_dist_ +unbinary FUNCTION1 unbinary_ +IntList KEYWORD5 IntList +toString FUNCTION2 XML_toString_ +get FUNCTION2 IntDict_get_ +getString FUNCTION2 JSONArray_getString_ +line FUNCTION1 line_ +sortValues FUNCTION2 IntDict_sortValues_ +mousePressed KEYWORD4 mousePressed +colorMode FUNCTION1 colorMode_ +loop FUNCTION1 loop_ +saturation FUNCTION1 saturation_ +sub FUNCTION2 PVector_sub_ +rotateZ FUNCTION2 PShape_rotateZ_ +beginDraw FUNCTION2 PGraphics_beginDraw_ +directionalLight FUNCTION1 directionalLight_ +hasValue FUNCTION2 FloatList_hasValue_ +modelZ FUNCTION1 modelZ_ +endContour FUNCTION2 PShape_endContour_ +setInt FUNCTION2 JSONObject_setInt_ +nf FUNCTION1 nf_ +size FUNCTION2 IntList_size_ +loadStrings FUNCTION1 loadStrings_ textMode FUNCTION1 textMode_ +camera FUNCTION1 camera_ +removeTokens FUNCTION2 Table_removeTokens_ +div FUNCTION2 FloatDict_div_ +screenY FUNCTION1 screenY_ +sortKeysReverse FUNCTION2 IntDict_sortKeysReverse_ textSize FUNCTION1 textSize_ -texture FUNCTION1 texture_ -textureMode FUNCTION1 textureMode_ -textureWrap FUNCTION1 textureWrap_ -textWidth FUNCTION1 textWidth_ -thread FUNCTION1 thread_ +rotate FUNCTION2 PShape_rotate_ +split FUNCTION1 split_ +Table KEYWORD5 Table +addRow FUNCTION2 Table_addRow_ +mouseClicked FUNCTION4 mouseClicked +ellipseMode FUNCTION1 ellipseMode_ +resetShader FUNCTION1 resetShader_ +hasChildren FUNCTION2 XML_hasChildren_ +append FUNCTION1 append_ +square FUNCTION1 square_ +getFloat FUNCTION2 XML_getFloat_ +textAscent FUNCTION1 textAscent_ +endShape FUNCTION2 PShape_endShape_ +box FUNCTION1 box_ +millis FUNCTION1 millis_ +curve FUNCTION1 curve_ +setFloat FUNCTION2 Table_setFloat_ +spotLight FUNCTION1 spotLight_ +resize FUNCTION2 PImage_resize_ +add FUNCTION2 IntDict_add_ +screenX FUNCTION1 screenX_ +curveVertex FUNCTION1 curveVertex_ +getChild FUNCTION2 PShape_getChild_ +getString FUNCTION2 Table_getString_ +printArray FUNCTION1 printArray_ +selectOutput FUNCTION1 selectOutput_ +endRecord FUNCTION1 endRecord_ +noiseSeed FUNCTION1 noiseSeed_ +hasKey FUNCTION2 StringDict_hasKey_ +endDraw FUNCTION2 PGraphics_endDraw_ +PGraphics KEYWORD5 PGraphics +pointLight FUNCTION1 pointLight_ +screenZ FUNCTION1 screenZ_ +array FUNCTION2 PVector_array_ +getVertex FUNCTION2 PShape_getVertex_ +save FUNCTION1 save_ +remove FUNCTION2 JSONArray_remove_ +loadShader FUNCTION1 loadShader_ +reverse FUNCTION2 StringList_reverse_ +keyCode KEYWORD4 keyCode +subset FUNCTION1 subset_ +image FUNCTION1 image_ tint FUNCTION1 tint_ -translate FUNCTION1 translate_ -triangle FUNCTION1 triangle_ -trim FUNCTION1 trim_ -TWO_PI LITERAL2 TWO_PI -unbinary FUNCTION1 unbinary_ -unhex FUNCTION1 unhex_ -updatePixels FUNCTION1 updatePixels_ -vertex FUNCTION1 vertex_ -XML KEYWORD5 XML -addChild FUNCTION2 XML_addChild_ -format FUNCTION2 XML_format_ getAttributeCount FUNCTION2 XML_getAttributeCount_ -getChild FUNCTION2 XML_getChild_ -getChildren FUNCTION2 XML_getChildren_ -getContent FUNCTION2 XML_getContent_ -getFloat FUNCTION2 XML_getFloat_ -getContent FUNCTION2 XML_getFloatContent_ +text FUNCTION1 text_ +mouseMoved FUNCTION4 mouseMoved +launch FUNCTION1 launch_ +PShader KEYWORD5 PShader +pushStyle FUNCTION1 pushStyle_ +textWidth FUNCTION1 textWidth_ +red FUNCTION1 red_ +lightSpecular FUNCTION1 lightSpecular_ +copy FUNCTION1 copy_ +atan2 FUNCTION1 atan2_ +add FUNCTION2 PVector_add_ +random2D FUNCTION2 PVector_random2D_ getInt FUNCTION2 XML_getInt_ -getContent FUNCTION2 XML_getIntContent_ -getName FUNCTION2 XML_getName_ -getParent FUNCTION2 XML_getParent_ -getString FUNCTION2 XML_getString_ -hasAttribute FUNCTION2 XML_hasAttribute_ -hasChildren FUNCTION2 XML_hasChildren_ -listAttributes FUNCTION2 XML_listAttributes_ -listChildren FUNCTION2 XML_listChildren_ -removeChild FUNCTION2 XML_removeChild_ -setContent FUNCTION2 XML_setContent_ -setFloat FUNCTION2 XML_setFloat_ -setInt FUNCTION2 XML_setInt_ -setName FUNCTION2 XML_setName_ -setString FUNCTION2 XML_setString_ -toString FUNCTION2 XML_toString_ -year FUNCTION1 year_ +createImage FUNCTION1 createImage_ +trim FUNCTION2 Table_trim_ +getColumnCount FUNCTION2 TableRow_getColumnCount_ +FloatList KEYWORD5 FloatList +attrib FUNCTION1 attrib_ +noLoop FUNCTION1 noLoop_ +setJSONObject FUNCTION2 JSONObject_setJSONObject_ +getInt FUNCTION2 Table_getInt_ From 8bfb02ec37fefb5ebaf87050f1dc3b1b960a7b1b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 16 Jan 2020 17:32:10 -0500 Subject: [PATCH 125/172] contrib name sort should not be case-sensitive --- app/src/processing/app/contrib/ListPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/processing/app/contrib/ListPanel.java b/app/src/processing/app/contrib/ListPanel.java index 49c50658cc..845b7178d4 100644 --- a/app/src/processing/app/contrib/ListPanel.java +++ b/app/src/processing/app/contrib/ListPanel.java @@ -419,7 +419,7 @@ Comparator getComparator() { return comparator.thenComparing(contribution -> getAuthorNameWithoutMarkup(contribution.getAuthorList())); case NAME: default: - return comparator.thenComparing(Contribution::getName); + return comparator.thenComparing(Contribution::getName, String.CASE_INSENSITIVE_ORDER); } } } From 3110ed0c62e8cce352953eab7d43a2b10e4bba71 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 16 Jan 2020 17:34:28 -0500 Subject: [PATCH 126/172] notes about updates --- todo.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) mode change 100755 => 100644 todo.txt diff --git a/todo.txt b/todo.txt old mode 100755 new mode 100644 index 0a779e299d..c8194a57db --- a/todo.txt +++ b/todo.txt @@ -4,6 +4,13 @@ X https://github.com/processing/processing/issues/5794 X fix potential highlighting issue that wasn't selecting portions of text X update AppBundler to use newer SDK, recompile X edit build.xml files and appbundler to preserve more attributes +X contrib listing names should not be case sensitive +X libs in all caps appeared above those in lowercase + +contribs +X tweak mode not working +X https://github.com/processing/processing/issues/5805 +X https://github.com/processing/processing/pull/5909 _ windows anti-malware leaves browser stuck at 100% _ https://github.com/processing/processing/issues/5893 @@ -13,9 +20,6 @@ _ https://github.com/processing/processing/issues/5482 _ https://github.com/processing/processing/issues/5916 _ https://github.com/processing/processing/issues/5823 -fork issues -_ processing-sam/build/macosx/jdk-0u1_macosx_64.tgz - from Casey _ Issue with https and downloading the binaries, +Checksums? _ https://github.com/processing/processing-docs/issues/766 From 8148676f1e6b211ca16e844bff0785452444ea48 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 16 Jan 2020 18:54:22 -0500 Subject: [PATCH 127/172] ignore library subfolders --- app/src/processing/app/Library.java | 33 ++++++++++++----------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/app/src/processing/app/Library.java b/app/src/processing/app/Library.java index 83c1d1dd02..34bc6360e1 100644 --- a/app/src/processing/app/Library.java +++ b/app/src/processing/app/Library.java @@ -128,7 +128,7 @@ protected void handle() { StringDict exportTable = exportSettings.exists() ? Util.readSettings(exportSettings) : new StringDict(); - exportList = new HashMap(); + exportList = new HashMap<>(); // get the list of files just in the library root String[] baseList = libraryFolder.list(standardFilter); @@ -298,7 +298,7 @@ public void addPackageList(Map> importToLibraryTable) { // Library library = importToLibraryTable.get(pkg); List libraries = importToLibraryTable.get(pkg); if (libraries == null) { - libraries = new ArrayList(); + libraries = new ArrayList<>(); importToLibraryTable.put(pkg, libraries); } else { if (Base.DEBUG) { @@ -470,10 +470,10 @@ static public boolean hasMultipleArch(int platform, List libraries) { static protected FilenameFilter junkFolderFilter = new FilenameFilter() { public boolean accept(File dir, String name) { - // skip .DS_Store files, .svn folders, etc + // skip .DS_Store files, .svn and .git folders, etc if (name.charAt(0) == '.') return false; - if (name.equals("CVS")) return false; - return (new File(dir, name).isDirectory()); + if (name.equals("CVS")) return false; // old skool + return new File(dir, name).isDirectory(); } }; @@ -482,12 +482,14 @@ static public List discover(File folder) { List libraries = new ArrayList<>(); String[] folderNames = folder.list(junkFolderFilter); - // if a bad folder or something like that, this might come back null + // if a bad folder or unreadable, folderNames might be null if (folderNames != null) { // alphabetize list, since it's not always alpha order // replaced hella slow bubble sort with this feller for 0093 Arrays.sort(folderNames, String.CASE_INSENSITIVE_ORDER); + // TODO some weirdness because ContributionType.LIBRARY.isCandidate() + // handles some, but not all, of this [fry 200116] for (String potentialName : folderNames) { File baseFolder = new File(folder, potentialName); File libraryFolder = new File(baseFolder, "library"); @@ -500,22 +502,13 @@ static public List discover(File folder) { libraries.add(baseFolder); } else { - String mess = "The library \"" - + potentialName - + "\" cannot be used.\n" - + "Library names must contain only basic letters and numbers.\n" - + "(ASCII only and no spaces, and it cannot start with a number)"; + final String mess = + "The library \"" + potentialName + "\" cannot be used.\n" + + "Library names must contain only basic letters and numbers.\n" + + "(ASCII only and no spaces, and it cannot start with a number)"; Messages.showMessage("Ignoring bad library name", mess); continue; } - /* - } else { // maybe it's a JS library - // TODO this should be in a better location - File jsLibrary = new File(libraryFolder, potentialName + ".js"); - if (jsLibrary.exists()) { - libraries.add(baseFolder); - } - */ } } } @@ -532,6 +525,7 @@ static public List list(File folder) { libraries.add(new Library(baseFolder)); } + /* // Support libraries inside of one level of subfolders? I believe this was // the compromise for supporting library groups, but probably a bad idea // because it's not compatible with the Manager. @@ -548,6 +542,7 @@ static public List list(File folder) { } } } + */ return libraries; } From 93c6a060994e4d08807218e8caa4f5fe49e72c1b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 16 Jan 2020 18:56:53 -0500 Subject: [PATCH 128/172] ignore __MACOSX files when unzipping --- app/src/processing/app/Util.java | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/app/src/processing/app/Util.java b/app/src/processing/app/Util.java index 6fdc75c9de..fefc3b8b71 100644 --- a/app/src/processing/app/Util.java +++ b/app/src/processing/app/Util.java @@ -614,24 +614,31 @@ static private void packageListFromFolder(File dir, String sofar, } + /** + * Extract the contents of a .zip archive into a folder. + * Ignores (does not extract) any __MACOSX files from macOS archives. + */ static public void unzip(File zipFile, File dest) { try { FileInputStream fis = new FileInputStream(zipFile); CheckedInputStream checksum = new CheckedInputStream(fis, new Adler32()); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(checksum)); - ZipEntry next = null; - while ((next = zis.getNextEntry()) != null) { - File currentFile = new File(dest, next.getName()); - if (next.isDirectory()) { - currentFile.mkdirs(); - } else { - File parentDir = currentFile.getParentFile(); - // Sometimes the directory entries aren't already created - if (!parentDir.exists()) { - parentDir.mkdirs(); + ZipEntry entry = null; + while ((entry = zis.getNextEntry()) != null) { + final String name = entry.getName(); + if (!name.startsWith(("__MACOSX"))) { + File currentFile = new File(dest, name); + if (entry.isDirectory()) { + currentFile.mkdirs(); + } else { + File parentDir = currentFile.getParentFile(); + // Sometimes the directory entries aren't already created + if (!parentDir.exists()) { + parentDir.mkdirs(); + } + currentFile.createNewFile(); + unzipEntry(zis, currentFile); } - currentFile.createNewFile(); - unzipEntry(zis, currentFile); } } } catch (Exception e) { From a31855c7761ad958dbb52168e03a6495f060e7a6 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 16 Jan 2020 19:01:57 -0500 Subject: [PATCH 129/172] improve handling of weird cases and error messaging inside contribs manager --- .../app/contrib/AvailableContribution.java | 68 ++++++------------- .../app/contrib/ContribProgressBar.java | 2 +- .../app/contrib/ContributionManager.java | 9 +-- .../app/contrib/ContributionType.java | 6 +- .../app/contrib/LocalContribution.java | 17 +++-- todo.txt | 2 + 6 files changed, 45 insertions(+), 59 deletions(-) diff --git a/app/src/processing/app/contrib/AvailableContribution.java b/app/src/processing/app/contrib/AvailableContribution.java index 9c78b831ac..4d5240c451 100644 --- a/app/src/processing/app/contrib/AvailableContribution.java +++ b/app/src/processing/app/contrib/AvailableContribution.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-16 The Processing Foundation + Copyright (c) 2013-20 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify @@ -99,7 +99,6 @@ public LocalContribution install(Base base, File contribArchive, // Unzip the file into the modes, tools, or libraries folder inside the // sketchbook. Unzipping to /tmp is problematic because it may be on // another file system, so move/rename operations will break. -// File sketchbookContribFolder = type.getSketchbookFolder(); File tempFolder = null; try { @@ -110,84 +109,61 @@ public LocalContribution install(Base base, File contribArchive, return null; } Util.unzip(contribArchive, tempFolder); -// System.out.println("temp folder is " + tempFolder); -// Base.openFolder(tempFolder); // Now go looking for a legit contrib inside what's been unpacked. File contribFolder = null; - // Sometimes contrib authors place all their folders in the base directory - // of the .zip file instead of in single folder as the guidelines suggest. - if (type.isCandidate(tempFolder)) { - /* - // Can't just rename the temp folder, because a contrib with this name - // may already exist. Instead, create a new temp folder, and rename the - // old one to be the correct folder. - File enclosingFolder = null; - try { - enclosingFolder = Base.createTempFolder(type.toString(), "tmp", sketchbookContribFolder); - } catch (IOException e) { - status.setErrorMessage("Could not create a secondary folder to install."); - return null; - } - contribFolder = new File(enclosingFolder, getName()); - tempFolder.renameTo(contribFolder); - tempFolder = enclosingFolder; - */ + /* + if (!type.isCandidate(tempFolder)) { if (status != null) { status.setErrorMessage(Language.interpolate("contrib.errors.needs_repackage", getName(), type.getTitle())); } return null; } + */ -// if (contribFolder == null) { - // Find the first legitimate looking folder in what we just unzipped - contribFolder = type.findCandidate(tempFolder); -// } LocalContribution installedContrib = null; - + // Find the first legitimate folder in what we just unzipped + contribFolder = type.findCandidate(tempFolder); if (contribFolder == null) { if (status != null) { status.setErrorMessage(Language.interpolate("contrib.errors.no_contribution_found", type)); } - } else { File propFile = new File(contribFolder, type + ".properties"); - if (writePropertiesFile(propFile)) { - // 1. contribFolder now has a legit contribution, load it to get info. + if (!propFile.exists()) { + status.setErrorMessage("This contribution is missing " + + propFile.getName() + + ", please contact the author for a fix."); + + } else if (writePropertiesFile(propFile)) { + // contribFolder now has a legit contribution, load it to get info. LocalContribution newContrib = type.load(base, contribFolder); - // 1.1. get info we need to delete the newContrib folder later + // get info we need to delete the newContrib folder later File newContribFolder = newContrib.getFolder(); - // 2. Check to make sure nothing has the same name already, + // Check to make sure nothing has the same name already, // backup old if needed, then move things into place and reload. installedContrib = newContrib.copyAndLoad(base, confirmReplace, status); - // Restart no longer needed. Yay! -// if (newContrib != null && type.requiresRestart()) { -// installedContrib.setRestartFlag(); -// //status.setMessage("Restart Processing to finish the installation."); -// } - - // 3.1 Unlock all the jars if it is a mode or tool + // Unlock all the jars if it is a mode or tool if (newContrib.getType() == ContributionType.MODE) { ((ModeContribution) newContrib).clearClassLoader(base); - } - else if (newContrib.getType() == ContributionType.TOOL) { + + } else if (newContrib.getType() == ContributionType.TOOL) { ((ToolContribution) newContrib).clearClassLoader(); } - // 3.2 Delete the newContrib, do a garbage collection, hope and pray + // Delete the newContrib, do a garbage collection, hope and pray // that Java will unlock the temp folder on Windows now newContrib = null; System.gc(); - if (Platform.isWindows()) { - // we'll even give it a second to finish up ... because file ops are - // just that flaky on Windows. + // we'll even give it a second to finish up, + // because file ops are just that flaky on Windows. try { Thread.sleep(1000); } catch (InterruptedException e) { @@ -195,7 +171,7 @@ else if (newContrib.getType() == ContributionType.TOOL) { } } - // 4. Okay, now actually delete that temp folder + // delete the contrib folder inside the libraryXXXXXXtmp folder Util.removeDir(newContribFolder, false); } else { diff --git a/app/src/processing/app/contrib/ContribProgressBar.java b/app/src/processing/app/contrib/ContribProgressBar.java index c86cb16ae4..8a0d41c3b6 100644 --- a/app/src/processing/app/contrib/ContribProgressBar.java +++ b/app/src/processing/app/contrib/ContribProgressBar.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-15 The Processing Foundation + Copyright (c) 2013-20 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify diff --git a/app/src/processing/app/contrib/ContributionManager.java b/app/src/processing/app/contrib/ContributionManager.java index 8c0cc591bc..46f892ca77 100644 --- a/app/src/processing/app/contrib/ContributionManager.java +++ b/app/src/processing/app/contrib/ContributionManager.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013 The Processing Foundation + Copyright (c) 2013-20 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify @@ -199,8 +199,8 @@ public void run() { } } installProgress.finished(); - } - else { + + } else { if (downloadProgress.exception instanceof SocketTimeoutException) { status.setErrorMessage(Language .interpolate("contrib.errors.contrib_download.timeout", @@ -213,7 +213,6 @@ public void run() { } contribZip.delete(); - //} catch (NoClassDefFoundError ncdfe) { } catch (Exception e) { String msg = null; if (e instanceof RuntimeException) { @@ -229,6 +228,8 @@ public void run() { if (msg == null) { msg = Language.interpolate("contrib.errors.download_and_install", ad.getName()); + // Something unexpected, so print the trace + e.printStackTrace(); } status.setErrorMessage(msg); downloadProgress.cancel(); diff --git a/app/src/processing/app/contrib/ContributionType.java b/app/src/processing/app/contrib/ContributionType.java index 197aaa4f5c..2ea1dd2d78 100644 --- a/app/src/processing/app/contrib/ContributionType.java +++ b/app/src/processing/app/contrib/ContributionType.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013 The Processing Foundation + Copyright (c) 2013-20 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify @@ -172,7 +172,7 @@ public File getSketchbookFolder() { } - boolean isCandidate(File potential) { + public boolean isCandidate(File potential) { return (potential.isDirectory() && new File(potential, toString()).exists() && !isTempFolderName(potential.getName())); @@ -237,7 +237,7 @@ LocalContribution load(Base base, File folder) { ArrayList listContributions(Editor editor) { - ArrayList contribs = new ArrayList(); + ArrayList contribs = new ArrayList<>(); switch (this) { case LIBRARY: contribs.addAll(editor.getMode().contribLibraries); diff --git a/app/src/processing/app/contrib/LocalContribution.java b/app/src/processing/app/contrib/LocalContribution.java index 20c7176b01..cb128a73e9 100644 --- a/app/src/processing/app/contrib/LocalContribution.java +++ b/app/src/processing/app/contrib/LocalContribution.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-16 The Processing Foundation + Copyright (c) 2013-20 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify @@ -237,7 +237,8 @@ static void listClasses(ClassLoader loader) { LocalContribution copyAndLoad(Base base, boolean confirmReplace, StatusPanel status) { -// NOTE: null status => function is called on startup when Editor objects, et al. aren't ready + // NOTE: null status => function is called on startup + // when Editor objects, et al. aren't ready String contribFolderName = getFolder().getName(); @@ -262,10 +263,17 @@ LocalContribution copyAndLoad(Base base, (oldContrib.getId() != null && oldContrib.getId().equals(getId()))) { if (oldContrib.getType().requiresRestart()) { - // XXX: We can't replace stuff, soooooo.... do something different if (!oldContrib.backup(false, status)) { return null; } + /* + try { + Platform.deleteFile(oldContrib.getFolder()); + } catch (IOException e) { + status.setErrorMessage(e.getMessage()); + return null; + } + */ } else { int result = 0; boolean doBackup = Preferences.getBoolean("contribution.backup.on_install"); @@ -306,8 +314,7 @@ LocalContribution copyAndLoad(Base base, Util.removeDir(contribFolder); } - } - else { + } else { // This if should ideally never happen, since this function // is to be called only when restarting on update if (contribFolder.exists() && contribFolder.isDirectory()) { diff --git a/todo.txt b/todo.txt index c8194a57db..8b692a2bf4 100644 --- a/todo.txt +++ b/todo.txt @@ -6,6 +6,8 @@ X update AppBundler to use newer SDK, recompile X edit build.xml files and appbundler to preserve more attributes X contrib listing names should not be case sensitive X libs in all caps appeared above those in lowercase +X ignore library subfolders +X don't unzip __MACOSX files with contribs contribs X tweak mode not working From 8430922f5e8fc679974f56c9351598560343a132 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 16 Jan 2020 19:25:44 -0500 Subject: [PATCH 130/172] don't remove old sketch name from Recent menu on Save As (fixes #5902) --- app/src/processing/app/Sketch.java | 21 ++++++++++++++------- app/src/processing/app/ui/Recent.java | 3 +++ todo.txt | 6 ++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index 7d3caf8988..e686dc1823 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -573,7 +573,7 @@ protected void nameCode(String newName) { code[i].setFolder(newFolder); } // Update internal state to reflect the new location - updateInternal(sanitaryName, newFolder); + updateInternal(sanitaryName, newFolder, renamingCode); // File newMainFile = new File(newFolder, newName + ".pde"); // String newMainFilePath = newMainFile.getAbsolutePath(); @@ -985,15 +985,17 @@ public boolean accept(File file) { // While the old path to the main .pde is still set, remove the entry from // the Recent menu so that it's not sticking around after the rename. // If untitled, it won't be in the menu, so there's no point. - if (!isUntitled()) { - Recent.remove(editor); - } +// if (!isUntitled()) { +// Recent.remove(editor); +// } + // Folks didn't like this behavior, so shutting it off + // https://github.com/processing/processing/issues/5902 // save the main tab with its new name File newFile = new File(newFolder, newName + "." + mode.getDefaultExtension()); code[0].saveAs(newFile); - updateInternal(newName, newFolder); + updateInternal(newName, newFolder, false); // Make sure that it's not an untitled sketch setUntitled(false); @@ -1191,7 +1193,8 @@ public void done() { /** * Update internal state for new sketch name or folder location. */ - protected void updateInternal(String sketchName, File sketchFolder) { + protected void updateInternal(String sketchName, File sketchFolder, + boolean renaming) { // reset all the state information for the sketch object String oldPath = getMainFilePath(); primaryFile = code[0].getFile(); @@ -1213,7 +1216,11 @@ protected void updateInternal(String sketchName, File sketchFolder) { // System.out.println("modified is now " + modified); editor.updateTitle(); editor.getBase().rebuildSketchbookMenus(); - Recent.rename(editor, oldPath); + if (renaming) { + // only update the Recent menu if it's a rename, not a Save As + // https://github.com/processing/processing/issues/5902 + Recent.rename(editor, oldPath); + } // editor.header.rebuild(); } diff --git a/app/src/processing/app/ui/Recent.java b/app/src/processing/app/ui/Recent.java index 92f62ba7c0..bc26761736 100644 --- a/app/src/processing/app/ui/Recent.java +++ b/app/src/processing/app/ui/Recent.java @@ -242,6 +242,8 @@ public void actionPerformed(ActionEvent e) { synchronized static public void remove(Editor editor) { int index = findRecord(editor.getSketch().getMainFilePath()); if (index != -1) { + System.out.println("removing " + editor.getSketch().getMainFilePath()); + new Exception().printStackTrace(System.out); records.remove(index); } } @@ -291,6 +293,7 @@ synchronized static public void append(Editor editor) { // If this sketch is already in the menu, remove it remove(editor); + // If the list is full, remove the first entry if (records.size() == Preferences.getInteger("recent.count")) { records.remove(0); // remove the first entry } diff --git a/todo.txt b/todo.txt index 8b692a2bf4..993b86838d 100644 --- a/todo.txt +++ b/todo.txt @@ -8,6 +8,12 @@ X contrib listing names should not be case sensitive X libs in all caps appeared above those in lowercase X ignore library subfolders X don't unzip __MACOSX files with contribs +X don't do library subfolders +X show error when .properties file is missing from contribs +X clean up a lot of bad temp file handling in the contrib manager +X https://github.com/processing/processing/issues/5845 +X don't remove entries from Recent menu on Save As +X https://github.com/processing/processing/issues/5902 contribs X tweak mode not working From 65a73ec65a3facddf02553f9385ab30f26db64e0 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 17 Jan 2020 10:42:23 -0500 Subject: [PATCH 131/172] catch null folder list on startup (fixes #5823) --- .../app/contrib/ContributionManager.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/app/src/processing/app/contrib/ContributionManager.java b/app/src/processing/app/contrib/ContributionManager.java index 46f892ca77..af9c4d8995 100644 --- a/app/src/processing/app/contrib/ContributionManager.java +++ b/app/src/processing/app/contrib/ContributionManager.java @@ -619,16 +619,21 @@ public boolean accept(File folder) { } }); - for (File file : installList) { - for (AvailableContribution contrib : listing.advertisedContributions) { - if (file.getName().equals(contrib.getName())) { - file.delete(); - installOnStartUp(base, contrib); - EventQueue.invokeAndWait(() -> { - listing.replaceContribution(contrib, contrib); - }); + // https://github.com/processing/processing/issues/5823 + if (installList != null) { + for (File file : installList) { + for (AvailableContribution contrib : listing.advertisedContributions) { + if (file.getName().equals(contrib.getName())) { + file.delete(); + installOnStartUp(base, contrib); + EventQueue.invokeAndWait(() -> { + listing.replaceContribution(contrib, contrib); + }); + } } } + } else { + System.err.println("Could not read " + root); } } From 67d57a725594a6785dada2845b920b82d51b96ac Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 17 Jan 2020 10:55:48 -0500 Subject: [PATCH 132/172] recent updates to contrib manager --- todo.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/todo.txt b/todo.txt index 993b86838d..4c7a4fc110 100644 --- a/todo.txt +++ b/todo.txt @@ -4,6 +4,13 @@ X https://github.com/processing/processing/issues/5794 X fix potential highlighting issue that wasn't selecting portions of text X update AppBundler to use newer SDK, recompile X edit build.xml files and appbundler to preserve more attributes +X don't remove entries from Recent menu on Save As +X https://github.com/processing/processing/issues/5902 +o NPE in buildCoreModes() on startup +o https://github.com/processing/processing/issues/5823 +X not clear what was wrong here + +contrib manager X contrib listing names should not be case sensitive X libs in all caps appeared above those in lowercase X ignore library subfolders @@ -12,8 +19,9 @@ X don't do library subfolders X show error when .properties file is missing from contribs X clean up a lot of bad temp file handling in the contrib manager X https://github.com/processing/processing/issues/5845 -X don't remove entries from Recent menu on Save As -X https://github.com/processing/processing/issues/5902 +X NPE in installPreviouslyFailed() on startup +X https://github.com/processing/processing/issues/5482 +X https://github.com/processing/processing/issues/5916 contribs X tweak mode not working @@ -23,10 +31,6 @@ X https://github.com/processing/processing/pull/5909 _ windows anti-malware leaves browser stuck at 100% _ https://github.com/processing/processing/issues/5893 -_ startup errors in contrib manager -_ https://github.com/processing/processing/issues/5482 -_ https://github.com/processing/processing/issues/5916 -_ https://github.com/processing/processing/issues/5823 from Casey _ Issue with https and downloading the binaries, +Checksums? From 4bc152519851f8258b276952d4788497303d1be9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 17 Jan 2020 10:56:07 -0500 Subject: [PATCH 133/172] just removing extra spaces from auto-generated code --- core/src/processing/core/PApplet.java | 90 ++++++++++++------------ core/src/processing/core/PGraphics.java | 92 ++++++++++++------------- 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 4492d6ae00..5f35bfc72c 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -12169,11 +12169,11 @@ public void rect(float a, float b, float c, float d, /** * ( begin auto-generated from square.xml ) * - * Draws a square to the screen. A square is a four-sided shape with - * every angle at ninety degrees and each side is the same length. - * By default, the first two parameters set the location of the - * upper-left corner, the third sets the width and height. The way - * these parameters are interpreted, however, may be changed with the + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the * rectMode() function. * * ( end auto-generated ) @@ -12282,9 +12282,9 @@ public void arc(float a, float b, float c, float d, /** * ( begin auto-generated from circle.xml ) * - * Draws a circle to the screen. By default, the first two parameters - * set the location of the center, and the third sets the shape's width - * and height. The origin may be changed with the ellipseMode() + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() * function. * * ( end auto-generated ) @@ -13326,28 +13326,28 @@ public void text(float num, float x, float y, float z) { /** * ( begin auto-generated from push.xml ) * - * The push() function saves the current drawing style - * settings and transformations, while pop() restores these - * settings. Note that these functions are always used together. - * They allow you to change the style and transformation settings - * and later return to what you had. When a new state is started - * with push(), it builds on the current style and transform + * The push() function saves the current drawing style + * settings and transformations, while pop() restores these + * settings. Note that these functions are always used together. + * They allow you to change the style and transformation settings + * and later return to what you had. When a new state is started + * with push(), it builds on the current style and transform * information.
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) @@ -13364,28 +13364,28 @@ public void push() { /** * ( begin auto-generated from pop.xml ) * - * The pop() function restores the previous drawing style - * settings and transformations after push() has changed them. - * Note that these functions are always used together. They allow - * you to change the style and transformation settings and later - * return to what you had. When a new state is started with push(), + * The pop() function restores the previous drawing style + * settings and transformations after push() has changed them. + * Note that these functions are always used together. They allow + * you to change the style and transformation settings and later + * return to what you had. When a new state is started with push(), * it builds on the current style and transform information.
*
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) @@ -14862,7 +14862,7 @@ public void specular(int rgb) { /** * gray number specifying value between white and black - * + * * @param gray value between black and white, by default 0 to 255 */ public void specular(float gray) { @@ -14929,7 +14929,7 @@ public void emissive(int rgb) { /** * gray number specifying value between white and black - * + * * @param gray value between black and white, by default 0 to 255 */ public void emissive(float gray) { diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 032b69928d..57c782f5f0 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013-19 The Processing Foundation + Copyright (c) 2013-20 The Processing Foundation Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology @@ -2732,11 +2732,11 @@ protected void rectImpl(float x1, float y1, float x2, float y2, /** * ( begin auto-generated from square.xml ) * - * Draws a square to the screen. A square is a four-sided shape with - * every angle at ninety degrees and each side is the same length. - * By default, the first two parameters set the location of the - * upper-left corner, the third sets the width and height. The way - * these parameters are interpreted, however, may be changed with the + * Draws a square to the screen. A square is a four-sided shape with + * every angle at ninety degrees and each side is the same length. + * By default, the first two parameters set the location of the + * upper-left corner, the third sets the width and height. The way + * these parameters are interpreted, however, may be changed with the * rectMode() function. * * ( end auto-generated ) @@ -2931,9 +2931,9 @@ protected void arcImpl(float x, float y, float w, float h, /** * ( begin auto-generated from circle.xml ) * - * Draws a circle to the screen. By default, the first two parameters - * set the location of the center, and the third sets the shape's width - * and height. The origin may be changed with the ellipseMode() + * Draws a circle to the screen. By default, the first two parameters + * set the location of the center, and the third sets the shape's width + * and height. The origin may be changed with the ellipseMode() * function. * * ( end auto-generated ) @@ -5167,28 +5167,28 @@ protected void textCharScreenImpl(PImage glyph, /** * ( begin auto-generated from push.xml ) * - * The push() function saves the current drawing style - * settings and transformations, while pop() restores these - * settings. Note that these functions are always used together. - * They allow you to change the style and transformation settings - * and later return to what you had. When a new state is started - * with push(), it builds on the current style and transform + * The push() function saves the current drawing style + * settings and transformations, while pop() restores these + * settings. Note that these functions are always used together. + * They allow you to change the style and transformation settings + * and later return to what you had. When a new state is started + * with push(), it builds on the current style and transform * information.
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) @@ -5204,28 +5204,28 @@ public void push() { /** * ( begin auto-generated from pop.xml ) * - * The pop() function restores the previous drawing style - * settings and transformations after push() has changed them. - * Note that these functions are always used together. They allow - * you to change the style and transformation settings and later - * return to what you had. When a new state is started with push(), + * The pop() function restores the previous drawing style + * settings and transformations after push() has changed them. + * Note that these functions are always used together. They allow + * you to change the style and transformation settings and later + * return to what you had. When a new state is started with push(), * it builds on the current style and transform information.
*
*
- * push() stores information related to the current - * transformation state and style settings controlled by the - * following functions: rotate(), translate(), - * scale(), fill(), stroke(), tint(), - * strokeWeight(), strokeCap(), strokeJoin(), - * imageMode(), rectMode(), ellipseMode(), - * colorMode(), textAlign(), textFont(), + * push() stores information related to the current + * transformation state and style settings controlled by the + * following functions: rotate(), translate(), + * scale(), fill(), stroke(), tint(), + * strokeWeight(), strokeCap(), strokeJoin(), + * imageMode(), rectMode(), ellipseMode(), + * colorMode(), textAlign(), textFont(), * textMode(), textSize(), textLeading().
*
- * The push() and pop() functions were added with - * Processing 3.5. They can be used in place of pushMatrix(), - * popMatrix(), pushStyles(), and popStyles(). - * The difference is that push() and pop() control both the - * transformations (rotate, scale, translate) and the drawing styles + * The push() and pop() functions were added with + * Processing 3.5. They can be used in place of pushMatrix(), + * popMatrix(), pushStyles(), and popStyles(). + * The difference is that push() and pop() control both the + * transformations (rotate, scale, translate) and the drawing styles * at the same time. * * ( end auto-generated ) @@ -6940,7 +6940,7 @@ public void specular(int rgb) { /** * gray number specifying value between white and black - * + * * @param gray value between black and white, by default 0 to 255 */ public void specular(float gray) { @@ -7019,7 +7019,7 @@ public void emissive(int rgb) { /** * gray number specifying value between white and black - * + * * @param gray value between black and white, by default 0 to 255 */ public void emissive(float gray) { From a1e623c59afb5cfadfaefdf2e9f15ee82cee19cd Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 17 Jan 2020 11:13:04 -0500 Subject: [PATCH 134/172] wrapping up other changes/edits --- core/todo.txt | 6 ++++-- todo.txt | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/todo.txt b/core/todo.txt index a5d49046a3..750a8e7772 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,9 +1,11 @@ -0270 (3.5.4 or 3.6) +0270 (3.5.4) +no changes + + _ size() issues on Mojave? _ https://github.com/processing/processing/issues/5791 _ use exit event to set mouseY to 0 on macOS _ https://github.com/processing/processing/pull/5796/files - _ possible fix for precision issues with PDF _ https://github.com/processing/processing/issues/5801#issuecomment-466632459 diff --git a/todo.txt b/todo.txt index 4c7a4fc110..113b6a27e0 100644 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,4 @@ -0270 (3.5.4 or 3.6) +0270 (3.5.4) X use ctrl-page up/down for tabs on Windows X https://github.com/processing/processing/issues/5794 X fix potential highlighting issue that wasn't selecting portions of text @@ -19,6 +19,7 @@ X don't do library subfolders X show error when .properties file is missing from contribs X clean up a lot of bad temp file handling in the contrib manager X https://github.com/processing/processing/issues/5845 +X https://github.com/processing/processing/issues/5960 X NPE in installPreviouslyFailed() on startup X https://github.com/processing/processing/issues/5482 X https://github.com/processing/processing/issues/5916 @@ -28,9 +29,6 @@ X tweak mode not working X https://github.com/processing/processing/issues/5805 X https://github.com/processing/processing/pull/5909 -_ windows anti-malware leaves browser stuck at 100% -_ https://github.com/processing/processing/issues/5893 - from Casey _ Issue with https and downloading the binaries, +Checksums? @@ -70,6 +68,8 @@ _ https://github.com/processing/processing/pull/4040 high +_ windows anti-malware leaves browser stuck at 100% +_ https://github.com/processing/processing/issues/5893 _ run button not deactivating _ https://github.com/processing/processing/issues/5786 _ Find in Reference disabled for various keywords (draw, for, if, catch, while) From 349282fa1b15c7be47f5de0b3a8eb76f23eafce9 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 17 Jan 2020 11:20:35 -0500 Subject: [PATCH 135/172] write release notes --- build/shared/revisions.txt | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 90daa44f8e..5ed6ba5914 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,3 +1,54 @@ +PROCESSING 3.5.4 (REV 0270) - 17 January 2020 + +This release has several bug fixes to improve the Contribution Manager, +get Tweak Mode working again, and so on. + + +[ changes ] + ++ Don't remove entries from Recent menu on Save As + https://github.com/processing/processing/issues/5902 + ++ Use ctrl-page up/down for changing tabs on Windows + https://github.com/processing/processing/issues/5794 + ++ Show error when .properties file is missing from a Library/Mode/Tool. + + +[ fixes ] + ++ Tweak Mode working again (fix from Gal Sasson) + https://github.com/processing/processing/issues/5805 + https://github.com/processing/processing/pull/5909 + ++ Fix potential highlighting issue that wasn't selecting portions of text + ++ Names in the contribution listing are no longer case sensitive + (It was placing lowercase names at the bottom of the list.) + ++ Clean up a lot of bad temp file handling in the contrib manager + https://github.com/processing/processing/issues/5845 + https://github.com/processing/processing/issues/5960 + ++ Fix NullPointerException in installPreviouslyFailed() on startup + https://github.com/processing/processing/issues/5482 + https://github.com/processing/processing/issues/5916 + + +[ internal ] + ++ Ignore subfolders in the "libraries" directory. This was causing some + nasty startup issues for folks, and other hard-to-track bugs. Hopefully + there aren't any installs that relied on this behavior. + ++ Update AppBundler to use newer SDK, recompile + ++ Edit build.xml files and appbundler to preserve more attributes + + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + PROCESSING 3.5.3 (REV 0269) - 3 February 2019 This fixes a typo that left the "Redo" command with the wrong From e11941e0c3463cea7cd94e7204dfdb2c0d5d8f6b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 17 Jan 2020 12:46:01 -0500 Subject: [PATCH 136/172] rolling over for the next release --- app/src/processing/app/Base.java | 4 ++-- core/done.txt | 4 ++++ core/todo.txt | 3 +-- done.txt | 32 ++++++++++++++++++++++++++++++++ todo.txt | 31 +------------------------------ 5 files changed, 40 insertions(+), 34 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 91472a09e9..5d9b0a114c 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -56,9 +56,9 @@ public class Base { // Added accessors for 0218 because the UpdateCheck class was not properly // updating the values, due to javac inlining the static final values. - static private final int REVISION = 270; + static private final int REVISION = 271; /** This might be replaced by main() if there's a lib/version.txt file. */ - static private String VERSION_NAME = "0270"; //$NON-NLS-1$ + static private String VERSION_NAME = "0271"; //$NON-NLS-1$ /** Set true if this a proper release rather than a numbered revision. */ /** diff --git a/core/done.txt b/core/done.txt index abbdd66c29..a04e597a69 100644 --- a/core/done.txt +++ b/core/done.txt @@ -1,3 +1,7 @@ +0270 (3.5.4) +no changes + + 0269 (3.5.3) X fix/clean a few file i/o issues X deal with possible resource leak when loading URLs diff --git a/core/todo.txt b/core/todo.txt index 750a8e7772..c15593393c 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,5 +1,4 @@ -0270 (3.5.4) -no changes +0271 (3.5.5 unlikely) _ size() issues on Mojave? diff --git a/done.txt b/done.txt index 1da976c40b..ef2420519b 100644 --- a/done.txt +++ b/done.txt @@ -1,3 +1,35 @@ +0270 (3.5.4) +X use ctrl-page up/down for tabs on Windows +X https://github.com/processing/processing/issues/5794 +X fix potential highlighting issue that wasn't selecting portions of text +X update AppBundler to use newer SDK, recompile +X edit build.xml files and appbundler to preserve more attributes +X don't remove entries from Recent menu on Save As +X https://github.com/processing/processing/issues/5902 +o NPE in buildCoreModes() on startup +o https://github.com/processing/processing/issues/5823 +X not clear what was wrong here + +contrib manager +X contrib listing names should not be case sensitive +X libs in all caps appeared above those in lowercase +X ignore library subfolders +X don't unzip __MACOSX files with contribs +X don't do library subfolders +X show error when .properties file is missing from contribs +X clean up a lot of bad temp file handling in the contrib manager +X https://github.com/processing/processing/issues/5845 +X https://github.com/processing/processing/issues/5960 +X NPE in installPreviouslyFailed() on startup +X https://github.com/processing/processing/issues/5482 +X https://github.com/processing/processing/issues/5916 + +contribs +X tweak mode not working +X https://github.com/processing/processing/issues/5805 +X https://github.com/processing/processing/pull/5909 + + 0269 (3.5.3) X added reference for circle(), square(), push(), pop() X has the reference.zip file been fixed? (yep) diff --git a/todo.txt b/todo.txt index 113b6a27e0..9b53d85580 100644 --- a/todo.txt +++ b/todo.txt @@ -1,33 +1,4 @@ -0270 (3.5.4) -X use ctrl-page up/down for tabs on Windows -X https://github.com/processing/processing/issues/5794 -X fix potential highlighting issue that wasn't selecting portions of text -X update AppBundler to use newer SDK, recompile -X edit build.xml files and appbundler to preserve more attributes -X don't remove entries from Recent menu on Save As -X https://github.com/processing/processing/issues/5902 -o NPE in buildCoreModes() on startup -o https://github.com/processing/processing/issues/5823 -X not clear what was wrong here - -contrib manager -X contrib listing names should not be case sensitive -X libs in all caps appeared above those in lowercase -X ignore library subfolders -X don't unzip __MACOSX files with contribs -X don't do library subfolders -X show error when .properties file is missing from contribs -X clean up a lot of bad temp file handling in the contrib manager -X https://github.com/processing/processing/issues/5845 -X https://github.com/processing/processing/issues/5960 -X NPE in installPreviouslyFailed() on startup -X https://github.com/processing/processing/issues/5482 -X https://github.com/processing/processing/issues/5916 - -contribs -X tweak mode not working -X https://github.com/processing/processing/issues/5805 -X https://github.com/processing/processing/pull/5909 +0271 (3.5.5 unlikely) from Casey From 83fe79dc5ea7255045c523210075fbfe7de6a771 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 17 Jan 2020 16:42:21 -0500 Subject: [PATCH 137/172] make note of #5828 and #5906 --- todo.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/todo.txt b/todo.txt index 9b53d85580..cd2ec96414 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,10 @@ 0271 (3.5.5 unlikely) +contribs +X rename-variable menu allows Java identifiers +X https://github.com/processing/processing/issues/5828 +X https://github.com/processing/processing/pull/5906 + from Casey _ Issue with https and downloading the binaries, +Checksums? From f923be3fa2832fa8bc46696d672fc2674894d440 Mon Sep 17 00:00:00 2001 From: minimaximize Date: Sat, 7 Dec 2019 18:24:26 +1000 Subject: [PATCH 138/172] Use Java conventions for Array declaration --- core/src/processing/awt/PGraphicsJava2D.java | 10 +- core/src/processing/core/PApplet.java | 352 +++++++++--------- core/src/processing/core/PFont.java | 8 +- core/src/processing/core/PGraphics.java | 22 +- core/src/processing/core/PImage.java | 26 +- core/src/processing/core/PMatrix2D.java | 2 +- core/src/processing/core/PShapeOBJ.java | 2 +- core/src/processing/core/PShapeSVG.java | 6 +- core/src/processing/data/Table.java | 10 +- core/src/processing/javafx/PGraphicsFX2D.java | 6 +- core/src/processing/opengl/LinePath.java | 6 +- core/src/processing/opengl/PGL.java | 4 +- .../processing/opengl/PGraphicsOpenGL.java | 164 ++++---- core/src/processing/opengl/PJOGL.java | 4 +- 14 files changed, 303 insertions(+), 319 deletions(-) diff --git a/core/src/processing/awt/PGraphicsJava2D.java b/core/src/processing/awt/PGraphicsJava2D.java index c93ecada20..7d6e1c5972 100644 --- a/core/src/processing/awt/PGraphicsJava2D.java +++ b/core/src/processing/awt/PGraphicsJava2D.java @@ -82,7 +82,7 @@ public class PGraphicsJava2D extends PGraphics { float[] curveDrawY; int transformCount; - AffineTransform transformStack[] = + AffineTransform[] transformStack = new AffineTransform[MATRIX_STACK_DEPTH]; double[] transform = new double[6]; @@ -782,7 +782,7 @@ public void vertex(float x, float y) { //float vertex[]; if (vertexCount == vertices.length) { - float temp[][] = new float[vertexCount<<1][VERTEX_FIELD_COUNT]; + float[][] temp = new float[vertexCount<<1][VERTEX_FIELD_COUNT]; System.arraycopy(vertices, 0, temp, 0, vertexCount); vertices = temp; //message(CHATTER, "allocating more vertices " + vertices.length); @@ -1959,7 +1959,7 @@ protected void handleTextSize(float size) { @Override - protected float textWidthImpl(char buffer[], int start, int stop) { + protected float textWidthImpl(char[] buffer, int start, int stop) { if (textFont == null) { defaultFontOrDeath("textWidth"); } @@ -2028,7 +2028,7 @@ protected float textWidthImpl(char buffer[], int start, int stop) { @Override - protected void textLineImpl(char buffer[], int start, int stop, + protected void textLineImpl(char[] buffer, int start, int stop, float x, float y) { Font font = (Font) textFont.getNative(); // if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) { @@ -2828,7 +2828,7 @@ public void updatePixels(int x, int y, int c, int d) { // GET/SET - static int getset[] = new int[1]; + static int[] getset = new int[1]; @Override diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 4492d6ae00..2d5f4db5a7 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -5548,7 +5548,7 @@ public PImage loadImage(String filename, String extension) { //, Object params) } if (extension.equals("tif") || extension.equals("tiff")) { - byte bytes[] = loadBytes(filename); + byte[] bytes = loadBytes(filename); PImage image = (bytes == null) ? null : PImage.loadTIFF(bytes); // if (params != null) { // image.setParams(g, params); @@ -5563,7 +5563,7 @@ public PImage loadImage(String filename, String extension) { //, Object params) if (extension.equals("jpg") || extension.equals("jpeg") || extension.equals("gif") || extension.equals("png") || extension.equals("unknown")) { - byte bytes[] = loadBytes(filename); + byte[] bytes = loadBytes(filename); if (bytes == null) { return null; } else { @@ -5765,7 +5765,7 @@ protected PImage loadImageTGA(String filename) throws IOException { InputStream is = createInput(filename); if (is == null) return null; - byte header[] = new byte[18]; + byte[] header = new byte[18]; int offset = 0; do { int count = is.read(header, offset, header.length - offset); @@ -5885,7 +5885,7 @@ header[17] image descriptor (packed bits) } else { // header[2] is 10 or 11 int index = 0; - int px[] = outgoing.pixels; + int[] px = outgoing.pixels; while (index < px.length) { int num = is.read(); @@ -7600,12 +7600,12 @@ static public String[] loadStrings(InputStream input) { static public String[] loadStrings(BufferedReader reader) { try { - String lines[] = new String[100]; + String[] lines = new String[100]; int lineCount = 0; String line = null; while ((line = reader.readLine()) != null) { if (lineCount == lines.length) { - String temp[] = new String[lineCount << 1]; + String[] temp = new String[lineCount << 1]; System.arraycopy(lines, 0, temp, 0, lineCount); lines = temp; } @@ -7618,7 +7618,7 @@ static public String[] loadStrings(BufferedReader reader) { } // resize array to appropriate amount for these lines - String output[] = new String[lineCount]; + String[] output = new String[lineCount]; System.arraycopy(lines, 0, output, 0, lineCount); return output; @@ -7919,7 +7919,7 @@ static public void saveBytes(OutputStream output, byte[] data) { * @see PApplet#loadBytes(String) * @see PApplet#saveBytes(String, byte[]) */ - public void saveStrings(String filename, String data[]) { + public void saveStrings(String filename, String[] data) { saveStrings(saveFile(filename), data); } @@ -7927,7 +7927,7 @@ public void saveStrings(String filename, String data[]) { /** * @nowebref */ - static public void saveStrings(File file, String data[]) { + static public void saveStrings(File file, String[] data) { saveStrings(createOutput(file), data); } @@ -8241,7 +8241,7 @@ static public String urlDecode(String str) { * @param list array to sort * @see PApplet#reverse(boolean[]) */ - static public byte[] sort(byte list[]) { + static public byte[] sort(byte[] list) { return sort(list, list.length); } @@ -8255,7 +8255,7 @@ static public byte[] sort(byte[] list, int count) { return outgoing; } - static public char[] sort(char list[]) { + static public char[] sort(char[] list) { return sort(list, list.length); } @@ -8266,7 +8266,7 @@ static public char[] sort(char[] list, int count) { return outgoing; } - static public int[] sort(int list[]) { + static public int[] sort(int[] list) { return sort(list, list.length); } @@ -8277,7 +8277,7 @@ static public int[] sort(int[] list, int count) { return outgoing; } - static public float[] sort(float list[]) { + static public float[] sort(float[] list) { return sort(list, list.length); } @@ -8288,7 +8288,7 @@ static public float[] sort(float[] list, int count) { return outgoing; } - static public String[] sort(String list[]) { + static public String[] sort(String[] list) { return sort(list, list.length); } @@ -8395,85 +8395,85 @@ static public void arraycopy(Object src, Object dst) { * @param list the array to expand * @see PApplet#shorten(boolean[]) */ - static public boolean[] expand(boolean list[]) { + static public boolean[] expand(boolean[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } /** * @param newSize new size for the array */ - static public boolean[] expand(boolean list[], int newSize) { - boolean temp[] = new boolean[newSize]; + static public boolean[] expand(boolean[] list, int newSize) { + boolean[] temp = new boolean[newSize]; System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; } - static public byte[] expand(byte list[]) { + static public byte[] expand(byte[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } - static public byte[] expand(byte list[], int newSize) { - byte temp[] = new byte[newSize]; + static public byte[] expand(byte[] list, int newSize) { + byte[] temp = new byte[newSize]; System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; } - static public char[] expand(char list[]) { + static public char[] expand(char[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } - static public char[] expand(char list[], int newSize) { - char temp[] = new char[newSize]; + static public char[] expand(char[] list, int newSize) { + char[] temp = new char[newSize]; System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; } - static public int[] expand(int list[]) { + static public int[] expand(int[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } - static public int[] expand(int list[], int newSize) { - int temp[] = new int[newSize]; + static public int[] expand(int[] list, int newSize) { + int[] temp = new int[newSize]; System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; } - static public long[] expand(long list[]) { + static public long[] expand(long[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } - static public long[] expand(long list[], int newSize) { - long temp[] = new long[newSize]; + static public long[] expand(long[] list, int newSize) { + long[] temp = new long[newSize]; System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; } - static public float[] expand(float list[]) { + static public float[] expand(float[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } - static public float[] expand(float list[], int newSize) { - float temp[] = new float[newSize]; + static public float[] expand(float[] list, int newSize) { + float[] temp = new float[newSize]; System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; } - static public double[] expand(double list[]) { + static public double[] expand(double[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } - static public double[] expand(double list[], int newSize) { - double temp[] = new double[newSize]; + static public double[] expand(double[] list, int newSize) { + double[] temp = new double[newSize]; System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; } - static public String[] expand(String list[]) { + static public String[] expand(String[] list) { return expand(list, list.length > 0 ? list.length << 1 : 1); } - static public String[] expand(String list[], int newSize) { - String temp[] = new String[newSize]; + static public String[] expand(String[] list, int newSize) { + String[] temp = new String[newSize]; // in case the new size is smaller than list.length System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length)); return temp; @@ -8517,31 +8517,31 @@ static public Object expand(Object list, int newSize) { * @see PApplet#shorten(boolean[]) * @see PApplet#expand(boolean[]) */ - static public byte[] append(byte array[], byte value) { + static public byte[] append(byte[] array, byte value) { array = expand(array, array.length + 1); array[array.length-1] = value; return array; } - static public char[] append(char array[], char value) { + static public char[] append(char[] array, char value) { array = expand(array, array.length + 1); array[array.length-1] = value; return array; } - static public int[] append(int array[], int value) { + static public int[] append(int[] array, int value) { array = expand(array, array.length + 1); array[array.length-1] = value; return array; } - static public float[] append(float array[], float value) { + static public float[] append(float[] array, float value) { array = expand(array, array.length + 1); array[array.length-1] = value; return array; } - static public String[] append(String array[], String value) { + static public String[] append(String[] array, String value) { array = expand(array, array.length + 1); array[array.length-1] = value; return array; @@ -8571,27 +8571,27 @@ static public Object append(Object array, Object value) { * @see PApplet#append(byte[], byte) * @see PApplet#expand(boolean[]) */ - static public boolean[] shorten(boolean list[]) { + static public boolean[] shorten(boolean[] list) { return subset(list, 0, list.length-1); } - static public byte[] shorten(byte list[]) { + static public byte[] shorten(byte[] list) { return subset(list, 0, list.length-1); } - static public char[] shorten(char list[]) { + static public char[] shorten(char[] list) { return subset(list, 0, list.length-1); } - static public int[] shorten(int list[]) { + static public int[] shorten(int[] list) { return subset(list, 0, list.length-1); } - static public float[] shorten(float list[]) { + static public float[] shorten(float[] list) { return subset(list, 0, list.length-1); } - static public String[] shorten(String list[]) { + static public String[] shorten(String[] list) { return subset(list, 0, list.length-1); } @@ -8621,9 +8621,9 @@ static public Object shorten(Object list) { * @see PApplet#concat(boolean[], boolean[]) * @see PApplet#subset(boolean[], int, int) */ - static final public boolean[] splice(boolean list[], + static final public boolean[] splice(boolean[] list, boolean value, int index) { - boolean outgoing[] = new boolean[list.length + 1]; + boolean[] outgoing = new boolean[list.length + 1]; System.arraycopy(list, 0, outgoing, 0, index); outgoing[index] = value; System.arraycopy(list, index, outgoing, index + 1, @@ -8631,9 +8631,9 @@ static final public boolean[] splice(boolean list[], return outgoing; } - static final public boolean[] splice(boolean list[], - boolean value[], int index) { - boolean outgoing[] = new boolean[list.length + value.length]; + static final public boolean[] splice(boolean[] list, + boolean[] value, int index) { + boolean[] outgoing = new boolean[list.length + value.length]; System.arraycopy(list, 0, outgoing, 0, index); System.arraycopy(value, 0, outgoing, index, value.length); System.arraycopy(list, index, outgoing, index + value.length, @@ -8641,9 +8641,9 @@ static final public boolean[] splice(boolean list[], return outgoing; } - static final public byte[] splice(byte list[], + static final public byte[] splice(byte[] list, byte value, int index) { - byte outgoing[] = new byte[list.length + 1]; + byte[] outgoing = new byte[list.length + 1]; System.arraycopy(list, 0, outgoing, 0, index); outgoing[index] = value; System.arraycopy(list, index, outgoing, index + 1, @@ -8651,9 +8651,9 @@ static final public byte[] splice(byte list[], return outgoing; } - static final public byte[] splice(byte list[], - byte value[], int index) { - byte outgoing[] = new byte[list.length + value.length]; + static final public byte[] splice(byte[] list, + byte[] value, int index) { + byte[] outgoing = new byte[list.length + value.length]; System.arraycopy(list, 0, outgoing, 0, index); System.arraycopy(value, 0, outgoing, index, value.length); System.arraycopy(list, index, outgoing, index + value.length, @@ -8662,9 +8662,9 @@ static final public byte[] splice(byte list[], } - static final public char[] splice(char list[], + static final public char[] splice(char[] list, char value, int index) { - char outgoing[] = new char[list.length + 1]; + char[] outgoing = new char[list.length + 1]; System.arraycopy(list, 0, outgoing, 0, index); outgoing[index] = value; System.arraycopy(list, index, outgoing, index + 1, @@ -8672,9 +8672,9 @@ static final public char[] splice(char list[], return outgoing; } - static final public char[] splice(char list[], - char value[], int index) { - char outgoing[] = new char[list.length + value.length]; + static final public char[] splice(char[] list, + char[] value, int index) { + char[] outgoing = new char[list.length + value.length]; System.arraycopy(list, 0, outgoing, 0, index); System.arraycopy(value, 0, outgoing, index, value.length); System.arraycopy(list, index, outgoing, index + value.length, @@ -8682,9 +8682,9 @@ static final public char[] splice(char list[], return outgoing; } - static final public int[] splice(int list[], + static final public int[] splice(int[] list, int value, int index) { - int outgoing[] = new int[list.length + 1]; + int[] outgoing = new int[list.length + 1]; System.arraycopy(list, 0, outgoing, 0, index); outgoing[index] = value; System.arraycopy(list, index, outgoing, index + 1, @@ -8692,9 +8692,9 @@ static final public int[] splice(int list[], return outgoing; } - static final public int[] splice(int list[], - int value[], int index) { - int outgoing[] = new int[list.length + value.length]; + static final public int[] splice(int[] list, + int[] value, int index) { + int[] outgoing = new int[list.length + value.length]; System.arraycopy(list, 0, outgoing, 0, index); System.arraycopy(value, 0, outgoing, index, value.length); System.arraycopy(list, index, outgoing, index + value.length, @@ -8702,9 +8702,9 @@ static final public int[] splice(int list[], return outgoing; } - static final public float[] splice(float list[], + static final public float[] splice(float[] list, float value, int index) { - float outgoing[] = new float[list.length + 1]; + float[] outgoing = new float[list.length + 1]; System.arraycopy(list, 0, outgoing, 0, index); outgoing[index] = value; System.arraycopy(list, index, outgoing, index + 1, @@ -8712,9 +8712,9 @@ static final public float[] splice(float list[], return outgoing; } - static final public float[] splice(float list[], - float value[], int index) { - float outgoing[] = new float[list.length + value.length]; + static final public float[] splice(float[] list, + float[] value, int index) { + float[] outgoing = new float[list.length + value.length]; System.arraycopy(list, 0, outgoing, 0, index); System.arraycopy(value, 0, outgoing, index, value.length); System.arraycopy(list, index, outgoing, index + value.length, @@ -8722,9 +8722,9 @@ static final public float[] splice(float list[], return outgoing; } - static final public String[] splice(String list[], + static final public String[] splice(String[] list, String value, int index) { - String outgoing[] = new String[list.length + 1]; + String[] outgoing = new String[list.length + 1]; System.arraycopy(list, 0, outgoing, 0, index); outgoing[index] = value; System.arraycopy(list, index, outgoing, index + 1, @@ -8732,9 +8732,9 @@ static final public String[] splice(String list[], return outgoing; } - static final public String[] splice(String list[], - String value[], int index) { - String outgoing[] = new String[list.length + value.length]; + static final public String[] splice(String[] list, + String[] value, int index) { + String[] outgoing = new String[list.length + value.length]; System.arraycopy(list, 0, outgoing, 0, index); System.arraycopy(value, 0, outgoing, index, value.length); System.arraycopy(list, index, outgoing, index + value.length, @@ -8915,43 +8915,43 @@ static public Object subset(Object list, int start, int count) { * @see PApplet#splice(boolean[], boolean, int) * @see PApplet#arrayCopy(Object, int, Object, int, int) */ - static public boolean[] concat(boolean a[], boolean b[]) { - boolean c[] = new boolean[a.length + b.length]; + static public boolean[] concat(boolean[] a, boolean[] b) { + boolean[] c = new boolean[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } - static public byte[] concat(byte a[], byte b[]) { - byte c[] = new byte[a.length + b.length]; + static public byte[] concat(byte[] a, byte[] b) { + byte[] c = new byte[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } - static public char[] concat(char a[], char b[]) { - char c[] = new char[a.length + b.length]; + static public char[] concat(char[] a, char[] b) { + char[] c = new char[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } - static public int[] concat(int a[], int b[]) { - int c[] = new int[a.length + b.length]; + static public int[] concat(int[] a, int[] b) { + int[] c = new int[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } - static public float[] concat(float a[], float b[]) { - float c[] = new float[a.length + b.length]; + static public float[] concat(float[] a, float[] b) { + float[] c = new float[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } - static public String[] concat(String a[], String b[]) { - String c[] = new String[a.length + b.length]; + static public String[] concat(String[] a, String[] b) { + String[] c = new String[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; @@ -8980,8 +8980,8 @@ static public Object concat(Object a, Object b) { * @param list booleans[], bytes[], chars[], ints[], floats[], or Strings[] * @see PApplet#sort(String[], int) */ - static public boolean[] reverse(boolean list[]) { - boolean outgoing[] = new boolean[list.length]; + static public boolean[] reverse(boolean[] list) { + boolean[] outgoing = new boolean[list.length]; int length1 = list.length - 1; for (int i = 0; i < list.length; i++) { outgoing[i] = list[length1 - i]; @@ -8989,8 +8989,8 @@ static public boolean[] reverse(boolean list[]) { return outgoing; } - static public byte[] reverse(byte list[]) { - byte outgoing[] = new byte[list.length]; + static public byte[] reverse(byte[] list) { + byte[] outgoing = new byte[list.length]; int length1 = list.length - 1; for (int i = 0; i < list.length; i++) { outgoing[i] = list[length1 - i]; @@ -8998,8 +8998,8 @@ static public byte[] reverse(byte list[]) { return outgoing; } - static public char[] reverse(char list[]) { - char outgoing[] = new char[list.length]; + static public char[] reverse(char[] list) { + char[] outgoing = new char[list.length]; int length1 = list.length - 1; for (int i = 0; i < list.length; i++) { outgoing[i] = list[length1 - i]; @@ -9007,8 +9007,8 @@ static public char[] reverse(char list[]) { return outgoing; } - static public int[] reverse(int list[]) { - int outgoing[] = new int[list.length]; + static public int[] reverse(int[] list) { + int[] outgoing = new int[list.length]; int length1 = list.length - 1; for (int i = 0; i < list.length; i++) { outgoing[i] = list[length1 - i]; @@ -9016,8 +9016,8 @@ static public int[] reverse(int list[]) { return outgoing; } - static public float[] reverse(float list[]) { - float outgoing[] = new float[list.length]; + static public float[] reverse(float[] list) { + float[] outgoing = new float[list.length]; int length1 = list.length - 1; for (int i = 0; i < list.length; i++) { outgoing[i] = list[length1 - i]; @@ -9025,8 +9025,8 @@ static public float[] reverse(float list[]) { return outgoing; } - static public String[] reverse(String list[]) { - String outgoing[] = new String[list.length]; + static public String[] reverse(String[] list) { + String[] outgoing = new String[list.length]; int length1 = list.length - 1; for (int i = 0; i < list.length; i++) { outgoing[i] = list[length1 - i]; @@ -9149,7 +9149,7 @@ static public String[] splitTokens(String value) { */ static public String[] splitTokens(String value, String delim) { StringTokenizer toker = new StringTokenizer(value, delim); - String pieces[] = new String[toker.countTokens()]; + String[] pieces = new String[toker.countTokens()]; int index = 0; while (toker.hasMoreTokens()) { @@ -9199,7 +9199,7 @@ static public String[] split(String value, char delim) { if (value == null) return null; //return split(what, String.valueOf(delim)); // huh - char chars[] = value.toCharArray(); + char[] chars = value.toCharArray(); int splitCount = 0; //1; for (int i = 0; i < chars.length; i++) { if (chars[i] == delim) splitCount++; @@ -9211,12 +9211,12 @@ static public String[] split(String value, char delim) { // on second thought, i don't agree with this, will disable //} if (splitCount == 0) { - String splits[] = new String[1]; + String[] splits = new String[1]; splits[0] = value; return splits; } //int pieceCount = splitCount + 1; - String splits[] = new String[splitCount + 1]; + String[] splits = new String[splitCount + 1]; int splitIndex = 0; int startIndex = 0; for (int i = 0; i < chars.length; i++) { @@ -9457,8 +9457,8 @@ static final public boolean[] parseBoolean(byte what[]) { * to zero will return false, and any other value will return true. * @return array of boolean elements */ - static final public boolean[] parseBoolean(int what[]) { - boolean outgoing[] = new boolean[what.length]; + static final public boolean[] parseBoolean(int[] what) { + boolean[] outgoing = new boolean[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = (what[i] != 0); } @@ -9476,8 +9476,8 @@ static final public boolean[] parseBoolean(float what[]) { } */ - static final public boolean[] parseBoolean(String what[]) { - boolean outgoing[] = new boolean[what.length]; + static final public boolean[] parseBoolean(String[] what) { + boolean[] outgoing = new boolean[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = Boolean.parseBoolean(what[i]); } @@ -9511,32 +9511,32 @@ static final public byte[] parseByte(String what) { // note: array[] // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - static final public byte[] parseByte(boolean what[]) { - byte outgoing[] = new byte[what.length]; + static final public byte[] parseByte(boolean[] what) { + byte[] outgoing = new byte[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = what[i] ? (byte)1 : 0; } return outgoing; } - static final public byte[] parseByte(char what[]) { - byte outgoing[] = new byte[what.length]; + static final public byte[] parseByte(char[] what) { + byte[] outgoing = new byte[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = (byte) what[i]; } return outgoing; } - static final public byte[] parseByte(int what[]) { - byte outgoing[] = new byte[what.length]; + static final public byte[] parseByte(int[] what) { + byte[] outgoing = new byte[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = (byte) what[i]; } return outgoing; } - static final public byte[] parseByte(float what[]) { - byte outgoing[] = new byte[what.length]; + static final public byte[] parseByte(float[] what) { + byte[] outgoing = new byte[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = (byte) what[i]; } @@ -9591,8 +9591,8 @@ static final public char[] parseChar(boolean what[]) { // 0/1 or T/F ? } */ - static final public char[] parseChar(byte what[]) { - char outgoing[] = new char[what.length]; + static final public char[] parseChar(byte[] what) { + char[] outgoing = new char[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = (char) (what[i] & 0xff); } @@ -9608,8 +9608,8 @@ static final public char[] parseChar(int what[]) { } /* - static final public char[] parseChar(float what[]) { // nonsensical - char outgoing[] = new char[what.length]; + static final public char[] parseChar(int[] what) { + char[] outgoing = new char[what.length]; for (int i = 0; i < what.length; i++) { outgoing[i] = (char) what[i]; } @@ -9679,32 +9679,32 @@ static final public int parseInt(String what, int otherwise) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - static final public int[] parseInt(boolean what[]) { - int list[] = new int[what.length]; + static final public int[] parseInt(boolean[] what) { + int[] list = new int[what.length]; for (int i = 0; i < what.length; i++) { list[i] = what[i] ? 1 : 0; } return list; } - static final public int[] parseInt(byte what[]) { // note this unsigns - int list[] = new int[what.length]; + static final public int[] parseInt(byte[] what) { // note this unsigns + int[] list = new int[what.length]; for (int i = 0; i < what.length; i++) { list[i] = (what[i] & 0xff); } return list; } - static final public int[] parseInt(char what[]) { - int list[] = new int[what.length]; + static final public int[] parseInt(char[] what) { + int[] list = new int[what.length]; for (int i = 0; i < what.length; i++) { list[i] = what[i]; } return list; } - static public int[] parseInt(float what[]) { - int inties[] = new int[what.length]; + static public int[] parseInt(float[] what) { + int[] inties = new int[what.length]; for (int i = 0; i < what.length; i++) { inties[i] = (int)what[i]; } @@ -9720,7 +9720,7 @@ static public int[] parseInt(float what[]) { * * numbers will contain { 1, 300, 44 } */ - static public int[] parseInt(String what[]) { + static public int[] parseInt(String[] what) { return parseInt(what, 0); } @@ -9734,8 +9734,8 @@ static public int[] parseInt(String what[]) { * * numbers will contain { 1, 300, 9999, 44 } */ - static public int[] parseInt(String what[], int missing) { - int output[] = new int[what.length]; + static public int[] parseInt(String[] what, int missing) { + int[] output = new int[what.length]; for (int i = 0; i < what.length; i++) { try { output[i] = Integer.parseInt(what[i]); @@ -9776,46 +9776,28 @@ static final public float parseFloat(String what, float otherwise) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - /* - static final public float[] parseFloat(boolean what[]) { - float floaties[] = new float[what.length]; - for (int i = 0; i < what.length; i++) { - floaties[i] = what[i] ? 1 : 0; - } - return floaties; - } - - static final public float[] parseFloat(char what[]) { - float floaties[] = new float[what.length]; - for (int i = 0; i < what.length; i++) { - floaties[i] = (char) what[i]; - } - return floaties; - } - */ - - static final public float[] parseFloat(byte what[]) { - float floaties[] = new float[what.length]; + static final public float[] parseFloat(byte[] what) { + float[] floaties = new float[what.length]; for (int i = 0; i < what.length; i++) { floaties[i] = what[i]; } return floaties; } - static final public float[] parseFloat(int what[]) { - float floaties[] = new float[what.length]; + static final public float[] parseFloat(int[] what) { + float[] floaties = new float[what.length]; for (int i = 0; i < what.length; i++) { floaties[i] = what[i]; } return floaties; } - static final public float[] parseFloat(String what[]) { + static final public float[] parseFloat(String[] what) { return parseFloat(what, Float.NaN); } - static final public float[] parseFloat(String what[], float missing) { - float output[] = new float[what.length]; + static final public float[] parseFloat(String[] what, float missing) { + float[] output = new float[what.length]; for (int i = 0; i < what.length; i++) { try { output[i] = Float.parseFloat(what[i]); @@ -9850,32 +9832,32 @@ static final public String str(float x) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - static final public String[] str(boolean x[]) { - String s[] = new String[x.length]; + static final public String[] str(boolean[] x) { + String[] s = new String[x.length]; for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]); return s; } - static final public String[] str(byte x[]) { - String s[] = new String[x.length]; + static final public String[] str(byte[] x) { + String[] s = new String[x.length]; for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]); return s; } - static final public String[] str(char x[]) { - String s[] = new String[x.length]; + static final public String[] str(char[] x) { + String[] s = new String[x.length]; for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]); return s; } - static final public String[] str(int x[]) { - String s[] = new String[x.length]; + static final public String[] str(int[] x) { + String[] s = new String[x.length]; for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]); return s; } - static final public String[] str(float x[]) { - String s[] = new String[x.length]; + static final public String[] str(float[] x) { + String[] s = new String[x.length]; for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]); return s; } @@ -9932,8 +9914,8 @@ static public String[] nf(float[] nums) { * @see
int(float) */ - static public String[] nf(int nums[], int digits) { - String formatted[] = new String[nums.length]; + static public String[] nf(int[] nums, int digits) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nf(nums[i], digits); } @@ -9976,8 +9958,8 @@ static public String nf(int num, int digits) { * @see PApplet#nfp(float, int, int) * @see PApplet#nfs(float, int, int) */ - static public String[] nfc(int nums[]) { - String formatted[] = new String[nums.length]; + static public String[] nfc(int[] nums) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nfc(nums[i]); } @@ -10036,8 +10018,8 @@ static public String nfs(int num, int digits) { /** * @param nums the numbers to format */ - static public String[] nfs(int nums[], int digits) { - String formatted[] = new String[nums.length]; + static public String[] nfs(int[] nums, int digits) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nfs(nums[i], digits); } @@ -10074,8 +10056,8 @@ static public String nfp(int num, int digits) { /** * @param nums the numbers to format */ - static public String[] nfp(int nums[], int digits) { - String formatted[] = new String[nums.length]; + static public String[] nfp(int[] nums, int digits) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nfp(nums[i], digits); } @@ -10096,8 +10078,8 @@ static public String[] nfp(int nums[], int digits) { * @param left number of digits to the left of the decimal point * @param right number of digits to the right of the decimal point */ - static public String[] nf(float nums[], int left, int right) { - String formatted[] = new String[nums.length]; + static public String[] nf(float[] nums, int left, int right) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nf(nums[i], left, right); } @@ -10129,8 +10111,8 @@ static public String nf(float num, int left, int right) { /** * @param right number of digits to the right of the decimal point */ - static public String[] nfc(float nums[], int right) { - String formatted[] = new String[nums.length]; + static public String[] nfc(float[] nums, int right) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nfc(nums[i], right); } @@ -10163,8 +10145,8 @@ static public String nfc(float num, int right) { * @param left the number of digits to the left of the decimal point * @param right the number of digits to the right of the decimal point */ - static public String[] nfs(float nums[], int left, int right) { - String formatted[] = new String[nums.length]; + static public String[] nfs(float[] nums, int left, int right) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nfs(nums[i], left, right); } @@ -10179,8 +10161,8 @@ static public String nfs(float num, int left, int right) { * @param left the number of digits to the left of the decimal point * @param right the number of digits to the right of the decimal point */ - static public String[] nfp(float nums[], int left, int right) { - String formatted[] = new String[nums.length]; + static public String[] nfp(float[] nums, int left, int right) { + String[] formatted = new String[nums.length]; for (int i = 0; i < formatted.length; i++) { formatted[i] = nfp(nums[i], left, right); } diff --git a/core/src/processing/core/PFont.java b/core/src/processing/core/PFont.java index 33ca7eb404..12ee61a36b 100644 --- a/core/src/processing/core/PFont.java +++ b/core/src/processing/core/PFont.java @@ -204,7 +204,7 @@ public PFont(Font font, boolean smooth) { * @nowebref * @param charset array of all unicode chars that should be included */ - public PFont(Font font, boolean smooth, char charset[]) { + public PFont(Font font, boolean smooth, char[] charset) { // save this so that we can use the native version this.font = font; this.smooth = smooth; @@ -329,7 +329,7 @@ public PFont(Font font, boolean smooth, char charset[]) { * * @nowebref */ - public PFont(Font font, boolean smooth, char charset[], + public PFont(Font font, boolean smooth, char[] charset, boolean stream, int density) { this(font, smooth, charset); this.stream = stream; @@ -865,7 +865,7 @@ public PShape getShape(char ch, float detail) { for (int i = 0; i < EXTRA_CHARS.length; i++) { CHARSET[index++] = EXTRA_CHARS[i]; } - }; + } /** @@ -885,7 +885,7 @@ public PShape getShape(char ch, float detail) { */ static public String[] list() { loadFonts(); - String list[] = new String[fonts.length]; + String[] list = new String[fonts.length]; for (int i = 0; i < list.length; i++) { list[i] = fonts[i].getName(); } diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 032b69928d..0a77d88537 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -570,7 +570,7 @@ public class PGraphics extends PImage implements PConstants { // vertices public static final int DEFAULT_VERTICES = 512; - protected float vertices[][] = + protected float[][] vertices = new float[DEFAULT_VERTICES][VERTEX_FIELD_COUNT]; protected int vertexCount; // total number of vertices @@ -605,7 +605,7 @@ public class PGraphics extends PImage implements PConstants { // spline vertices - protected float curveVertices[][]; + protected float[][] curveVertices; protected int curveVertexCount; // ........................................................ @@ -618,8 +618,8 @@ public class PGraphics extends PImage implements PConstants { // [toxi 031031] // changed table's precision to 0.5 degree steps // introduced new vars for more flexible code - static final protected float sinLUT[]; - static final protected float cosLUT[]; + static final protected float[] sinLUT; + static final protected float[] cosLUT; static final protected float SINCOS_PRECISION = 0.5f; static final protected int SINCOS_LENGTH = (int) (360f / SINCOS_PRECISION); static { @@ -702,7 +702,9 @@ public class PGraphics extends PImage implements PConstants { // [toxi031031] new & faster sphere code w/ support flexible resolutions // will be set by sphereDetail() or 1st call to sphere() - protected float sphereX[], sphereY[], sphereZ[]; + protected float[] sphereX; + protected float[] sphereY; + protected float[] sphereZ; /// Number of U steps (aka "theta") around longitudinally spanning 2*pi public int sphereDetailU = 0; @@ -1388,7 +1390,7 @@ public void noTexture() { protected void vertexCheck() { if (vertexCount == vertices.length) { - float temp[][] = new float[vertexCount << 1][VERTEX_FIELD_COUNT]; + float[][] temp = new float[vertexCount << 1][VERTEX_FIELD_COUNT]; System.arraycopy(vertices, 0, temp, 0, vertexCount); vertices = temp; } @@ -1480,10 +1482,10 @@ public void vertex(float x, float y, float z) { // http://dev.processing.org/bugs/show_bug.cgi?id=444 if (shape == POLYGON) { if (vertexCount > 0) { - float pvertex[] = vertices[vertexCount-1]; if ((Math.abs(pvertex[X] - x) < EPSILON) && (Math.abs(pvertex[Y] - y) < EPSILON) && (Math.abs(pvertex[Z] - z) < EPSILON)) { + float[] pvertex = vertices[vertexCount-1]; // this vertex is identical, don't add it, // because it will anger the triangulator return; @@ -4551,7 +4553,7 @@ public float textWidth(char[] chars, int start, int length) { * Unlike the previous version that was inside PFont, this will * return the size not of a 1 pixel font, but the actual current size. */ - protected float textWidthImpl(char buffer[], int start, int stop) { + protected float textWidthImpl(char[] buffer, int start, int stop) { float wide = 0; for (int i = start; i < stop; i++) { // could add kerning here, but it just ain't implemented @@ -5019,7 +5021,7 @@ public void text(float num, float x, float y, float z) { * Handles placement of a text line, then calls textLineImpl * to actually render at the specific point. */ - protected void textLineAlignImpl(char buffer[], int start, int stop, + protected void textLineAlignImpl(char[] buffer, int start, int stop, float x, float y) { if (textAlign == CENTER) { x -= textWidthImpl(buffer, start, stop) / 2f; @@ -5035,7 +5037,7 @@ protected void textLineAlignImpl(char buffer[], int start, int stop, /** * Implementation of actual drawing for a line of text. */ - protected void textLineImpl(char buffer[], int start, int stop, + protected void textLineImpl(char[] buffer, int start, int stop, float x, float y) { for (int index = start; index < stop; index++) { textCharImpl(buffer[index], x, y); diff --git a/core/src/processing/core/PImage.java b/core/src/processing/core/PImage.java index e21520d58f..d83b1da5d0 100644 --- a/core/src/processing/core/PImage.java +++ b/core/src/processing/core/PImage.java @@ -940,7 +940,7 @@ protected void setImpl(PImage sourceImage, * @param maskArray array of integers used as the alpha channel, needs to be * the same length as the image's pixel array. */ - public void mask(int maskArray[]) { // ignore + public void mask(int[] maskArray) { // ignore loadPixels(); // don't execute if mask image is different size if (maskArray.length != pixels.length) { @@ -1239,7 +1239,7 @@ protected void buildBlurKernel(float r) { protected void blurAlpha(float r) { int sum, cb; int read, ri, ym, ymi, bk0; - int b2[] = new int[pixels.length]; + int[] b2 = new int[pixels.length]; int yi = 0; buildBlurKernel(r); @@ -1310,9 +1310,9 @@ protected void blurAlpha(float r) { protected void blurRGB(float r) { int sum, cr, cg, cb; //, k; int /*pixel,*/ read, ri, /*roff,*/ ym, ymi, /*riw,*/ bk0; - int r2[] = new int[pixels.length]; - int g2[] = new int[pixels.length]; - int b2[] = new int[pixels.length]; + int[] r2 = new int[pixels.length]; + int[] g2 = new int[pixels.length]; + int[] b2 = new int[pixels.length]; int yi = 0; buildBlurKernel(r); @@ -1393,10 +1393,10 @@ protected void blurARGB(float r) { int sum, cr, cg, cb, ca; int /*pixel,*/ read, ri, /*roff,*/ ym, ymi, /*riw,*/ bk0; int wh = pixels.length; - int r2[] = new int[wh]; - int g2[] = new int[wh]; - int b2[] = new int[wh]; - int a2[] = new int[wh]; + int[] r2 = new int[wh]; + int[] g2 = new int[wh]; + int[] b2 = new int[wh]; + int[] a2 = new int[wh]; int yi = 0; buildBlurKernel(r); @@ -2948,7 +2948,7 @@ private static int blend_burn(int dst, int src) { // FILE I/O - static byte TIFF_HEADER[] = { + static byte[] TIFF_HEADER = { 77, 77, 0, 42, 0, 0, 0, 8, 0, 9, 0, -2, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 122, 1, 6, 0, 3, 0, @@ -2961,7 +2961,7 @@ private static int blend_burn(int dst, int src) { static final String TIFF_ERROR = "Error: Processing can only read its own TIFF files."; - static protected PImage loadTIFF(byte tiff[]) { + static protected PImage loadTIFF(byte[] tiff) { if ((tiff[42] != tiff[102]) || // width/height in both places (tiff[43] != tiff[103])) { System.err.println(TIFF_ERROR); @@ -3018,7 +3018,7 @@ protected boolean saveTIFF(OutputStream output) { } */ try { - byte tiff[] = new byte[768]; + byte[] tiff = new byte[768]; System.arraycopy(TIFF_HEADER, 0, tiff, 0, TIFF_HEADER.length); tiff[30] = (byte) ((pixelWidth >> 8) & 0xff); @@ -3069,7 +3069,7 @@ protected boolean saveTIFF(OutputStream output) { * specification */ protected boolean saveTGA(OutputStream output) { - byte header[] = new byte[18]; + byte[] header = new byte[18]; if (format == ALPHA) { // save ALPHA images as 8bit grayscale header[2] = 0x0B; diff --git a/core/src/processing/core/PMatrix2D.java b/core/src/processing/core/PMatrix2D.java index 38f82bdfd3..c30a3504e3 100644 --- a/core/src/processing/core/PMatrix2D.java +++ b/core/src/processing/core/PMatrix2D.java @@ -381,7 +381,7 @@ public PVector mult(PVector source, PVector target) { * If out is null or not length four, a new float array will be returned. * The values for vec and out can be the same (though that's less efficient). */ - public float[] mult(float vec[], float out[]) { + public float[] mult(float[] vec, float[] out) { if (out == null || out.length != 2) { out = new float[2]; } diff --git a/core/src/processing/core/PShapeOBJ.java b/core/src/processing/core/PShapeOBJ.java index a46e6ab8a8..5ae8c9d1e9 100644 --- a/core/src/processing/core/PShapeOBJ.java +++ b/core/src/processing/core/PShapeOBJ.java @@ -327,7 +327,7 @@ static protected void parseMTL(PApplet parent, String mtlfn, String path, while ((line = reader.readLine()) != null) { // Parse the line line = line.trim(); - String parts[] = line.split("\\s+"); + String[] parts = line.split("\\s+"); if (parts.length > 0) { // Extract the material data. if (parts[0].equals("newmtl")) { diff --git a/core/src/processing/core/PShapeSVG.java b/core/src/processing/core/PShapeSVG.java index d74253af6e..f572406ebc 100644 --- a/core/src/processing/core/PShapeSVG.java +++ b/core/src/processing/core/PShapeSVG.java @@ -1499,7 +1499,7 @@ static public class Gradient extends PShapeSVG { public Gradient(PShapeSVG parent, XML properties) { super(parent, properties, true); - XML elements[] = properties.getChildren(); + XML[] elements = properties.getChildren(); offset = new float[elements.length]; color = new int[elements.length]; @@ -1555,7 +1555,7 @@ public LinearGradient(PShapeSVG parent, XML properties) { properties.getString("gradientTransform"); if (transformStr != null) { - float t[] = parseTransform(transformStr).get(null); + float[] t = parseTransform(transformStr).get(null); this.transform = new AffineTransform(t[0], t[3], t[1], t[4], t[2], t[5]); Point2D t1 = transform.transform(new Point2D.Float(x1, y1), null); @@ -1587,7 +1587,7 @@ public RadialGradient(PShapeSVG parent, XML properties) { properties.getString("gradientTransform"); if (transformStr != null) { - float t[] = parseTransform(transformStr).get(null); + float[] t = parseTransform(transformStr).get(null); this.transform = new AffineTransform(t[0], t[3], t[1], t[4], t[2], t[5]); Point2D t1 = transform.transform(new Point2D.Float(cx, cy), null); diff --git a/core/src/processing/data/Table.java b/core/src/processing/data/Table.java index 4d18651cc7..e0684b4c1e 100644 --- a/core/src/processing/data/Table.java +++ b/core/src/processing/data/Table.java @@ -1712,19 +1712,19 @@ protected void loadBinary(InputStream is) throws IOException { columns[column] = new int[rowCount]; break; case LONG: - columns[column] = new long[rowCount];; + columns[column] = new long[rowCount]; break; case FLOAT: - columns[column] = new float[rowCount];; + columns[column] = new float[rowCount]; break; case DOUBLE: - columns[column] = new double[rowCount];; + columns[column] = new double[rowCount]; break; case STRING: - columns[column] = new String[rowCount];; + columns[column] = new String[rowCount]; break; case CATEGORY: - columns[column] = new int[rowCount];; + columns[column] = new int[rowCount]; break; default: throw new IllegalArgumentException(newType + " is not a valid column type."); diff --git a/core/src/processing/javafx/PGraphicsFX2D.java b/core/src/processing/javafx/PGraphicsFX2D.java index 74758ceb7b..7868c7fe0f 100644 --- a/core/src/processing/javafx/PGraphicsFX2D.java +++ b/core/src/processing/javafx/PGraphicsFX2D.java @@ -67,7 +67,7 @@ public class PGraphicsFX2D extends PGraphics { /// break the shape at the next vertex (next vertex() call is a moveto()) boolean breakShape; - private float pathCoordsBuffer[] = new float[6]; + private float[] pathCoordsBuffer = new float[6]; /// coordinates for internal curve calculation float[] curveCoordX; @@ -76,7 +76,7 @@ public class PGraphicsFX2D extends PGraphics { float[] curveDrawY; int transformCount; - Affine transformStack[] = new Affine[MATRIX_STACK_DEPTH]; + Affine[] transformStack = new Affine[MATRIX_STACK_DEPTH]; // Line2D.Float line = new Line2D.Float(); // Ellipse2D.Float ellipse = new Ellipse2D.Float(); @@ -239,7 +239,7 @@ public void texture(PImage image) { @Override public void vertex(float x, float y) { if (vertexCount == vertices.length) { - float temp[][] = new float[vertexCount<<1][VERTEX_FIELD_COUNT]; + float[][] temp = new float[vertexCount<<1][VERTEX_FIELD_COUNT]; System.arraycopy(vertices, 0, temp, 0, vertexCount); vertices = temp; //message(CHATTER, "allocating more vertices " + vertices.length); diff --git a/core/src/processing/opengl/LinePath.java b/core/src/processing/opengl/LinePath.java index a3705df0fc..03c1d69d57 100644 --- a/core/src/processing/opengl/LinePath.java +++ b/core/src/processing/opengl/LinePath.java @@ -324,7 +324,7 @@ public final void reset() { static public class PathIterator { - float floatCoords[]; + float[] floatCoords; int typeIdx; @@ -334,7 +334,7 @@ static public class PathIterator { LinePath path; - static final int curvecoords[] = { 2, 2, 0 }; + static final int[] curvecoords = { 2, 2, 0 }; PathIterator(LinePath p2df) { this.path = p2df; @@ -470,7 +470,7 @@ private static void strokeTo(LinePath src, float width, int caps, int join, private static void pathTo(PathIterator pi, LineStroker lsink) { - float coords[] = new float[6]; + float[] coords = new float[6]; while (!pi.isDone()) { int color; switch (pi.currentSegment(coords)) { diff --git a/core/src/processing/opengl/PGL.java b/core/src/processing/opengl/PGL.java index ecfbb1715c..d57eb91269 100644 --- a/core/src/processing/opengl/PGL.java +++ b/core/src/processing/opengl/PGL.java @@ -475,7 +475,7 @@ protected int getDefaultReadBuffer() { } - protected boolean isFBOBacked() {; + protected boolean isFBOBacked() { return fboLayerEnabled; } @@ -2127,7 +2127,7 @@ protected int[] getGLVersion() { String[] parts = version.split(" "); for (int i = 0; i < parts.length; i++) { if (0 < parts[i].indexOf(".")) { - String nums[] = parts[i].split("\\."); + String[] nums = parts[i].split("\\."); try { res[0] = Integer.parseInt(nums[0]); } catch (NumberFormatException e) { } diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 7801326ecd..b4f145eda6 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -2365,8 +2365,8 @@ protected void flushPixels() { protected void flushPolys() { boolean customShader = polyShader != null; - boolean needNormals = customShader ? polyShader.accessNormals() : false; - boolean needTexCoords = customShader ? polyShader.accessTexCoords() : false; + boolean needNormals = customShader && polyShader.accessNormals(); + boolean needTexCoords = customShader && polyShader.accessTexCoords(); updatePolyBuffers(lights, texCache.hasTextures, needNormals, needTexCoords); @@ -2438,8 +2438,8 @@ protected void flushPolys() { protected void flushSortedPolys() { boolean customShader = polyShader != null; - boolean needNormals = customShader ? polyShader.accessNormals() : false; - boolean needTexCoords = customShader ? polyShader.accessTexCoords() : false; + boolean needNormals = customShader && polyShader.accessNormals(); + boolean needTexCoords = customShader && polyShader.accessTexCoords(); sorter.sort(tessGeo); @@ -3485,7 +3485,7 @@ public float textDescent() { @Override - protected float textWidthImpl(char buffer[], int start, int stop) { + protected float textWidthImpl(char[] buffer, int start, int stop) { if (textFont == null) defaultFontOrDeath("textWidth"); Object font = textFont.getNative(); float twidth = 0; @@ -3510,7 +3510,7 @@ protected void handleTextSize(float size) { * Implementation of actual drawing for a line of text. */ @Override - protected void textLineImpl(char buffer[], int start, int stop, + protected void textLineImpl(char[] buffer, int start, int stop, float x, float y) { if (textMode == SHAPE && textFont.getNative() == null) { @@ -3654,7 +3654,7 @@ protected void textCharShapeImpl(char ch, float x, float y) { PGL.FontOutline outline = pgl.createFontOutline(ch, textFont.getNative()); // six element array received from the Java2D path iterator - float textPoints[] = new float[6]; + float[] textPoints = new float[6]; float lastX = 0; float lastY = 0; @@ -7899,61 +7899,61 @@ int getVertexSum(PVector v) { // Expand arrays void expandVertices(int n) { - float temp[] = new float[3 * n]; + float[] temp = new float[3 * n]; PApplet.arrayCopy(vertices, 0, temp, 0, 3 * vertexCount); vertices = temp; } void expandColors(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(colors, 0, temp, 0, vertexCount); colors = temp; } void expandNormals(int n) { - float temp[] = new float[3 * n]; + float[] temp = new float[3 * n]; PApplet.arrayCopy(normals, 0, temp, 0, 3 * vertexCount); normals = temp; } void expandTexCoords(int n) { - float temp[] = new float[2 * n]; + float[] temp = new float[2 * n]; PApplet.arrayCopy(texcoords, 0, temp, 0, 2 * vertexCount); texcoords = temp; } void expandStrokeColors(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(strokeColors, 0, temp, 0, vertexCount); strokeColors = temp; } void expandStrokeWeights(int n) { - float temp[] = new float[n]; + float[] temp = new float[n]; PApplet.arrayCopy(strokeWeights, 0, temp, 0, vertexCount); strokeWeights = temp; } void expandAmbient(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(ambient, 0, temp, 0, vertexCount); ambient = temp; } void expandSpecular(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(specular, 0, temp, 0, vertexCount); specular = temp; } void expandEmissive(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(emissive, 0, temp, 0, vertexCount); emissive = temp; } void expandShininess(int n) { - float temp[] = new float[n]; + float[] temp = new float[n]; PApplet.arrayCopy(shininess, 0, temp, 0, vertexCount); shininess = temp; } @@ -7973,33 +7973,33 @@ void expandAttribs(int n) { void expandFloatAttrib(VertexAttribute attrib, int n) { float[] values = fattribs.get(attrib.name); - float temp[] = new float[attrib.size * n]; + float[] temp = new float[attrib.size * n]; PApplet.arrayCopy(values, 0, temp, 0, attrib.size * vertexCount); fattribs.put(attrib.name, temp); } void expandIntAttrib(VertexAttribute attrib, int n) { int[] values = iattribs.get(attrib.name); - int temp[] = new int[attrib.size * n]; + int[] temp = new int[attrib.size * n]; PApplet.arrayCopy(values, 0, temp, 0, attrib.size * vertexCount); iattribs.put(attrib.name, temp); } void expandBoolAttrib(VertexAttribute attrib, int n) { byte[] values = battribs.get(attrib.name); - byte temp[] = new byte[attrib.size * n]; + byte[] temp = new byte[attrib.size * n]; PApplet.arrayCopy(values, 0, temp, 0, attrib.size * vertexCount); battribs.put(attrib.name, temp); } void expandCodes(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(codes, 0, temp, 0, codeCount); codes = temp; } void expandEdges(int n) { - int temp[][] = new int[n][3]; + int[][] temp = new int[n][3]; PApplet.arrayCopy(edges, 0, temp, 0, edgeCount); edges = temp; } @@ -8033,73 +8033,73 @@ void trim() { } void trimVertices() { - float temp[] = new float[3 * vertexCount]; + float[] temp = new float[3 * vertexCount]; PApplet.arrayCopy(vertices, 0, temp, 0, 3 * vertexCount); vertices = temp; } void trimColors() { - int temp[] = new int[vertexCount]; + int[] temp = new int[vertexCount]; PApplet.arrayCopy(colors, 0, temp, 0, vertexCount); colors = temp; } void trimNormals() { - float temp[] = new float[3 * vertexCount]; + float[] temp = new float[3 * vertexCount]; PApplet.arrayCopy(normals, 0, temp, 0, 3 * vertexCount); normals = temp; } void trimTexCoords() { - float temp[] = new float[2 * vertexCount]; + float[] temp = new float[2 * vertexCount]; PApplet.arrayCopy(texcoords, 0, temp, 0, 2 * vertexCount); texcoords = temp; } void trimStrokeColors() { - int temp[] = new int[vertexCount]; + int[] temp = new int[vertexCount]; PApplet.arrayCopy(strokeColors, 0, temp, 0, vertexCount); strokeColors = temp; } void trimStrokeWeights() { - float temp[] = new float[vertexCount]; + float[] temp = new float[vertexCount]; PApplet.arrayCopy(strokeWeights, 0, temp, 0, vertexCount); strokeWeights = temp; } void trimAmbient() { - int temp[] = new int[vertexCount]; + int[] temp = new int[vertexCount]; PApplet.arrayCopy(ambient, 0, temp, 0, vertexCount); ambient = temp; } void trimSpecular() { - int temp[] = new int[vertexCount]; + int[] temp = new int[vertexCount]; PApplet.arrayCopy(specular, 0, temp, 0, vertexCount); specular = temp; } void trimEmissive() { - int temp[] = new int[vertexCount]; + int[] temp = new int[vertexCount]; PApplet.arrayCopy(emissive, 0, temp, 0, vertexCount); emissive = temp; } void trimShininess() { - float temp[] = new float[vertexCount]; + float[] temp = new float[vertexCount]; PApplet.arrayCopy(shininess, 0, temp, 0, vertexCount); shininess = temp; } void trimCodes() { - int temp[] = new int[codeCount]; + int[] temp = new int[codeCount]; PApplet.arrayCopy(codes, 0, temp, 0, codeCount); codes = temp; } void trimEdges() { - int temp[][] = new int[edgeCount][3]; + int[][] temp = new int[edgeCount][3]; PApplet.arrayCopy(edges, 0, temp, 0, edgeCount); edges = temp; } @@ -8119,21 +8119,21 @@ void trimAttribs() { void trimFloatAttrib(VertexAttribute attrib) { float[] values = fattribs.get(attrib.name); - float temp[] = new float[attrib.size * vertexCount]; + float[] temp = new float[attrib.size * vertexCount]; PApplet.arrayCopy(values, 0, temp, 0, attrib.size * vertexCount); fattribs.put(attrib.name, temp); } void trimIntAttrib(VertexAttribute attrib) { int[] values = iattribs.get(attrib.name); - int temp[] = new int[attrib.size * vertexCount]; + int[] temp = new int[attrib.size * vertexCount]; PApplet.arrayCopy(values, 0, temp, 0, attrib.size * vertexCount); iattribs.put(attrib.name, temp); } void trimBoolAttrib(VertexAttribute attrib) { byte[] values = battribs.get(attrib.name); - byte temp[] = new byte[attrib.size * vertexCount]; + byte[] temp = new byte[attrib.size * vertexCount]; PApplet.arrayCopy(values, 0, temp, 0, attrib.size * vertexCount); battribs.put(attrib.name, temp); } @@ -9675,56 +9675,56 @@ protected void updatePointIndicesBuffer(int offset, int size) { // Expand arrays void expandPolyVertices(int n) { - float temp[] = new float[4 * n]; + float[] temp = new float[4 * n]; PApplet.arrayCopy(polyVertices, 0, temp, 0, 4 * polyVertexCount); polyVertices = temp; polyVerticesBuffer = PGL.allocateFloatBuffer(polyVertices); } void expandPolyColors(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(polyColors, 0, temp, 0, polyVertexCount); polyColors = temp; polyColorsBuffer = PGL.allocateIntBuffer(polyColors); } void expandPolyNormals(int n) { - float temp[] = new float[3 * n]; + float[] temp = new float[3 * n]; PApplet.arrayCopy(polyNormals, 0, temp, 0, 3 * polyVertexCount); polyNormals = temp; polyNormalsBuffer = PGL.allocateFloatBuffer(polyNormals); } void expandPolyTexCoords(int n) { - float temp[] = new float[2 * n]; + float[] temp = new float[2 * n]; PApplet.arrayCopy(polyTexCoords, 0, temp, 0, 2 * polyVertexCount); polyTexCoords = temp; polyTexCoordsBuffer = PGL.allocateFloatBuffer(polyTexCoords); } void expandPolyAmbient(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(polyAmbient, 0, temp, 0, polyVertexCount); polyAmbient = temp; polyAmbientBuffer = PGL.allocateIntBuffer(polyAmbient); } void expandPolySpecular(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(polySpecular, 0, temp, 0, polyVertexCount); polySpecular = temp; polySpecularBuffer = PGL.allocateIntBuffer(polySpecular); } void expandPolyEmissive(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(polyEmissive, 0, temp, 0, polyVertexCount); polyEmissive = temp; polyEmissiveBuffer = PGL.allocateIntBuffer(polyEmissive); } void expandPolyShininess(int n) { - float temp[] = new float[n]; + float[] temp = new float[n]; PApplet.arrayCopy(polyShininess, 0, temp, 0, polyVertexCount); polyShininess = temp; polyShininessBuffer = PGL.allocateFloatBuffer(polyShininess); @@ -9745,7 +9745,7 @@ void expandAttributes(int n) { void expandFloatAttribute(VertexAttribute attrib, int n) { float[] array = fpolyAttribs.get(attrib.name); - float temp[] = new float[attrib.tessSize * n]; + float[] temp = new float[attrib.tessSize * n]; PApplet.arrayCopy(array, 0, temp, 0, attrib.tessSize * polyVertexCount); fpolyAttribs.put(attrib.name, temp); polyAttribBuffers.put(attrib.name, PGL.allocateFloatBuffer(temp)); @@ -9753,7 +9753,7 @@ void expandFloatAttribute(VertexAttribute attrib, int n) { void expandIntAttribute(VertexAttribute attrib, int n) { int[] array = ipolyAttribs.get(attrib.name); - int temp[] = new int[attrib.tessSize * n]; + int[] temp = new int[attrib.tessSize * n]; PApplet.arrayCopy(array, 0, temp, 0, attrib.tessSize * polyVertexCount); ipolyAttribs.put(attrib.name, temp); polyAttribBuffers.put(attrib.name, PGL.allocateIntBuffer(temp)); @@ -9761,70 +9761,70 @@ void expandIntAttribute(VertexAttribute attrib, int n) { void expandBoolAttribute(VertexAttribute attrib, int n) { byte[] array = bpolyAttribs.get(attrib.name); - byte temp[] = new byte[attrib.tessSize * n]; + byte[] temp = new byte[attrib.tessSize * n]; PApplet.arrayCopy(array, 0, temp, 0, attrib.tessSize * polyVertexCount); bpolyAttribs.put(attrib.name, temp); polyAttribBuffers.put(attrib.name, PGL.allocateByteBuffer(temp)); } void expandPolyIndices(int n) { - short temp[] = new short[n]; + short[] temp = new short[n]; PApplet.arrayCopy(polyIndices, 0, temp, 0, polyIndexCount); polyIndices = temp; polyIndicesBuffer = PGL.allocateShortBuffer(polyIndices); } void expandLineVertices(int n) { - float temp[] = new float[4 * n]; + float[] temp = new float[4 * n]; PApplet.arrayCopy(lineVertices, 0, temp, 0, 4 * lineVertexCount); lineVertices = temp; lineVerticesBuffer = PGL.allocateFloatBuffer(lineVertices); } void expandLineColors(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(lineColors, 0, temp, 0, lineVertexCount); lineColors = temp; lineColorsBuffer = PGL.allocateIntBuffer(lineColors); } void expandLineDirections(int n) { - float temp[] = new float[4 * n]; + float[] temp = new float[4 * n]; PApplet.arrayCopy(lineDirections, 0, temp, 0, 4 * lineVertexCount); lineDirections = temp; lineDirectionsBuffer = PGL.allocateFloatBuffer(lineDirections); } void expandLineIndices(int n) { - short temp[] = new short[n]; + short[] temp = new short[n]; PApplet.arrayCopy(lineIndices, 0, temp, 0, lineIndexCount); lineIndices = temp; lineIndicesBuffer = PGL.allocateShortBuffer(lineIndices); } void expandPointVertices(int n) { - float temp[] = new float[4 * n]; + float[] temp = new float[4 * n]; PApplet.arrayCopy(pointVertices, 0, temp, 0, 4 * pointVertexCount); pointVertices = temp; pointVerticesBuffer = PGL.allocateFloatBuffer(pointVertices); } void expandPointColors(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(pointColors, 0, temp, 0, pointVertexCount); pointColors = temp; pointColorsBuffer = PGL.allocateIntBuffer(pointColors); } void expandPointOffsets(int n) { - float temp[] = new float[2 * n]; + float[] temp = new float[2 * n]; PApplet.arrayCopy(pointOffsets, 0, temp, 0, 2 * pointVertexCount); pointOffsets = temp; pointOffsetsBuffer = PGL.allocateFloatBuffer(pointOffsets); } void expandPointIndices(int n) { - short temp[] = new short[n]; + short[] temp = new short[n]; PApplet.arrayCopy(pointIndices, 0, temp, 0, pointIndexCount); pointIndices = temp; pointIndicesBuffer = PGL.allocateShortBuffer(pointIndices); @@ -9873,56 +9873,56 @@ void trim() { } void trimPolyVertices() { - float temp[] = new float[4 * polyVertexCount]; + float[] temp = new float[4 * polyVertexCount]; PApplet.arrayCopy(polyVertices, 0, temp, 0, 4 * polyVertexCount); polyVertices = temp; polyVerticesBuffer = PGL.allocateFloatBuffer(polyVertices); } void trimPolyColors() { - int temp[] = new int[polyVertexCount]; + int[] temp = new int[polyVertexCount]; PApplet.arrayCopy(polyColors, 0, temp, 0, polyVertexCount); polyColors = temp; polyColorsBuffer = PGL.allocateIntBuffer(polyColors); } void trimPolyNormals() { - float temp[] = new float[3 * polyVertexCount]; + float[] temp = new float[3 * polyVertexCount]; PApplet.arrayCopy(polyNormals, 0, temp, 0, 3 * polyVertexCount); polyNormals = temp; polyNormalsBuffer = PGL.allocateFloatBuffer(polyNormals); } void trimPolyTexCoords() { - float temp[] = new float[2 * polyVertexCount]; + float[] temp = new float[2 * polyVertexCount]; PApplet.arrayCopy(polyTexCoords, 0, temp, 0, 2 * polyVertexCount); polyTexCoords = temp; polyTexCoordsBuffer = PGL.allocateFloatBuffer(polyTexCoords); } void trimPolyAmbient() { - int temp[] = new int[polyVertexCount]; + int[] temp = new int[polyVertexCount]; PApplet.arrayCopy(polyAmbient, 0, temp, 0, polyVertexCount); polyAmbient = temp; polyAmbientBuffer = PGL.allocateIntBuffer(polyAmbient); } void trimPolySpecular() { - int temp[] = new int[polyVertexCount]; + int[] temp = new int[polyVertexCount]; PApplet.arrayCopy(polySpecular, 0, temp, 0, polyVertexCount); polySpecular = temp; polySpecularBuffer = PGL.allocateIntBuffer(polySpecular); } void trimPolyEmissive() { - int temp[] = new int[polyVertexCount]; + int[] temp = new int[polyVertexCount]; PApplet.arrayCopy(polyEmissive, 0, temp, 0, polyVertexCount); polyEmissive = temp; polyEmissiveBuffer = PGL.allocateIntBuffer(polyEmissive); } void trimPolyShininess() { - float temp[] = new float[polyVertexCount]; + float[] temp = new float[polyVertexCount]; PApplet.arrayCopy(polyShininess, 0, temp, 0, polyVertexCount); polyShininess = temp; polyShininessBuffer = PGL.allocateFloatBuffer(polyShininess); @@ -9943,7 +9943,7 @@ void trimPolyAttributes() { void trimFloatAttribute(VertexAttribute attrib) { float[] array = fpolyAttribs.get(attrib.name); - float temp[] = new float[attrib.tessSize * polyVertexCount]; + float[] temp = new float[attrib.tessSize * polyVertexCount]; PApplet.arrayCopy(array, 0, temp, 0, attrib.tessSize * polyVertexCount); fpolyAttribs.put(attrib.name, temp); polyAttribBuffers.put(attrib.name, PGL.allocateFloatBuffer(temp)); @@ -9951,7 +9951,7 @@ void trimFloatAttribute(VertexAttribute attrib) { void trimIntAttribute(VertexAttribute attrib) { int[] array = ipolyAttribs.get(attrib.name); - int temp[] = new int[attrib.tessSize * polyVertexCount]; + int[] temp = new int[attrib.tessSize * polyVertexCount]; PApplet.arrayCopy(array, 0, temp, 0, attrib.tessSize * polyVertexCount); ipolyAttribs.put(attrib.name, temp); polyAttribBuffers.put(attrib.name, PGL.allocateIntBuffer(temp)); @@ -9959,70 +9959,70 @@ void trimIntAttribute(VertexAttribute attrib) { void trimBoolAttribute(VertexAttribute attrib) { byte[] array = bpolyAttribs.get(attrib.name); - byte temp[] = new byte[attrib.tessSize * polyVertexCount]; + byte[] temp = new byte[attrib.tessSize * polyVertexCount]; PApplet.arrayCopy(array, 0, temp, 0, attrib.tessSize * polyVertexCount); bpolyAttribs.put(attrib.name, temp); polyAttribBuffers.put(attrib.name, PGL.allocateByteBuffer(temp)); } void trimPolyIndices() { - short temp[] = new short[polyIndexCount]; + short[] temp = new short[polyIndexCount]; PApplet.arrayCopy(polyIndices, 0, temp, 0, polyIndexCount); polyIndices = temp; polyIndicesBuffer = PGL.allocateShortBuffer(polyIndices); } void trimLineVertices() { - float temp[] = new float[4 * lineVertexCount]; + float[] temp = new float[4 * lineVertexCount]; PApplet.arrayCopy(lineVertices, 0, temp, 0, 4 * lineVertexCount); lineVertices = temp; lineVerticesBuffer = PGL.allocateFloatBuffer(lineVertices); } void trimLineColors() { - int temp[] = new int[lineVertexCount]; + int[] temp = new int[lineVertexCount]; PApplet.arrayCopy(lineColors, 0, temp, 0, lineVertexCount); lineColors = temp; lineColorsBuffer = PGL.allocateIntBuffer(lineColors); } void trimLineDirections() { - float temp[] = new float[4 * lineVertexCount]; + float[] temp = new float[4 * lineVertexCount]; PApplet.arrayCopy(lineDirections, 0, temp, 0, 4 * lineVertexCount); lineDirections = temp; lineDirectionsBuffer = PGL.allocateFloatBuffer(lineDirections); } void trimLineIndices() { - short temp[] = new short[lineIndexCount]; + short[] temp = new short[lineIndexCount]; PApplet.arrayCopy(lineIndices, 0, temp, 0, lineIndexCount); lineIndices = temp; lineIndicesBuffer = PGL.allocateShortBuffer(lineIndices); } void trimPointVertices() { - float temp[] = new float[4 * pointVertexCount]; + float[] temp = new float[4 * pointVertexCount]; PApplet.arrayCopy(pointVertices, 0, temp, 0, 4 * pointVertexCount); pointVertices = temp; pointVerticesBuffer = PGL.allocateFloatBuffer(pointVertices); } void trimPointColors() { - int temp[] = new int[pointVertexCount]; + int[] temp = new int[pointVertexCount]; PApplet.arrayCopy(pointColors, 0, temp, 0, pointVertexCount); pointColors = temp; pointColorsBuffer = PGL.allocateIntBuffer(pointColors); } void trimPointOffsets() { - float temp[] = new float[2 * pointVertexCount]; + float[] temp = new float[2 * pointVertexCount]; PApplet.arrayCopy(pointOffsets, 0, temp, 0, 2 * pointVertexCount); pointOffsets = temp; pointOffsetsBuffer = PGL.allocateFloatBuffer(pointOffsets); } void trimPointIndices() { - short temp[] = new short[pointIndexCount]; + short[] temp = new short[pointIndexCount]; PApplet.arrayCopy(pointIndices, 0, temp, 0, pointIndexCount); pointIndices = temp; pointIndicesBuffer = PGL.allocateShortBuffer(pointIndices); @@ -12448,7 +12448,7 @@ void addDupIndex(int idx) { if (dupIndices.length == dupCount) { int n = dupCount << 1; - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(dupIndices, 0, temp, 0, dupCount); dupIndices = temp; } @@ -12495,7 +12495,7 @@ void setRawSize(int size) { } void expandRawIndices(int n) { - int temp[] = new int[n]; + int[] temp = new int[n]; PApplet.arrayCopy(rawIndices, 0, temp, 0, rawSize); rawIndices = temp; } @@ -12940,15 +12940,15 @@ void addStrokeVertex(float x, float y, float z, int c, float w) { if (pathVertexCount == pathVertices.length / 3) { int newSize = pathVertexCount << 1; - float vtemp[] = new float[3 * newSize]; + float[] vtemp = new float[3 * newSize]; PApplet.arrayCopy(pathVertices, 0, vtemp, 0, 3 * pathVertexCount); pathVertices = vtemp; - int ctemp[] = new int[newSize]; + int[] ctemp = new int[newSize]; PApplet.arrayCopy(pathColors, 0, ctemp, 0, pathVertexCount); pathColors = ctemp; - float wtemp[] = new float[newSize]; + float[] wtemp = new float[newSize]; PApplet.arrayCopy(pathWeights, 0, wtemp, 0, pathVertexCount); pathWeights = wtemp; } diff --git a/core/src/processing/opengl/PJOGL.java b/core/src/processing/opengl/PJOGL.java index c164c23b1f..9c057313a0 100644 --- a/core/src/processing/opengl/PJOGL.java +++ b/core/src/processing/opengl/PJOGL.java @@ -722,7 +722,7 @@ protected class FontOutline implements PGL.FontOutline { PathIterator iter; public FontOutline(char ch, Font font) { - char textArray[] = new char[] { ch }; + char[] textArray = new char[] { ch }; FontRenderContext frc = getFontRenderContext(font); GlyphVector gv = font.createGlyphVector(frc, textArray); Shape shp = gv.getOutline(); @@ -733,7 +733,7 @@ public boolean isDone() { return iter.isDone(); } - public int currentSegment(float coords[]) { + public int currentSegment(float[] coords) { return iter.currentSegment(coords); } From 78eb6c0ae7a420cef07aff4a49929a81db2adf97 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 18 Jan 2020 07:45:16 -0500 Subject: [PATCH 139/172] note about merged PR --- todo.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/todo.txt b/todo.txt index cd2ec96414..caf4e3b087 100644 --- a/todo.txt +++ b/todo.txt @@ -4,6 +4,8 @@ contribs X rename-variable menu allows Java identifiers X https://github.com/processing/processing/issues/5828 X https://github.com/processing/processing/pull/5906 +X Replace C/C++ style array declarations with Java style array declarations +X https://github.com/processing/processing/pull/5981 from Casey From 4bb41d9851f24584c064d75e759e6ac3b0f65928 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 18 Jan 2020 13:46:58 -0500 Subject: [PATCH 140/172] fix regression in apparently untested #5981 --- core/src/processing/core/PGraphics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 697ccb5581..266cf43bdc 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -1482,10 +1482,10 @@ public void vertex(float x, float y, float z) { // http://dev.processing.org/bugs/show_bug.cgi?id=444 if (shape == POLYGON) { if (vertexCount > 0) { + float[] pvertex = vertices[vertexCount-1]; if ((Math.abs(pvertex[X] - x) < EPSILON) && (Math.abs(pvertex[Y] - y) < EPSILON) && (Math.abs(pvertex[Z] - z) < EPSILON)) { - float[] pvertex = vertices[vertexCount-1]; // this vertex is identical, don't add it, // because it will anger the triangulator return; From 3952f6f7247dba50920662da3276e91166426fb7 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 31 Mar 2020 13:49:08 -0400 Subject: [PATCH 141/172] new Eclipse rewriting settings files --- app/.settings/org.eclipse.jdt.core.prefs | 101 +++++++++++++++++- app/.settings/org.eclipse.jdt.ui.prefs | 2 +- core/.settings/org.eclipse.jdt.core.prefs | 101 +++++++++++++++++- core/.settings/org.eclipse.jdt.ui.prefs | 2 +- .../net/.settings/org.eclipse.jdt.core.prefs | 101 +++++++++++++++++- .../net/.settings/org.eclipse.jdt.ui.prefs | 2 +- .../pdf/.settings/org.eclipse.jdt.core.prefs | 101 +++++++++++++++++- .../pdf/.settings/org.eclipse.jdt.ui.prefs | 2 +- 8 files changed, 388 insertions(+), 24 deletions(-) diff --git a/app/.settings/org.eclipse.jdt.core.prefs b/app/.settings/org.eclipse.jdt.core.prefs index 9910337705..af36b24305 100644 --- a/app/.settings/org.eclipse.jdt.core.prefs +++ b/app/.settings/org.eclipse.jdt.core.prefs @@ -94,7 +94,12 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 @@ -103,24 +108,39 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_assignment=0 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=36 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=18 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=18 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_field=1 org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 @@ -129,6 +149,7 @@ org.eclipse.jdt.core.formatter.blank_lines_before_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 org.eclipse.jdt.core.formatter.blank_lines_before_package=0 org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0 org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line @@ -138,32 +159,38 @@ org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false org.eclipse.jdt.core.formatter.comment.format_block_comments=true org.eclipse.jdt.core.formatter.comment.format_header=false org.eclipse.jdt.core.formatter.comment.format_html=true org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=false +org.eclipse.jdt.core.formatter.comment.format_line_comments=true org.eclipse.jdt.core.formatter.comment.format_source_code=true org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert org.eclipse.jdt.core.formatter.comment.line_length=80 org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=1 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true @@ -176,6 +203,7 @@ org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert @@ -185,6 +213,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert @@ -198,11 +227,15 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert @@ -229,9 +262,14 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declar org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert @@ -256,13 +294,20 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert @@ -306,9 +351,13 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_decla org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert @@ -345,9 +394,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert @@ -359,20 +411,59 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_decla org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.join_lines_in_comments=true org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never org.eclipse.jdt.core.formatter.lineSplit=80 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0 org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.text_block_indentation=0 org.eclipse.jdt.core.formatter.use_on_off_tags=false org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/app/.settings/org.eclipse.jdt.ui.prefs b/app/.settings/org.eclipse.jdt.ui.prefs index 7f5ba1ed84..66aaa0890e 100644 --- a/app/.settings/org.eclipse.jdt.ui.prefs +++ b/app/.settings/org.eclipse.jdt.ui.prefs @@ -1,3 +1,3 @@ eclipse.preferences.version=1 formatter_profile=_processing -formatter_settings_version=12 +formatter_settings_version=18 diff --git a/core/.settings/org.eclipse.jdt.core.prefs b/core/.settings/org.eclipse.jdt.core.prefs index 6c6ce4e4e9..f57dd085ab 100644 --- a/core/.settings/org.eclipse.jdt.core.prefs +++ b/core/.settings/org.eclipse.jdt.core.prefs @@ -98,7 +98,12 @@ org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 @@ -107,24 +112,39 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_assignment=0 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=36 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=18 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=18 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_field=1 org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 @@ -133,6 +153,7 @@ org.eclipse.jdt.core.formatter.blank_lines_before_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 org.eclipse.jdt.core.formatter.blank_lines_before_package=0 org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0 org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line @@ -142,32 +163,38 @@ org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false org.eclipse.jdt.core.formatter.comment.format_block_comments=true org.eclipse.jdt.core.formatter.comment.format_header=false org.eclipse.jdt.core.formatter.comment.format_html=true org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=false +org.eclipse.jdt.core.formatter.comment.format_line_comments=true org.eclipse.jdt.core.formatter.comment.format_source_code=true org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert org.eclipse.jdt.core.formatter.comment.line_length=80 org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=1 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true @@ -180,6 +207,7 @@ org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert @@ -189,6 +217,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert @@ -202,11 +231,15 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert @@ -233,9 +266,14 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declar org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert @@ -260,13 +298,20 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert @@ -310,9 +355,13 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_decla org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert @@ -349,9 +398,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert @@ -363,20 +415,59 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_decla org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.join_lines_in_comments=true org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never org.eclipse.jdt.core.formatter.lineSplit=80 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0 org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.text_block_indentation=0 org.eclipse.jdt.core.formatter.use_on_off_tags=false org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/core/.settings/org.eclipse.jdt.ui.prefs b/core/.settings/org.eclipse.jdt.ui.prefs index 2e87119d6c..1286aca0bb 100644 --- a/core/.settings/org.eclipse.jdt.ui.prefs +++ b/core/.settings/org.eclipse.jdt.ui.prefs @@ -1,7 +1,7 @@ eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true formatter_profile=_processing -formatter_settings_version=12 +formatter_settings_version=18 org.eclipse.jdt.ui.text.custom_code_templates= sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false diff --git a/java/libraries/net/.settings/org.eclipse.jdt.core.prefs b/java/libraries/net/.settings/org.eclipse.jdt.core.prefs index f256b10aad..ac3ca93e5c 100644 --- a/java/libraries/net/.settings/org.eclipse.jdt.core.prefs +++ b/java/libraries/net/.settings/org.eclipse.jdt.core.prefs @@ -11,7 +11,12 @@ org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 @@ -20,24 +25,39 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_assignment=0 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=36 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=18 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=18 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_field=1 org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 @@ -46,6 +66,7 @@ org.eclipse.jdt.core.formatter.blank_lines_before_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 org.eclipse.jdt.core.formatter.blank_lines_before_package=0 org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0 org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line @@ -55,34 +76,40 @@ org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false org.eclipse.jdt.core.formatter.comment.format_block_comments=true org.eclipse.jdt.core.formatter.comment.format_comments=true org.eclipse.jdt.core.formatter.comment.format_header=false org.eclipse.jdt.core.formatter.comment.format_html=true org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=false +org.eclipse.jdt.core.formatter.comment.format_line_comments=true org.eclipse.jdt.core.formatter.comment.format_source_code=true org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert org.eclipse.jdt.core.formatter.comment.line_length=80 org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=1 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true @@ -95,6 +122,7 @@ org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert @@ -104,6 +132,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert @@ -117,11 +146,15 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert @@ -148,9 +181,14 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declar org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert @@ -175,13 +213,20 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert @@ -225,9 +270,13 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_decla org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert @@ -264,9 +313,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert @@ -278,20 +330,59 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_decla org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.join_lines_in_comments=true org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never org.eclipse.jdt.core.formatter.lineSplit=80 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0 org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.text_block_indentation=0 org.eclipse.jdt.core.formatter.use_on_off_tags=false org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/java/libraries/net/.settings/org.eclipse.jdt.ui.prefs b/java/libraries/net/.settings/org.eclipse.jdt.ui.prefs index 7f5ba1ed84..66aaa0890e 100644 --- a/java/libraries/net/.settings/org.eclipse.jdt.ui.prefs +++ b/java/libraries/net/.settings/org.eclipse.jdt.ui.prefs @@ -1,3 +1,3 @@ eclipse.preferences.version=1 formatter_profile=_processing -formatter_settings_version=12 +formatter_settings_version=18 diff --git a/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs b/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs index 160529e9d0..02a284792f 100644 --- a/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs +++ b/java/libraries/pdf/.settings/org.eclipse.jdt.core.prefs @@ -11,7 +11,12 @@ org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 @@ -20,24 +25,39 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=18 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_assignment=0 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=36 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=18 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=18 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_field=1 org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 @@ -46,6 +66,7 @@ org.eclipse.jdt.core.formatter.blank_lines_before_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 org.eclipse.jdt.core.formatter.blank_lines_before_package=0 org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0 org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line @@ -55,32 +76,38 @@ org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false org.eclipse.jdt.core.formatter.comment.format_block_comments=true org.eclipse.jdt.core.formatter.comment.format_header=false org.eclipse.jdt.core.formatter.comment.format_html=true org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=false +org.eclipse.jdt.core.formatter.comment.format_line_comments=true org.eclipse.jdt.core.formatter.comment.format_source_code=true org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert org.eclipse.jdt.core.formatter.comment.line_length=80 org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=1 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true @@ -92,6 +119,7 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert @@ -101,6 +129,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert @@ -114,11 +143,15 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert @@ -145,9 +178,14 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declar org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert @@ -172,13 +210,20 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert @@ -222,9 +267,13 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_decla org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert @@ -261,9 +310,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert @@ -275,20 +327,59 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_decla org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.join_lines_in_comments=true org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never org.eclipse.jdt.core.formatter.lineSplit=80 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0 org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.text_block_indentation=0 org.eclipse.jdt.core.formatter.use_on_off_tags=false org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/java/libraries/pdf/.settings/org.eclipse.jdt.ui.prefs b/java/libraries/pdf/.settings/org.eclipse.jdt.ui.prefs index 0d6ea5b9dd..24dec57837 100644 --- a/java/libraries/pdf/.settings/org.eclipse.jdt.ui.prefs +++ b/java/libraries/pdf/.settings/org.eclipse.jdt.ui.prefs @@ -1,4 +1,4 @@ eclipse.preferences.version=1 formatter_profile=_processing -formatter_settings_version=12 +formatter_settings_version=18 org.eclipse.jdt.ui.text.custom_code_templates= From 8e86389c7e017d0e4d61f81fb942c25e3ed348c7 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 26 Apr 2020 21:20:42 -0400 Subject: [PATCH 142/172] deal with a few warnings --- app/src/processing/app/ui/PreferencesFrame.java | 1 - core/src/processing/core/PVector.java | 2 -- java/src/processing/mode/java/preproc/TokenUtil.java | 3 +-- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/processing/app/ui/PreferencesFrame.java b/app/src/processing/app/ui/PreferencesFrame.java index 91c077b537..d4684b2e24 100644 --- a/app/src/processing/app/ui/PreferencesFrame.java +++ b/app/src/processing/app/ui/PreferencesFrame.java @@ -37,7 +37,6 @@ import processing.app.Messages; import processing.app.Platform; import processing.app.Preferences; -import processing.app.ui.ColorChooser; import processing.core.*; diff --git a/core/src/processing/core/PVector.java b/core/src/processing/core/PVector.java index 51d461f409..9c0b65e841 100644 --- a/core/src/processing/core/PVector.java +++ b/core/src/processing/core/PVector.java @@ -26,8 +26,6 @@ import java.io.Serializable; -import processing.core.PApplet; -import processing.core.PConstants; /** * ( begin auto-generated from PVector.xml ) diff --git a/java/src/processing/mode/java/preproc/TokenUtil.java b/java/src/processing/mode/java/preproc/TokenUtil.java index e6c4721eab..71e418dd9c 100644 --- a/java/src/processing/mode/java/preproc/TokenUtil.java +++ b/java/src/processing/mode/java/preproc/TokenUtil.java @@ -2,10 +2,9 @@ import java.lang.reflect.Field; import antlr.collections.AST; -import processing.mode.java.preproc.PdeTokenTypes; /** - * + * * @author Jonathan Feinberg <jdf@pobox.com> * */ From 17c8001a948a2be9f5816cda49feac9473aeb0b7 Mon Sep 17 00:00:00 2001 From: Jeremy Douglass Date: Thu, 28 May 2020 18:07:13 -0700 Subject: [PATCH 143/172] update issue template -- correct forum link --- ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 01a24196ca..a4f3e3258b 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,4 +1,4 @@ - + From 730d99dad14f35a012f38ae4497ef25588973d83 Mon Sep 17 00:00:00 2001 From: Casey Reas Date: Fri, 12 Jun 2020 11:54:48 -0700 Subject: [PATCH 144/172] Add Sponsor button to repository --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..f8c6bc52bc --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: processing From 59e0b7f35bdf3c63d3c21c53207749ebd4f86b48 Mon Sep 17 00:00:00 2001 From: Casey Reas Date: Fri, 12 Jun 2020 12:11:47 -0700 Subject: [PATCH 145/172] Update Sponsor button, external link to Foundation --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index f8c6bc52bc..2cf28e94b0 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ github: processing +custom: https://processingfoundation.org/support From 78f7c30076de3f9a24536913249009be7e543a6b Mon Sep 17 00:00:00 2001 From: Casey Reas Date: Fri, 12 Jun 2020 15:05:49 -0700 Subject: [PATCH 146/172] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 2cf28e94b0..41534ed7ba 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,2 @@ github: processing -custom: https://processingfoundation.org/support +custom: https://processingfoundation.org From 4cc297c66908899cd29480c202536ecf749854e8 Mon Sep 17 00:00:00 2001 From: Casey Reas Date: Mon, 15 Jun 2020 14:01:50 -0700 Subject: [PATCH 147/172] Update parameter reference for curveTangent() --- core/src/processing/core/PGraphics.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 266cf43bdc..d9b4be5192 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -3470,10 +3470,10 @@ public float curvePoint(float a, float b, float c, float d, float t) { * Code thanks to Dave Bollinger (Bug #715) * * @webref shape:curves - * @param a coordinate of first point on the curve - * @param b coordinate of first control point - * @param c coordinate of second control point - * @param d coordinate of second point on the curve + * @param a coordinate of first control point on the curve + * @param b coordinate of first point + * @param c coordinate of first point + * @param d coordinate of second control point on the curve * @param t value between 0 and 1 * @see PGraphics#curve(float, float, float, float, float, float, float, float, float, float, float, float) * @see PGraphics#curveVertex(float, float) From 2492d778c1c474aa23886390b561c58677cf3a78 Mon Sep 17 00:00:00 2001 From: Hugo Vale Pereira Date: Sat, 5 Sep 2020 19:48:10 +0100 Subject: [PATCH 148/172] getShape() - Type of vertex was wrong for Cubic When 'detail' is set to 0, it was causing getShape to break with OTF fonts that use cubic bezier paths. By mistake, a 3D quadratic was being drawn instead of a proper cubic bezier. --- core/src/processing/core/PFont.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/processing/core/PFont.java b/core/src/processing/core/PFont.java index 12ee61a36b..5c8d38c4b5 100644 --- a/core/src/processing/core/PFont.java +++ b/core/src/processing/core/PFont.java @@ -782,7 +782,7 @@ public PShape getShape(char ch, float detail) { case PathIterator.SEG_CUBICTO: // 3 points // System.out.println("cubicto"); // PApplet.println(iterPoints); - s.quadraticVertex(iterPoints[0], iterPoints[1], + s.bezierVertex(iterPoints[0], iterPoints[1], iterPoints[2], iterPoints[3], iterPoints[4], iterPoints[5]); break; From 4fe0cce37c896f472e936cb1506cba175a654cd3 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Sep 2020 17:33:41 -0400 Subject: [PATCH 149/172] fix white space --- build/jre/build.xml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/build/jre/build.xml b/build/jre/build.xml index db3c84e6e7..c12776eff2 100644 --- a/build/jre/build.xml +++ b/build/jre/build.xml @@ -5,43 +5,43 @@ - + + it allows us to build the PDE with only a JRE on Windows and Linux. + So that the core can be built independently of the PDE, + use javac (the "modern" compiler) if ecj is not present. --> - + + target="1.8" + srcdir="src" + destdir="bin" + debug="true" + includeantruntime="true" + nowarn="true"> - + - + - - + - + From 89a080814895234b54201c0240625e47a5b369cf Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Sep 2020 20:11:06 -0400 Subject: [PATCH 150/172] trying out a cached copy of the JRE to address #5827 and others --- build/jre/src/Downloader.java | 10 +++++++++- todo.txt | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/build/jre/src/Downloader.java b/build/jre/src/Downloader.java index b25fb58b8d..0eab58acee 100644 --- a/build/jre/src/Downloader.java +++ b/build/jre/src/Downloader.java @@ -8,8 +8,13 @@ /** * Ant Task for downloading the latest JRE or JDK from Oracle. + * This was used to set a cookie properly to retrieve a JRE. + * Nowadays the older versions have been removed from Oracle's site, + * so this is hard wired it to use download.processing.org instead. */ public class Downloader extends Task { + static final boolean ORACLE_SUCKS = true; // that's final + static final String COOKIE = "oraclelicense=accept-securebackup-cookie"; @@ -82,7 +87,6 @@ public void execute() throws BuildException { throw new BuildException("Starting with 8u121, a hash is required, see https://gist.github.com/P7h/9741922"); } - //download(path, jdk, platform, bits, version, update, build); try { download(); } catch (IOException e) { @@ -111,6 +115,10 @@ void download() throws IOException { url += hash + "/"; } + if (ORACLE_SUCKS) { + url = "https://download.processing.org/java/"; + } + // Finally, add the filename to the end url += filename; diff --git a/todo.txt b/todo.txt index caf4e3b087..62e8655b1f 100644 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,9 @@ 0271 (3.5.5 unlikely) +_ get the jre download to work by using a local copy +X https://github.com/processing/processing/issues/5827 +X https://github.com/processing/processing/issues/5860 +_ https://github.com/processing/processing/issues/5942 +_ https://github.com/processing/processing/issues/6089 contribs X rename-variable menu allows Java identifiers From 65c167b0a1ad5db716387cd829fc1bfd0b2c9d4f Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Sep 2020 20:34:57 -0400 Subject: [PATCH 151/172] get the jre download to work by using a cached copy --- todo.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/todo.txt b/todo.txt index 62e8655b1f..e6fa460dd0 100644 --- a/todo.txt +++ b/todo.txt @@ -1,9 +1,9 @@ 0271 (3.5.5 unlikely) -_ get the jre download to work by using a local copy +X get the jre download to work by using a cached copy X https://github.com/processing/processing/issues/5827 X https://github.com/processing/processing/issues/5860 -_ https://github.com/processing/processing/issues/5942 -_ https://github.com/processing/processing/issues/6089 +X https://github.com/processing/processing/issues/5942 +X https://github.com/processing/processing/issues/6089 contribs X rename-variable menu allows Java identifiers From 55a18f6347e6cb232157aad25b87746acb60802b Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 21 Sep 2020 18:22:41 -0400 Subject: [PATCH 152/172] handle Terminal.app move in macOS Catalina (fixes #6091) --- build/build.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/build/build.xml b/build/build.xml index c7061c2c3d..5b944c08b8 100644 --- a/build/build.xml +++ b/build/build.xml @@ -694,9 +694,20 @@ + + + + + + + - + From 36b3990ce3df4b5a8bc40e6e428532bc5aeca3d8 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Sep 2020 13:52:17 -0400 Subject: [PATCH 153/172] whitespace change --- core/src/processing/core/PApplet.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index b935d3c5f3..c43fbca8cb 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -12596,10 +12596,10 @@ public float curvePoint(float a, float b, float c, float d, float t) { * Code thanks to Dave Bollinger (Bug #715) * * @webref shape:curves - * @param a coordinate of first point on the curve - * @param b coordinate of first control point - * @param c coordinate of second control point - * @param d coordinate of second point on the curve + * @param a coordinate of first control point on the curve + * @param b coordinate of first point + * @param c coordinate of first point + * @param d coordinate of second control point on the curve * @param t value between 0 and 1 * @see PGraphics#curve(float, float, float, float, float, float, float, float, float, float, float, float) * @see PGraphics#curveVertex(float, float) From 4a8e20688cdac7683cd4e2450a823237ceca5715 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Sep 2020 13:52:29 -0400 Subject: [PATCH 154/172] add a note about #6092 --- core/todo.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/todo.txt b/core/todo.txt index c15593393c..8055db170c 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,5 +1,9 @@ 0271 (3.5.5 unlikely) +contribs +X getShape() - Type of vertex was wrong for Cubic +X https://github.com/processing/processing/pull/6092 + _ size() issues on Mojave? _ https://github.com/processing/processing/issues/5791 From e3d8304932e23711547725fd340418c09fb39513 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Sep 2020 13:53:20 -0400 Subject: [PATCH 155/172] I could swear I already removed these unused imports --- app/src/processing/app/platform/LinuxPlatform.java | 1 - app/src/processing/app/platform/MacPlatform.java | 1 - app/src/processing/app/ui/ErrorTable.java | 1 - app/src/processing/app/ui/MarkerColumn.java | 1 - java/src/processing/mode/java/preproc/PdeEmitter.java | 3 +-- 5 files changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/processing/app/platform/LinuxPlatform.java b/app/src/processing/app/platform/LinuxPlatform.java index fe3d7ce859..7bc7297246 100644 --- a/app/src/processing/app/platform/LinuxPlatform.java +++ b/app/src/processing/app/platform/LinuxPlatform.java @@ -29,7 +29,6 @@ import processing.app.Base; import processing.app.Messages; import processing.app.Preferences; -import processing.app.platform.DefaultPlatform; import processing.core.PApplet; diff --git a/app/src/processing/app/platform/MacPlatform.java b/app/src/processing/app/platform/MacPlatform.java index b3fd404d97..02474a3942 100644 --- a/app/src/processing/app/platform/MacPlatform.java +++ b/app/src/processing/app/platform/MacPlatform.java @@ -32,7 +32,6 @@ import processing.app.Base; import processing.app.Messages; -import processing.app.platform.DefaultPlatform; /** diff --git a/app/src/processing/app/ui/ErrorTable.java b/app/src/processing/app/ui/ErrorTable.java index f033dfc5b0..8abfdf77a0 100644 --- a/app/src/processing/app/ui/ErrorTable.java +++ b/app/src/processing/app/ui/ErrorTable.java @@ -41,7 +41,6 @@ import processing.app.Language; import processing.app.Mode; import processing.app.Problem; -import processing.app.ui.Editor; public class ErrorTable extends JTable { diff --git a/app/src/processing/app/ui/MarkerColumn.java b/app/src/processing/app/ui/MarkerColumn.java index 7169d92ec5..8d6371fbd5 100644 --- a/app/src/processing/app/ui/MarkerColumn.java +++ b/app/src/processing/app/ui/MarkerColumn.java @@ -39,7 +39,6 @@ import processing.app.Sketch; import processing.app.SketchCode; import processing.app.syntax.PdeTextArea; -import processing.app.ui.Editor; import processing.core.PApplet; diff --git a/java/src/processing/mode/java/preproc/PdeEmitter.java b/java/src/processing/mode/java/preproc/PdeEmitter.java index c2b5a4ed15..1f1adca228 100644 --- a/java/src/processing/mode/java/preproc/PdeEmitter.java +++ b/java/src/processing/mode/java/preproc/PdeEmitter.java @@ -8,7 +8,6 @@ import java.util.Stack; import processing.app.Preferences; import processing.app.SketchException; -import processing.mode.java.preproc.PdeTokenTypes; import antlr.CommonASTWithHiddenTokens; import antlr.CommonHiddenStreamToken; import antlr.collections.AST; @@ -35,7 +34,7 @@ public class PdeEmitter implements PdeTokenTypes { private final PrintWriter out; private final PrintStream debug = System.err; - private final Stack stack = new Stack(); + private final Stack stack = new Stack<>(); private final static int ROOT_ID = 0; public PdeEmitter(final PdePreprocessor pdePreprocessor, final PrintWriter out) { From 82269447441177f3a279e63b5513a8dc2508484a Mon Sep 17 00:00:00 2001 From: Alexandre B A Villares <3694604+villares@users.noreply.github.com> Date: Thu, 24 Sep 2020 11:08:51 -0300 Subject: [PATCH 156/172] Fixes color selector menu name in PDE_pt.properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is no "Côr" in Portuguese, the word is "Cor" (color) https://dictionary.cambridge.org/dictionary/portuguese-english/cor --- build/shared/lib/languages/PDE_pt.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/shared/lib/languages/PDE_pt.properties b/build/shared/lib/languages/PDE_pt.properties index fbf823c3b3..607188f697 100644 --- a/build/shared/lib/languages/PDE_pt.properties +++ b/build/shared/lib/languages/PDE_pt.properties @@ -67,7 +67,7 @@ menu.sketch.add_file = Adicionar Ficheiro... # | File | Edit | Sketch | Debug | Tools | Help | # | Tools | menu.tools = Ferramentas -menu.tools.color_selector = Selector de Côr... +menu.tools.color_selector = Selector de Cor... menu.tools.create_font = Criar Fonte... menu.tools.archive_sketch = Arquivar Sketch menu.tools.fix_the_serial_lbrary = Corrijir a Biblioteca Serial From cd96fc639bfb8568d801ad33f6e3fe3a0c7e4697 Mon Sep 17 00:00:00 2001 From: Alexandre B A Villares <3694604+villares@users.noreply.github.com> Date: Thu, 24 Sep 2020 11:22:48 -0300 Subject: [PATCH 157/172] Small fixes for PDE_pt.properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Guardr -> Guardar Yah, não. -> Ah, não. Nenhuns ficheiros -> Nenhum dos ficheiros erro a descarregar -> erro ao descarregar --- build/shared/lib/languages/PDE_pt.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/shared/lib/languages/PDE_pt.properties b/build/shared/lib/languages/PDE_pt.properties index fbf823c3b3..f379459e79 100644 --- a/build/shared/lib/languages/PDE_pt.properties +++ b/build/shared/lib/languages/PDE_pt.properties @@ -204,7 +204,7 @@ toolbar.stop = Parar # --- toolbar.new = Novo toolbar.open = Abrir -toolbar.save = Guardr +toolbar.save = Guardar # toolbar.export_application = Exportar Aplicação toolbar.add_mode = Adicionar modo... @@ -218,14 +218,14 @@ editor.header.rename = Renomear editor.header.delete = Apagar editor.header.previous_tab = Aba Anterior editor.header.next_tab = Aba Seguinte -editor.header.delete.warning.title = Yah, não. -editor.header.delete.warning.text = Não pode apagar a última aba do último sketch aberto. +editor.header.delete.warning.title = Ah, não. +editor.header.delete.warning.text = Não se pode apagar a última aba do último sketch aberto. editor.status.autoformat.no_changes = Não foram necessárias alterações para a Auto Formatação. editor.status.autoformat.finished = Auto Formatação completa. editor.status.find_reference.select_word_first = Primeiro escolha uma palavra para procurar na referência. editor.status.find_reference.not_available = Não existe refrência disponivel para "%s". -editor.status.drag_and_drop.files_added.0 = Nenhuns ficheiros foram adicionados ao sketch. +editor.status.drag_and_drop.files_added.0 = Nenhum dos ficheiros foram adicionados ao sketch. editor.status.drag_and_drop.files_added.1 = Um ficheiro adicionado ao sketch. editor.status.drag_and_drop.files_added.n = %d ficheiros adicionados ao sketch. editor.status.saving = A Guardar... @@ -247,5 +247,5 @@ contrib.remove = Refazer contrib.install = Instalar contrib.progress.starting = A iniciar contrib.progress.downloading = A descarregar -contrib.download_error = Ocorreu um erro a descarregar a contribuição. +contrib.download_error = Ocorreu um erro ao descarregar a contribuição. contrib.unsupported_operating_system = O seu sistema operativo não parece ser suportado. Deve visitar a biblioteca %s para mais informação. From 9855c3f7c62147e0a0efb9882b6e508b1cfc854f Mon Sep 17 00:00:00 2001 From: Dee Yeum <36423861+ChefYeum@users.noreply.github.com> Date: Wed, 20 Jan 2021 23:33:33 +0900 Subject: [PATCH 158/172] bothers me --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91a56142b9..be601ccf9c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ __That [processing-bugs](https://github.com/processing-bugs) fella is suspicious The issues list has been imported from Google Code, so there are many spurious references amongst them since the numbering changed. Basically, any time you see references to changes made by [processing-bugs](https://github.com/processing-bugs), it may be somewhat suspect. -Over time this will clean itself up as bugs are fixed and new issues are added from within Github. +Over time this will clean itself up as bugs are fixed and new issues are added from within GitHub. Help speed this process along by helping us! __Please help.__ From 7c72ea693659f411890169f41fbf24edc7bc7040 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Jun 2021 17:43:46 -0400 Subject: [PATCH 159/172] add note about Portugese translation update --- todo.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/todo.txt b/todo.txt index e6fa460dd0..3cdc06d422 100644 --- a/todo.txt +++ b/todo.txt @@ -11,6 +11,9 @@ X https://github.com/processing/processing/issues/5828 X https://github.com/processing/processing/pull/5906 X Replace C/C++ style array declarations with Java style array declarations X https://github.com/processing/processing/pull/5981 +X Updates and fixes for PDE_pt.properties (Portugese translation) +X https://github.com/processing/processing/pull/6097 +X https://github.com/processing/processing/pull/6098 from Casey From 5569c6b25573b159aff5c0a1e0e00b0276adb340 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Jun 2021 17:44:13 -0400 Subject: [PATCH 160/172] automatically lock closed/resolved issues/pulls after 30 days --- .github/lock.yml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/lock.yml diff --git a/.github/lock.yml b/.github/lock.yml new file mode 100644 index 0000000000..14e31af728 --- /dev/null +++ b/.github/lock.yml @@ -0,0 +1,39 @@ +# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app + +# Number of days of inactivity before a closed issue or pull request is locked +daysUntilLock: 30 + +# Skip issues and pull requests created before a given timestamp. Timestamp must +# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable +skipCreatedBefore: false + +# Issues and pull requests with these labels will be ignored. Set to `[]` to disable +exemptLabels: [] + +# Label to add before locking, such as `outdated`. Set to `false` to disable +lockLabel: false + +# Comment to post before locking. Set to `false` to disable +lockComment: > + This thread has been automatically locked since there has not been + any recent activity after it was closed. Please open a new issue for + related bugs. + +# Assign `resolved` as the reason for locking. Set to `false` to disable +# setLockReason: true +setLockReason: false + +# Limit to only `issues` or `pulls` +# only: issues + +# Optionally, specify configuration settings just for `issues` or `pulls` +# issues: +# exemptLabels: +# - help-wanted +# lockLabel: outdated + +# pulls: +# daysUntilLock: 30 + +# Repository to extend settings from +# _extends: repo From 250e28b8ea1c34875184e32a4815edcdedaa71fe Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Jun 2021 17:45:03 -0400 Subject: [PATCH 161/172] note about issue locking --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index be601ccf9c..66c15c1a66 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ There are also separate locations for [Android Mode](https://github.com/processi The [processing.js](http://processingjs.org) project is not affiliated with us, but you can find their issue tracker [here](https://github.com/processing-js/processing-js/issues). __Locked Issues__ -Where possible, I've started locking issues once resolved. This helps reduce the amount of noise from folks adding to an issue that's been closed for years. Because this project has existed for a long time and we have thousands of closed issues, lots of them may sound similar to an issue you're having. But if there's a new problem, it'll be missed if it's lost in a comment added to an already closed issue. I don't like to lock issues because it cuts off conversation, but it's better than legitimate problems being missed. +Where possible, I've started locking issues once resolved. This helps reduce the amount of noise from folks adding to an issue that's been closed for years. Because this project has existed for a long time and we have thousands of closed issues, lots of them may sound similar to an issue you're having. But if there's a new problem, it'll be missed if it's lost in a comment added to an already closed issue. I don't like to lock issues because it cuts off conversation, but it's better than legitimate problems being missed. Once an issue has been resolved for 30 days, it will automatically lock. __That [processing-bugs](https://github.com/processing-bugs) fella is suspicious.__ The issues list has been imported from Google Code, so there are many spurious references From 64e2bef545071258756c27bb563fcfd8c3614cd1 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Jun 2021 22:25:43 -0400 Subject: [PATCH 162/172] using a workflow for locking instead --- .github/lock.yml | 39 -------------------------------------- .github/workflows/lock.yml | 22 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 39 deletions(-) delete mode 100644 .github/lock.yml create mode 100644 .github/workflows/lock.yml diff --git a/.github/lock.yml b/.github/lock.yml deleted file mode 100644 index 14e31af728..0000000000 --- a/.github/lock.yml +++ /dev/null @@ -1,39 +0,0 @@ -# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app - -# Number of days of inactivity before a closed issue or pull request is locked -daysUntilLock: 30 - -# Skip issues and pull requests created before a given timestamp. Timestamp must -# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable -skipCreatedBefore: false - -# Issues and pull requests with these labels will be ignored. Set to `[]` to disable -exemptLabels: [] - -# Label to add before locking, such as `outdated`. Set to `false` to disable -lockLabel: false - -# Comment to post before locking. Set to `false` to disable -lockComment: > - This thread has been automatically locked since there has not been - any recent activity after it was closed. Please open a new issue for - related bugs. - -# Assign `resolved` as the reason for locking. Set to `false` to disable -# setLockReason: true -setLockReason: false - -# Limit to only `issues` or `pulls` -# only: issues - -# Optionally, specify configuration settings just for `issues` or `pulls` -# issues: -# exemptLabels: -# - help-wanted -# lockLabel: outdated - -# pulls: -# daysUntilLock: 30 - -# Repository to extend settings from -# _extends: repo diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml new file mode 100644 index 0000000000..a8a24e0f5f --- /dev/null +++ b/.github/workflows/lock.yml @@ -0,0 +1,22 @@ +name: 'Lock Threads' + +on: + schedule: + - cron: '27 * * * *' + +jobs: + lock: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v2.0.1 + with: + github-token: ${{ github.token }} + issue-lock-inactive-days: '30' + issue-lock-comment: > + This issue has been automatically locked since there + has not been any recent activity after it was closed. + Please open a new issue for related bugs. + pr-lock-comment: > + This pull request has been automatically locked since there + has not been any recent activity after it was closed. + Please open a new issue for related bugs. From fd2b07551a586751f1a23cbf86e2fd8706007a74 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 14 Jun 2021 22:35:58 -0400 Subject: [PATCH 163/172] so much for running at an off time --- .github/workflows/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index a8a24e0f5f..f46041e750 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -2,7 +2,7 @@ name: 'Lock Threads' on: schedule: - - cron: '27 * * * *' + - cron: '0 * * * *' jobs: lock: From ad31c61bc10e7dda3f8806b865139858f8252326 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Mon, 28 Jun 2021 17:45:24 -0400 Subject: [PATCH 164/172] add a note about the new repo --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 66c15c1a66..a4fb443d57 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +# Since the release of Processing 3.5.4 in January 2020, development has moved to [a new repository](https://github.com/processing/processing4/). +Using a [4.0 release](https://github.com/processing/processing4/releases) (even an alpha or beta version) is recommended if you find an issue. To avoid confusion, this repo will remain open at least until a 4.0 release is the default download at https://processing.org/download. We chose to move to a new repository so that we could clean out old files accumulated over the last 20 years. + + Processing ========== From 9eb4e9b6c975d8e9d3cce85230300c04a52927c6 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 6 Jul 2021 06:13:43 -0400 Subject: [PATCH 165/172] clarifying lock message, run lock daily instead of hourly --- .github/workflows/lock.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index f46041e750..d3ea54200a 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -2,7 +2,7 @@ name: 'Lock Threads' on: schedule: - - cron: '0 * * * *' + - cron: '* 6 * * *' jobs: lock: @@ -13,10 +13,11 @@ jobs: github-token: ${{ github.token }} issue-lock-inactive-days: '30' issue-lock-comment: > - This issue has been automatically locked since there - has not been any recent activity after it was closed. + This issue has been automatically locked. To avoid confusion + with reports that have already been resolved, closed issues + are automatically locked 30 days after the last comment. Please open a new issue for related bugs. pr-lock-comment: > - This pull request has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new issue for related bugs. + This pull request has been automatically locked. + Pull requests that have been closed are automatically + locked 30 days after the last comment. From d234e79f21e4534a8732ba177c5717c4e028e959 Mon Sep 17 00:00:00 2001 From: Jeremy Douglass Date: Wed, 18 Aug 2021 20:48:19 -0700 Subject: [PATCH 166/172] Update ISSUE_TEMPLATE.md to redirect Processing 4 questions > STOP! PROCESSING 4 ISSUES GO TO https://github.com/processing/processing4/issues --- ISSUE_TEMPLATE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index a4f3e3258b..ff4ffecc6c 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,3 +1,5 @@ + + @@ -6,6 +8,8 @@ + + ## Description From a6a86250ffa4041b7d77fbb66dc02e78360c64f0 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 3 Oct 2021 11:48:48 -0400 Subject: [PATCH 167/172] tweak issue template a little --- ISSUE_TEMPLATE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index ff4ffecc6c..9a78beeb43 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,4 +1,4 @@ - + @@ -9,6 +9,7 @@ + ## Description From 8b15e4f548c1426df3a5ebe4c2106619faf7c4ba Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sun, 27 Mar 2022 11:19:42 -0400 Subject: [PATCH 168/172] update issue template --- ISSUE_TEMPLATE.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 9a78beeb43..bc9287c602 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,4 +1,8 @@ - + + + + + From 69ccc92e6950dd3f071abc23cffe9763014638da Mon Sep 17 00:00:00 2001 From: Alex <93376818+sashashura@users.noreply.github.com> Date: Thu, 1 Sep 2022 22:16:50 +0100 Subject: [PATCH 169/172] Update lock.yml Signed-off-by: sashashura <93376818+sashashura@users.noreply.github.com> --- .github/workflows/lock.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index d3ea54200a..30b12e76c3 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -4,8 +4,14 @@ on: schedule: - cron: '* 6 * * *' +permissions: + contents: read + jobs: lock: + permissions: + issues: write + pull-requests: write runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@v2.0.1 From 36a554b38f230384dbab20a3b2f47fef82df9b99 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Tue, 17 Dec 2024 09:49:47 +0100 Subject: [PATCH 170/172] Lock Threads fix Run at 6, not every minute of the 6th hour --- .github/workflows/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 30b12e76c3..10801377c7 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -2,7 +2,7 @@ name: 'Lock Threads' on: schedule: - - cron: '* 6 * * *' + - cron: '* 6 * * 0' permissions: contents: read From 25a12a723a24e044aac6f29bbf1f85e25683a9eb Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Tue, 17 Dec 2024 16:10:08 +0100 Subject: [PATCH 171/172] Update lock.yml --- .github/workflows/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 10801377c7..5ed1e8ee84 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -2,7 +2,7 @@ name: 'Lock Threads' on: schedule: - - cron: '* 6 * * 0' + - cron: '0 6 * * *' permissions: contents: read From 1de30e075fb6675cc4c8a0f7b29febab415b1ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20de=20Courville?= Date: Sun, 18 May 2025 23:02:16 +0200 Subject: [PATCH 172/172] Update README.md Better callout and strikethrough for clarity --- README.md | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index a4fb443d57..ece7d3ab72 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,48 @@ -# Since the release of Processing 3.5.4 in January 2020, development has moved to [a new repository](https://github.com/processing/processing4/). -Using a [4.0 release](https://github.com/processing/processing4/releases) (even an alpha or beta version) is recommended if you find an issue. To avoid confusion, this repo will remain open at least until a 4.0 release is the default download at https://processing.org/download. We chose to move to a new repository so that we could clean out old files accumulated over the last 20 years. + + +>[!WARNING] +> # Development has moved to [a new repository](https://github.com/processing/processing4/). + +Since the release of Processing 3.5.4 in January 2020, development has continued in a new repository: [processing/processing4](https://github.com/processing/processing4/). + +We chose to move to a new repository so that we could clean out old files accumulated over the last 20 years. + +To report bugs or request features, please open a [new issue](https://github.com/processing/processing4/issues/new/choose) on the Processing 4 repository. + + -Processing +~~Processing~~ ========== -This is the official source code for the [Processing](http://processing.org) Development Environment (PDE), -the “core” and the libraries that are included with the [download](http://processing.org/download). +~~This is the official source code for the [Processing](http://processing.org) Development Environment (PDE), +the “core” and the libraries that are included with the [download](http://processing.org/download).~~ -__I've found a bug!__ -Let us know [here](https://github.com/processing/processing/issues) (after first checking if someone has already posted a similar problem). +~~__I've found a bug!__~~ +~~Let us know [here](https://github.com/processing/processing/issues) (after first checking if someone has already posted a similar problem). If it's a reference, web site, or examples issue, take that up with folks [here](https://github.com/processing/processing-docs/issues). There are also separate locations for [Android Mode](https://github.com/processing/processing-android/issues), or the [Video](https://github.com/processing/processing-video/issues) and [Sound](https://github.com/processing/processing-sound/issues) libraries. -The [processing.js](http://processingjs.org) project is not affiliated with us, but you can find their issue tracker [here](https://github.com/processing-js/processing-js/issues). +The [processing.js](http://processingjs.org) project is not affiliated with us, but you can find their issue tracker [here](https://github.com/processing-js/processing-js/issues).~~ -__Locked Issues__ -Where possible, I've started locking issues once resolved. This helps reduce the amount of noise from folks adding to an issue that's been closed for years. Because this project has existed for a long time and we have thousands of closed issues, lots of them may sound similar to an issue you're having. But if there's a new problem, it'll be missed if it's lost in a comment added to an already closed issue. I don't like to lock issues because it cuts off conversation, but it's better than legitimate problems being missed. Once an issue has been resolved for 30 days, it will automatically lock. +~~__Locked Issues__ +Where possible, I've started locking issues once resolved. This helps reduce the amount of noise from folks adding to an issue that's been closed for years. Because this project has existed for a long time and we have thousands of closed issues, lots of them may sound similar to an issue you're having. But if there's a new problem, it'll be missed if it's lost in a comment added to an already closed issue. I don't like to lock issues because it cuts off conversation, but it's better than legitimate problems being missed. Once an issue has been resolved for 30 days, it will automatically lock.~~ -__That [processing-bugs](https://github.com/processing-bugs) fella is suspicious.__ +~~__That [processing-bugs](https://github.com/processing-bugs) fella is suspicious.__ The issues list has been imported from Google Code, so there are many spurious references amongst them since the numbering changed. Basically, any time you see references to changes made by [processing-bugs](https://github.com/processing-bugs), it may be somewhat suspect. Over time this will clean itself up as bugs are fixed and new issues are added from within GitHub. -Help speed this process along by helping us! +Help speed this process along by helping us!~~ -__Please help.__ +~~__Please help.__ The instructions for building the source [are here](https://github.com/processing/processing/wiki/Build-Instructions). -Please help us fix problems, and if you're submitting code, following the [style guidelines](https://github.com/processing/processing/wiki/Style-Guidelines) helps save me a lot of time. +Please help us fix problems, and if you're submitting code, following the [style guidelines](https://github.com/processing/processing/wiki/Style-Guidelines) helps save me a lot of time.~~ -__And finally...__ -Someday we'll also fix all these bugs, throw together hundreds of unit tests, and get rich off all this stuff that we're giving away for free. But not today. +~~__And finally...__ +Someday we'll also fix all these bugs, throw together hundreds of unit tests, and get rich off all this stuff that we're giving away for free. But not today.~~ -So in the meantime, I ask for your patience, +~~So in the meantime, I ask for your patience, [participation](https://github.com/processing/processing/wiki/Project-List), -and [patches](https://github.com/processing/processing/pulls). +and [patches](https://github.com/processing/processing/pulls).~~ -Ben Fry, 20 January 2019 +~~Ben Fry, 20 January 2019~~

a!j(10c%gL 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