Added a standard -geometry command line option. Such an option is
actually already documented on the man page. 



git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4972 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/vncviewer/CMakeLists.txt b/vncviewer/CMakeLists.txt
index c1facc6..4348b85 100644
--- a/vncviewer/CMakeLists.txt
+++ b/vncviewer/CMakeLists.txt
@@ -45,13 +45,53 @@
   add_executable(vncviewer ${VNCVIEWER_SOURCES})
 endif()
 
-target_link_libraries(vncviewer rfb network rdr os Xregion ${FLTK_LIBRARIES} ${GETTEXT_LIBRARIES})
 
-# When building with GnuTLS, librdr depends on ws2_32, so in order to make
-# MinGW happy, we need to put ws2_32 in librdr's target_link_libraries string,
-# not here.
-if(NOT GNUTLS_FOUND AND WIN32)
-  target_link_libraries(vncviewer ws2_32)
+# XXX: Cendio hack
+#target_link_libraries(vncviewer rfb network rdr os Xregion ${FLTK_LIBRARIES} ${GETTEXT_LIBRARIES})
+#
+## When building with GnuTLS, librdr depends on ws2_32, so in order to make
+## MinGW happy, we need to put ws2_32 in librdr's target_link_libraries string,
+## not here.
+#if(NOT GNUTLS_FOUND AND WIN32)
+#  target_link_libraries(vncviewer ws2_32)
+#endif()
+
+target_link_libraries(vncviewer -nodefaultlibs rfb network rdr os Xregion)
+
+if(APPLE)
+  target_link_libraries(vncviewer "-framework Carbon" "-framework Cocoa" "-framework ApplicationServices")
+endif()
+
+if(UNIX AND NOT APPLE)
+  # Needed to load icon files
+  target_link_libraries(vncviewer -Wl,-Bstatic ${FLTK_IMAGES_LIBRARY} png -Wl,-Bdynamic)
+endif()
+
+target_link_libraries(vncviewer -Wl,-Bstatic ${FLTK_BASE_LIBRARY} -Wl,-Bdynamic)
+
+if(WIN32)
+  target_link_libraries(vncviewer -Wl,-Bstatic ${GETTEXT_LIBRARIES} ${ICONV_LIBRARIES} -Wl,-Bdynamic)
+elseif(APPLE)
+  target_link_libraries(vncviewer -Wl,-Bstatic ${GETTEXT_LIBRARIES} -Wl,-Bdynamic ${ICONV_LIBRARIES})
+else()
+  if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+    # XXX: Cendio hack: Add rpath to find libXfixes on Solaris without LD_LIBRARY_PATH.
+    # XXX: Cendio hack: libXft is broken on at least our servers
+    # XXX: Cendio hack: In theory, we must add freetype. However, in practice this does not work, since it is not found,
+    # since it's in /usr/sparc-sun-solaris2.10/sys-root/usr/sfw/lib/. It works if we DONT specify it, though. 
+    target_link_libraries(vncviewer ${X11_Xcursor_LIB} ${X11_Xfixes_LIB} /usr/sparc-sun-solaris2.10/sys-root/usr/X11/lib/libXinerama.so -Wl,-Bstatic Xft -Wl,-Bdynamic fontconfig Xext -R/usr/sfw/lib)
+  else()
+    target_link_libraries(vncviewer -Wl,-Bstatic ${X11_Xcursor_LIB} ${X11_Xfixes_LIB} Xft fontconfig expat freetype Xrender Xext Xinerama -Wl,-Bdynamic)
+  endif()
+  target_link_libraries(vncviewer X11 m )
+endif()
+
+target_link_libraries(vncviewer libstdc++.a gcc gcc_eh)
+
+if(WIN32)
+  target_link_libraries(vncviewer ws2_32 comctl32 mingw32 moldname mingwex msvcrt kernel32 gcc)
+else()
+  target_link_libraries(vncviewer c)
 endif()
 
 install(TARGETS vncviewer DESTINATION ${BIN_DIR})
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
index 463adf3..1693ab5 100644
--- a/vncviewer/DesktopWindow.cxx
+++ b/vncviewer/DesktopWindow.cxx
@@ -88,12 +88,42 @@
   } else
 #endif
   {
+
+    int geom_x = 0, geom_y = 0;
+    if (geometry.hasBeenSet()) {
+      int matched;
+      matched = sscanf(geometry.getValueStr(), "+%d+%d", &geom_x, &geom_y);
+      if (matched == 2) {
+	force_position(1);
+      } else {
+	int geom_w, geom_h;
+	matched = sscanf(geometry.getValueStr(), "%dx%d+%d+%d", &geom_w, &geom_h, &geom_x, &geom_y);
+	switch (matched) {
+	case 4:
+	  force_position(1);
+	  /* fall through */
+	case 2:
+	  w = geom_w;
+	  h = geom_h;
+	default:
+	  vlog.error("Invalid geometry specified!");	
+	}
+      }
+    }
+    
     // If we are creating a window which is equal to the size on the
     // screen on X11, many WMs will treat this as a legacy fullscreen
     // request. This is not what we want. Besides, it doesn't really
     // make sense to try to create a window which is larger than the
     // available work space. 
-    size(__rfbmin(w, Fl::w()), __rfbmin(h, Fl::h()));
+    w = __rfbmin(w, Fl::w());
+    h = __rfbmin(h, Fl::h());
+
+    if (force_position()) {
+      resize(geom_x, geom_y, w, h);
+    } else {
+      size(w, h);
+    }
   }
 
   show();
diff --git a/vncviewer/parameters.cxx b/vncviewer/parameters.cxx
index 4c5a3dd..9a3bcd2 100644
--- a/vncviewer/parameters.cxx
+++ b/vncviewer/parameters.cxx
@@ -100,6 +100,8 @@
 StringParameter desktopSize("DesktopSize",
                             "Reconfigure desktop size on the server on "
                             "connect (if possible)", "");
+StringParameter geometry("geometry",
+			 "Specify size and position of viewer window", "");
 BoolParameter remoteResize("RemoteResize",
                            "Dynamically resize the remote desktop size as "
                            "the size of the local client window changes. "
@@ -155,6 +157,7 @@
 #endif // HAVE_FLTK_FULLSCREEN_SCREENS
 #endif // HAVE_FLTK_FULLSCREEN
   &desktopSize,
+  &geometry,
   &remoteResize,
   &viewOnly,
   &shared,
diff --git a/vncviewer/parameters.h b/vncviewer/parameters.h
index 4fa989f..d7144a4 100644
--- a/vncviewer/parameters.h
+++ b/vncviewer/parameters.h
@@ -46,6 +46,7 @@
 #endif // HAVE_FLTK_FULLSCREEN_SCREENS
 #endif // HAVE_FLTK_FULLSCREEN
 extern rfb::StringParameter desktopSize;
+extern rfb::StringParameter geometry;
 extern rfb::BoolParameter remoteResize;
 
 extern rfb::BoolParameter viewOnly;