Index: src/orca/mag.py
===================================================================
--- src/orca/mag.py	(revision 3001)
+++ src/orca/mag.py	(working copy)
@@ -115,6 +115,10 @@
 #
 _pollMouseDisabled = False
 
+# Whether or not composite is being used.
+#
+_fullScreenCapable = True
+
 def __setROI(rect):
     """Sets the region of interest.
 
@@ -297,6 +301,7 @@
     global _maxROIX
     global _maxROIY
     global _pollMouseDisabled
+    global _fullScreenCapable
 
     ########################################################################
     #                                                                      #
@@ -320,13 +325,54 @@
     except:
         pass
 
+    # Find out where the user wants to place the target display.
+    #
+    prefLeft   = settings.magZoomerLeft
+    prefTop    = settings.magZoomerTop
+    prefRight  = settings.magZoomerRight
+    prefBottom = settings.magZoomerBottom
+
+    # Find out if we're using composite.
+    #
+    try:
+        _fullScreenCapable = _magnifier.fullScreenCapable()
+    except:
+        debug.printException(debug.LEVEL_OFF)
+
+    # If we're not using composite, bad things will happen if we allow the
+    # target display to occupy more than 50% of the full screen.  Also, if
+    # it occupies the same space as something that should be magnified (e.g.
+    # the Applications menu), that item will not be magnified. Therefore,
+    # we're going to prefer the right half of the screen for the target
+    # display.
+    #
+    magnifierPBag = _magnifier.getProperties()
+    if not _fullScreenCapable \
+       and _magnifier.SourceDisplay == _magnifier.TargetDisplay:
+        try:
+            sdb = magnifierPBag.getValue("source-display-bounds").value()
+            sourceArea = (sdb.x2 - sdb.x1) * (sdb.y2 - sdb.y1)
+            prefArea = (prefRight - prefLeft) * (prefBottom - prefTop)
+            if prefArea > sourceArea/2:
+                debug.println(
+                    debug.LEVEL_WARNING,
+                    "Composite is not being used. The preferred target\n" \
+                    "area is greater than 50% of the total area of the\n" \
+                    "display. These settings can render the contents of\n" \
+                    "the screen inaccessible. Setting the target display\n" \
+                    "so that it occupies the right half of the screen.")
+                prefRight  = sdb.x2
+                prefLeft   = sdb.x2/2
+                prefTop    = sdb.y1
+                prefBottom = sdb.y2
+        except:
+            debug.printException(debug.LEVEL_OFF)
+
     # Now, tell the magnifier where we want it to live on the target display.
     # The coordinates are in screen coordinates of the target display.
     # This will have the side effect of setting up other stuff for us, such
     # as source-display-bouinds.
     #
-    magnifierPBag = _magnifier.getProperties()
-
     try:
         tdb = magnifierPBag.getValue("target-display-bounds").value()
         magnifierPBag.setValue(
@@ -334,10 +380,10 @@
             atspi.ORBit.CORBA.Any(
                 atspi.ORBit.CORBA.TypeCode(
                     tdb.__typecode__.repo_id),
-                GNOME.Magnifier.RectBounds(settings.magZoomerLeft,
-                                           settings.magZoomerTop,
-                                           settings.magZoomerRight,
-                                           settings.magZoomerBottom)))
+                GNOME.Magnifier.RectBounds(prefLeft,
+                                           prefTop,
+                                           prefRight,
+                                           prefBottom)))
     except:
         debug.printException(debug.LEVEL_OFF)
 
