Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 2875)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 2876)
@@ -8,5 +8,9 @@
 import java.awt.Rectangle;
 import java.awt.Toolkit;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
 import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 import java.io.File;
 import java.net.URI;
@@ -274,4 +278,5 @@
 
     protected static Rectangle bounds;
+    protected static int windowState = JFrame.NORMAL;
 
     private final CommandQueueListener redoUndoListener = new CommandQueueListener(){
@@ -324,7 +329,11 @@
 
         Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
-        String geometry = Main.pref.get("gui.geometry");
+        String geometry = null;
         if (args.containsKey("geometry")) {
             geometry = args.get("geometry").iterator().next();
+            // Main.debug("Main window geometry from args: \""+geometry+"\"");
+        } else {
+            geometry = Main.pref.get("gui.geometry");
+            // Main.debug("Main window geometry from preferences: \""+geometry+"\"");
         }
         if (geometry.length() != 0) {
@@ -344,7 +353,15 @@
                     }
                 }
+                // copied from WindowsGeometry.applySafe()
+                if (x > Toolkit.getDefaultToolkit().getScreenSize().width - 10) {
+                    x = 0;
+                }
+                if (y > Toolkit.getDefaultToolkit().getScreenSize().height - 10) {
+                    y = 0;
+                }
                 bounds = new Rectangle(x,y,w,h);
                 if(!Main.pref.get("gui.geometry").equals(geometry)) {
                     // remember this geometry
+                    // Main.debug("Main window: saving geometry \"" + geometry + "\"");
                     Main.pref.put("gui.geometry", geometry);
                 }
@@ -356,4 +373,5 @@
             bounds = !args.containsKey("no-maximize") ? new Rectangle(0,0,screenDimension.width,screenDimension.height) : new Rectangle(1000,740);
         }
+        // Main.debug("window geometry: "+bounds);
     }
 
@@ -541,25 +559,22 @@
         String newToggleDlgWidth = null;
         try {
-            if (((JFrame)parent).getExtendedState() == JFrame.NORMAL) {
-                Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
-                Rectangle bounds = parent.getBounds();
-                int width = (int)bounds.getWidth();
-                int height = (int)bounds.getHeight();
-                int x = (int)bounds.getX();
-                int y = (int)bounds.getY();
-                if (width > screenDimension.width) {
-                    width = screenDimension.width;
-                }
-                if (height > screenDimension.height) {
-                    width = screenDimension.height;
-                }
-                if (x < 0) {
-                    x = 0;
-                }
-                if (y < 0) {
-                    y = 0;
-                }
-                newGeometry = width + "x" + height + "+" + x + "+" + y;
-            }
+            Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
+            int width = (int)bounds.getWidth();
+            int height = (int)bounds.getHeight();
+            int x = (int)bounds.getX();
+            int y = (int)bounds.getY();
+            if (width > screenDimension.width) {
+                width = screenDimension.width;
+            }
+            if (height > screenDimension.height) {
+                width = screenDimension.height;
+            }
+            if (x < 0) {
+                x = 0;
+            }
+            if (y < 0) {
+                y = 0;
+            }
+            newGeometry = width + "x" + height + "+" + x + "+" + y;
 
             if (map  != null) {
@@ -571,7 +586,10 @@
         }
         catch (Exception e) {
-            System.out.println("Failed to save GUI geometry: " + e);
+            System.out.println("Failed to get GUI geometry: " + e);
             e.printStackTrace();
         }
+        boolean maximized = (windowState & JFrame.MAXIMIZED_BOTH) != 0;
+        // Main.debug("Main window: saving geometry \"" + newGeometry + "\" " + (maximized?"maximized":"normal"));
+        pref.put("gui.maximized", maximized);
         pref.put("gui.geometry", newGeometry);
         if (newToggleDlgWidth != null) {
@@ -579,3 +597,43 @@
         }
     }
+    private static class WindowPositionSizeListener extends WindowAdapter implements
+    ComponentListener {
+
+        @Override
+        public void windowStateChanged(WindowEvent e) {
+            Main.windowState = e.getNewState();
+            // Main.debug("Main window state changed to " + Main.windowState);
+        }
+
+        public void componentHidden(ComponentEvent e) {
+        }
+
+        public void componentMoved(ComponentEvent e) {
+            handleComponentEvent(e);
+        }
+
+        public void componentResized(ComponentEvent e) {
+            handleComponentEvent(e);
+        }
+
+        public void componentShown(ComponentEvent e) {
+        }
+
+        private void handleComponentEvent(ComponentEvent e) {
+            Component c = e.getComponent();
+            if (c instanceof JFrame) {
+                if (Main.windowState == JFrame.NORMAL) {
+                    Main.bounds = ((JFrame) c).getBounds();
+                    // Main.debug("Main window: new geometry " + Main.bounds);
+                } else {
+                    // Main.debug("Main window state is " + Main.windowState);
+                }
+            }
+        }
+
+    }
+    public static void addListener() {
+        parent.addComponentListener(new WindowPositionSizeListener());
+        ((JFrame)parent).addWindowStateListener(new WindowPositionSizeListener());
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/MainApplet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplet.java	(revision 2875)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplet.java	(revision 2876)
@@ -10,5 +10,4 @@
 import java.awt.event.KeyEvent;
 import java.io.File;
-import java.io.IOException;
 import java.net.URL;
 import java.util.Arrays;
@@ -102,4 +101,5 @@
         Main.preConstructorInit(args);
         Main.parent = this;
+        Main.addListener();
 
         // initialize the plaform hook, and
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 2875)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 2876)
@@ -190,4 +190,5 @@
         JFrame mainFrame = new JFrame(tr("Java OpenStreetMap Editor"));
         Main.parent = mainFrame;
+        Main.addListener();
         final Main main = new MainApplication(mainFrame);
         monitor.worked(1);
@@ -201,8 +202,15 @@
         mainFrame.setVisible(true);
 
-        if (((!args.containsKey("no-maximize") && !args.containsKey("geometry")
-                && Main.pref.get("gui.geometry").length() == 0) || args.containsKey("maximize"))
-                && Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) {
-            mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
+        boolean maximized = Boolean.parseBoolean(Main.pref.get("gui.maximized"));
+        if ((!args.containsKey("no-maximize") && maximized) || args.containsKey("maximize")) {
+            if (Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) {
+                // Main.debug("Main window maximized");
+                Main.windowState = JFrame.MAXIMIZED_BOTH;
+                mainFrame.setExtendedState(Main.windowState);
+            } else {
+                Main.debug("Main window: maximizing not supported");
+            }
+        } else {
+            // Main.debug("Main window not maximized");
         }
 
