Re-introduces embedded applet mode for the java viewer. On Windows and Linux, the embedded applet can be dragged from the browser window and detached from the browser process. The mouse gesture for detaching the applet is ALT+drag on Windows and SHIFT+drag on Linux.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5149 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index dd01d9d..e48e93b 100644
--- a/java/com/tigervnc/vncviewer/CConn.java
+++ b/java/com/tigervnc/vncviewer/CConn.java
@@ -1,7 +1,7 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
* Copyright 2009-2013 Pierre Ossman <ossman@cendio.se> for Cendio AB
* Copyright (C) 2011-2013 D. R. Commander. All Rights Reserved.
- * Copyright (C) 2011-2013 Brian P. Hinz
+ * Copyright (C) 2011-2014 Brian P. Hinz
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -56,9 +56,9 @@
import com.tigervnc.network.Socket;
import com.tigervnc.network.TcpSocket;
-public class CConn extends CConnection
- implements UserPasswdGetter, UserMsgBox, OptionsDialogCallback, FdInStreamBlockCallback
-{
+public class CConn extends CConnection implements
+ UserPasswdGetter, UserMsgBox, OptionsDialogCallback,
+ FdInStreamBlockCallback, ActionListener {
public final PixelFormat getPreferredPF() { return fullColourPF; }
static final PixelFormat verylowColourPF =
@@ -265,7 +265,56 @@
cp.setPF(pendingPF);
pendingPFChange = false;
- recreateViewport();
+ if (viewer.embed.getValue()) {
+ desktop.setScaledSize();
+ setupEmbeddedFrame();
+ } else {
+ recreateViewport();
+ }
+ }
+
+ void setupEmbeddedFrame() {
+ UIManager.getDefaults().put("ScrollPane.ancestorInputMap",
+ new UIDefaults.LazyInputMap(new Object[]{}));
+ JScrollPane sp = new JScrollPane();
+ sp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ sp.getViewport().setBackground(Color.BLACK);
+ InputMap im = sp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+ int ctrlAltShiftMask = Event.SHIFT_MASK | Event.CTRL_MASK | Event.ALT_MASK;
+ if (im != null) {
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, ctrlAltShiftMask),
+ "unitScrollUp");
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, ctrlAltShiftMask),
+ "unitScrollDown");
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ctrlAltShiftMask),
+ "unitScrollLeft");
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ctrlAltShiftMask),
+ "unitScrollRight");
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, ctrlAltShiftMask),
+ "scrollUp");
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, ctrlAltShiftMask),
+ "scrollDown");
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, ctrlAltShiftMask),
+ "scrollLeft");
+ im.put(KeyStroke.getKeyStroke(KeyEvent.VK_END, ctrlAltShiftMask),
+ "scrollRight");
+ }
+ sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
+ sp.getViewport().setView(desktop);
+ viewer.getContentPane().removeAll();
+ viewer.add(sp);
+ viewer.addFocusListener(new FocusAdapter() {
+ public void focusGained(FocusEvent e) {
+ if (desktop.isAncestorOf(viewer))
+ desktop.requestFocus();
+ }
+ public void focusLost(FocusEvent e) {
+ releaseModifiers();
+ }
+ });
+ viewer.validate();
+ desktop.requestFocus();
}
// setDesktopSize() is called when the desktop size changes (including when
@@ -487,15 +536,28 @@
return;
desktop.resize();
- recreateViewport();
+ if (viewer.embed.getValue()) {
+ desktop.setScaledSize();
+ setupEmbeddedFrame();
+ } else {
+ recreateViewport();
+ }
+ }
+
+ public void setEmbeddedFeatures(boolean s) {
+ menu.fullScreen.setEnabled(s);
+ menu.newConn.setEnabled(s);
+ options.fullScreen.setEnabled(s);
+ options.scalingFactor.setEnabled(s);
}
// recreateViewport() recreates our top-level window. This seems to be
// better than attempting to resize the existing window, at least with
// various X window managers.
- private void recreateViewport()
- {
+ public void recreateViewport() {
+ if (viewer.embed.getValue())
+ return;
if (viewport != null) viewport.dispose();
viewport = new Viewport(cp.name(), this);
viewport.setUndecorated(fullScreen);
@@ -506,8 +568,7 @@
desktop.requestFocusInWindow();
}
- private void reconfigureViewport()
- {
+ private void reconfigureViewport() {
//viewport.setMaxSize(cp.width, cp.height);
boolean pack = true;
Dimension dpySize = viewport.getToolkit().getScreenSize();
@@ -680,6 +741,14 @@
// close() shuts down the socket, thus waking up the RFB thread.
public void close() {
+ if (closeListener != null) {
+ viewer.embed.setParam(true);
+ if (VncViewer.nViewers == 1) {
+ JFrame f = (JFrame)JOptionPane.getFrameForComponent(viewer);
+ if (f != null)
+ f.dispatchEvent(new WindowEvent(f, WindowEvent.WINDOW_CLOSING));
+ }
+ }
deleteWindow();
shuttingDown = true;
try {
@@ -723,7 +792,7 @@
JOptionPane op =
new JOptionPane(msg, JOptionPane.INFORMATION_MESSAGE,
JOptionPane.DEFAULT_OPTION, VncViewer.logoIcon);
- JDialog dlg = op.createDialog("About TigerVNC Viewer for Java");
+ JDialog dlg = op.createDialog(desktop, "About TigerVNC Viewer for Java");
dlg.setIconImage(VncViewer.frameIcon);
dlg.setVisible(true);
if (fullScreenWindow != null)
@@ -758,7 +827,7 @@
csecurity.description());
JOptionPane op = new JOptionPane(msg, JOptionPane.PLAIN_MESSAGE,
JOptionPane.DEFAULT_OPTION);
- JDialog dlg = op.createDialog("VNC connection info");
+ JDialog dlg = op.createDialog(desktop, "VNC connection info");
dlg.setIconImage(VncViewer.frameIcon);
dlg.setVisible(true);
if (fullScreenWindow != null)
@@ -1134,6 +1203,8 @@
}
public void toggleFullScreen() {
+ if (viewer.embed.getValue())
+ return;
fullScreen = !fullScreen;
menu.fullScreen.setSelected(fullScreen);
if (viewport != null) {
@@ -1319,6 +1390,13 @@
writeKeyEvent(Keysyms.Super_R, true);
}
+ // this is a special ActionListener passed in by the
+ // Java Plug-in software to control applet's close behavior
+ public void setCloseListener(ActionListener cl) {
+ closeListener = cl;
+ }
+
+ public void actionPerformed(ActionEvent e) {}
////////////////////////////////////////////////////////////////////
// The following methods are called from both RFB and GUI threads
@@ -1401,6 +1479,7 @@
private boolean autoSelect;
boolean fullScreen;
private HashMap<Integer, Integer> downKeySym;
+ public ActionListener closeListener = null;
static LogWriter vlog = new LogWriter("CConn");
}
diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java
index 3dc4c25..4749eb2 100644
--- a/java/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/com/tigervnc/vncviewer/DesktopWindow.java
@@ -2,7 +2,7 @@
* Copyright (C) 2006 Constantin Kaplinsky. All Rights Reserved.
* Copyright (C) 2009 Paul Donohue. All Rights Reserved.
* Copyright (C) 2010, 2012-2013 D. R. Commander. All Rights Reserved.
- * Copyright (C) 2011-2013 Brian P. Hinz
+ * Copyright (C) 2011-2014 Brian P. Hinz
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -426,7 +426,10 @@
public void mouseReleased(MouseEvent e) { mouseCB(e); }
public void mousePressed(MouseEvent e) { mouseCB(e); }
public void mouseClicked(MouseEvent e) {}
- public void mouseEntered(MouseEvent e) {}
+ public void mouseEntered(MouseEvent e) {
+ if (cc.viewer.embed.getValue())
+ requestFocus();
+ }
public void mouseExited(MouseEvent e) {}
// MouseWheel callback function
diff --git a/java/com/tigervnc/vncviewer/F8Menu.java b/java/com/tigervnc/vncviewer/F8Menu.java
index 543f740..5045b77 100644
--- a/java/com/tigervnc/vncviewer/F8Menu.java
+++ b/java/com/tigervnc/vncviewer/F8Menu.java
@@ -1,5 +1,5 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
- * Copyright (C) 2011 Brian P. Hinz
+ * Copyright (C) 2011-2014 Brian P. Hinz
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -49,6 +49,7 @@
fullScreen.setMnemonic(KeyEvent.VK_F);
fullScreen.setSelected(cc.fullScreen);
fullScreen.addActionListener(this);
+ fullScreen.setEnabled(!cc.viewer.embed.getValue());
add(fullScreen);
addSeparator();
clipboard = addMenuItem("Clipboard...");
@@ -59,6 +60,7 @@
refresh = addMenuItem("Refresh Screen", KeyEvent.VK_H);
addSeparator();
newConn = addMenuItem("New connection...", KeyEvent.VK_W);
+ newConn.setEnabled(!cc.viewer.embed.getValue());
options = addMenuItem("Options...", KeyEvent.VK_O);
save = addMenuItem("Save connection info as...", KeyEvent.VK_S);
info = addMenuItem("Connection info...", KeyEvent.VK_I);
diff --git a/java/com/tigervnc/vncviewer/OptionsDialog.java b/java/com/tigervnc/vncviewer/OptionsDialog.java
index 3d73d4c..24c7b0e 100644
--- a/java/com/tigervnc/vncviewer/OptionsDialog.java
+++ b/java/com/tigervnc/vncviewer/OptionsDialog.java
@@ -1,5 +1,5 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
- * Copyright (C) 2011-2012 Brian P. Hinz
+ * Copyright (C) 2011-2014 Brian P. Hinz
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@
// Static variables
static LogWriter vlog = new LogWriter("OptionsDialog");
- OptionsDialogCallback cb;
+ CConn cc;
JPanel FormatPanel, InputsPanel, MiscPanel, DefaultsPanel, SecPanel;
JCheckBox autoSelect, customCompressLevel, noJpeg;
@SuppressWarnings({"rawtypes"})
@@ -53,9 +53,9 @@
JButton cfLoadButton, cfSaveAsButton, defSaveButton, defReloadButton, defClearButton;
@SuppressWarnings({"rawtypes","unchecked"})
- public OptionsDialog(OptionsDialogCallback cb_) {
+ public OptionsDialog(CConn cc_) {
super(true);
- cb = cb_;
+ cc = cc_;
setResizable(false);
setTitle("VNC Viewer Options");
@@ -149,6 +149,7 @@
fullScreen = new JCheckBox("Full-screen mode");
fullScreen.addItemListener(this);
+ fullScreen.setEnabled(!cc.viewer.embed.getValue());
shared = new JCheckBox("Shared connection (do not disconnect other viewers)");
shared.addItemListener(this);
useLocalCursor = new JCheckBox("Render cursor locally");
@@ -172,6 +173,7 @@
}
scalingFactor.setEditable(true);
scalingFactor.addItemListener(this);
+ scalingFactor.setEnabled(!cc.viewer.embed.getValue());
addGBComponent(fullScreen,MiscPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5));
addGBComponent(shared,MiscPanel, 0, 1, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5));
addGBComponent(useLocalCursor,MiscPanel, 0, 2, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5));
@@ -205,7 +207,6 @@
addGBComponent(configPanel,DefaultsPanel, 0, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,5,4,5));
addGBComponent(defaultsPanel,DefaultsPanel, 1, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,0,4,5));
- //defReloadButton.setEnabled(!applet);
// security tab
SecPanel=new JPanel(new GridBagLayout());
@@ -278,7 +279,7 @@
}
public void initDialog() {
- if (cb != null) cb.setOptions();
+ if (cc != null) cc.setOptions();
zrle.setEnabled(!autoSelect.isSelected());
hextile.setEnabled(!autoSelect.isSelected());
tight.setEnabled(!autoSelect.isSelected());
@@ -472,7 +473,6 @@
public void endDialog() {
super.endDialog();
- CConn cc = (CConn)cb;
if (cc.viewport != null && cc.viewport.isVisible()) {
cc.viewport.toFront();
cc.viewport.requestFocus();
@@ -482,7 +482,7 @@
public void actionPerformed(ActionEvent e) {
Object s = e.getSource();
if (s instanceof JButton && (JButton)s == okButton) {
- if (cb != null) cb.getOptions();
+ if (cc != null) cc.getOptions();
endDialog();
} else if (s instanceof JButton && (JButton)s == cancelButton) {
endDialog();
@@ -496,7 +496,7 @@
String filename = fc.getSelectedFile().toString();
if (filename != null)
Configuration.load(filename);
- cb.setOptions();
+ cc.setOptions();
}
} else if (s instanceof JButton && (JButton)s == cfSaveAsButton) {
JFileChooser fc = new JFileChooser();
@@ -516,7 +516,7 @@
restorePreferences();
} else if (s instanceof JButton && (JButton)s == defClearButton) {
UserPreferences.clear();
- cb.setOptions();
+ cc.setOptions();
} else if (s instanceof JButton && (JButton)s == ca) {
JFileChooser fc = new JFileChooser(new File(CSecurityTLS.getDefaultCA()));
fc.setDialogTitle("Path to X509 CA certificate");
diff --git a/java/com/tigervnc/vncviewer/README b/java/com/tigervnc/vncviewer/README
index 196df40..446bbf9 100644
--- a/java/com/tigervnc/vncviewer/README
+++ b/java/com/tigervnc/vncviewer/README
@@ -13,6 +13,7 @@
Copyright (C) 2005 Martin Koegler
Copyright (C) 2009 Pierre Ossman for Cendio AB
Copyright (C) 2009-2013 TigerVNC Team
+ Copyright (C) 2011-2014 Brian P. Hinz
All rights reserved.
This software is distributed under the GNU General Public Licence as
@@ -46,6 +47,10 @@
Java Viewer by simply copying a new version of VncViewer.jar and/or
index.vnc into the VNC classes directory.
+ On Windows and Linux, the embedded applet can be drag-undocked from the
+ browser window and converted to a standalone application. The drag
+ gesture ALT+drag on Windows, and SHIFT+drag on Linux.
+
In the case of the Windows TigerVNC Server, VncViewer.jar and index.vnc
are embedded as resources in the WinVNC executable, so deploying a
modified version of the TigerVNC Java Viewer on a Windows server requires
diff --git a/java/com/tigervnc/vncviewer/Viewport.java b/java/com/tigervnc/vncviewer/Viewport.java
index f43f592..19c51c9 100644
--- a/java/com/tigervnc/vncviewer/Viewport.java
+++ b/java/com/tigervnc/vncviewer/Viewport.java
@@ -1,5 +1,5 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
- * Copyright (C) 2011-2013 Brian P. Hinz
+ * Copyright (C) 2011-2014 Brian P. Hinz
* Copyright (C) 2012-2013 D. R. Commander. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
@@ -64,7 +64,11 @@
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if (VncViewer.nViewers == 1) {
- cc.viewer.exit(1);
+ if (cc.closeListener != null) {
+ cc.close();
+ } else {
+ cc.viewer.exit(1);
+ }
} else {
cc.close();
}
@@ -163,19 +167,19 @@
}
public static Window getFullScreenWindow() {
- GraphicsEnvironment ge =
- GraphicsEnvironment.getLocalGraphicsEnvironment();
- GraphicsDevice gd = ge.getDefaultScreenDevice();
- Window fullScreenWindow = gd.getFullScreenWindow();
- return fullScreenWindow;
+ GraphicsEnvironment ge =
+ GraphicsEnvironment.getLocalGraphicsEnvironment();
+ GraphicsDevice gd = ge.getDefaultScreenDevice();
+ Window fullScreenWindow = gd.getFullScreenWindow();
+ return fullScreenWindow;
}
public static void setFullScreenWindow(Window fullScreenWindow) {
- GraphicsEnvironment ge =
- GraphicsEnvironment.getLocalGraphicsEnvironment();
- GraphicsDevice gd = ge.getDefaultScreenDevice();
- if (gd.isFullScreenSupported())
- gd.setFullScreenWindow(fullScreenWindow);
+ GraphicsEnvironment ge =
+ GraphicsEnvironment.getLocalGraphicsEnvironment();
+ GraphicsDevice gd = ge.getDefaultScreenDevice();
+ if (gd.isFullScreenSupported())
+ gd.setFullScreenWindow(fullScreenWindow);
}
CConn cc;
diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java
index 8a1f930..e63ec3b 100644
--- a/java/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/com/tigervnc/vncviewer/VncViewer.java
@@ -1,7 +1,7 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB
* Copyright (C) 2011-2013 D. R. Commander. All Rights Reserved.
- * Copyright (C) 2011-2013 Brian P. Hinz
+ * Copyright (C) 2011-2014 Brian P. Hinz
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -31,6 +31,7 @@
package com.tigervnc.vncviewer;
import java.awt.*;
+import java.awt.event.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
@@ -49,8 +50,9 @@
import com.tigervnc.rfb.*;
import com.tigervnc.network.*;
-public class VncViewer extends java.applet.Applet implements Runnable
-{
+public class VncViewer extends javax.swing.JApplet
+ implements Runnable, ActionListener {
+
public static final String aboutText = new String("TigerVNC Java Viewer v%s (%s)%n"+
"Built on %s at %s%n"+
"Copyright (C) 1999-2013 TigerVNC Team and many others (see README.txt)%n"+
@@ -122,7 +124,7 @@
public VncViewer(String[] argv) {
- applet = false;
+ embed.setParam(false);
// load user preferences
UserPreferences.load("global");
@@ -268,12 +270,12 @@
public VncViewer() {
UserPreferences.load("global");
- applet = true;
+ embed.setParam(true);
}
public static void newViewer(VncViewer oldViewer, Socket sock, boolean close) {
VncViewer viewer = new VncViewer();
- viewer.applet = oldViewer.applet;
+ viewer.embed.setParam(oldViewer.embed.getValue());
viewer.sock = sock;
viewer.start();
if (close)
@@ -288,8 +290,56 @@
newViewer(oldViewer, null);
}
+ public boolean isAppletDragStart(MouseEvent e) {
+ if(e.getID() == MouseEvent.MOUSE_DRAGGED) {
+ // Drag undocking on Mac works, but introduces a host of
+ // problems so disable it for now.
+ if (os.startsWith("mac os x"))
+ return false;
+ else if (os.startsWith("windows"))
+ return (e.getModifiersEx() & MouseEvent.ALT_DOWN_MASK) != 0;
+ else
+ return (e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0;
+ } else {
+ return false;
+ }
+ }
+
+ public void appletDragStarted() {
+ embed.setParam(false);
+ cc.recreateViewport();
+ JFrame f = (JFrame)JOptionPane.getFrameForComponent(this);
+ // The default JFrame created by the drag event will be
+ // visible briefly between appletDragStarted and Finished.
+ if (f != null)
+ f.setSize(0, 0);
+ }
+
+ public void appletDragFinished() {
+ cc.setEmbeddedFeatures(true);
+ JFrame f = (JFrame)JOptionPane.getFrameForComponent(this);
+ if (f != null)
+ f.dispose();
+ }
+
+ public void setAppletCloseListener(ActionListener cl) {
+ cc.setCloseListener(cl);
+ }
+
+ public void appletRestored() {
+ cc.setEmbeddedFeatures(false);
+ cc.setCloseListener(null);
+ }
+
public void init() {
vlog.debug("init called");
+ Container parent = getParent();
+ while (!parent.isFocusCycleRoot()) {
+ parent = parent.getParent();
+ }
+ ((Frame)parent).setModalExclusionType(null);
+ parent.setFocusable(false);
+ parent.setFocusTraversalKeysEnabled(false);
setLookAndFeel();
setBackground(Color.white);
}
@@ -310,9 +360,11 @@
public void start() {
vlog.debug("start called");
getTimestamp();
- if (applet && nViewers == 0) {
+ if (embed.getValue() && nViewers == 0) {
alwaysShowServerDialog.setParam(true);
Configuration.global().readAppletParams(this);
+ fullScreen.setParam(false);
+ scalingFactor.setParam("100");
String host = getCodeBase().getHost();
if (vncServerName.getValue() == null && vncServerPort.getValue() != 0) {
int port = vncServerPort.getValue();
@@ -330,22 +382,48 @@
nViewers--;
if (nViewers > 0)
return;
- if (applet) {
+ if (embed.getValue())
destroy();
- } else {
+ else
System.exit(n);
+ }
+
+ // If "Reconnect" button is pressed
+ public void actionPerformed(ActionEvent e) {
+ getContentPane().removeAll();
+ start();
+ }
+
+ void reportException(java.lang.Exception e) {
+ String title, msg = e.getMessage();
+ int msgType = JOptionPane.ERROR_MESSAGE;
+ title = "TigerVNC Viewer : Error";
+ e.printStackTrace();
+ if (embed.getValue()) {
+ getContentPane().removeAll();
+ JLabel label = new JLabel("<html><center><b>" + title + "</b><p><i>" +
+ msg + "</i></center></html>", JLabel.CENTER);
+ label.setFont(new Font("Helvetica", Font.PLAIN, 24));
+ label.setMaximumSize(new Dimension(getSize().width, 100));
+ label.setVerticalAlignment(JLabel.CENTER);
+ label.setAlignmentX(Component.CENTER_ALIGNMENT);
+ JButton button = new JButton("Reconnect");
+ button.addActionListener(this);
+ button.setMaximumSize(new Dimension(200, 30));
+ button.setAlignmentX(Component.CENTER_ALIGNMENT);
+ setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
+ add(label);
+ add(button);
+ validate();
+ repaint();
+ } else {
+ JOptionPane.showMessageDialog(null, msg, title, msgType);
}
}
- public void paint(Graphics g) {
- g.drawImage(logoImage, 0, 0, this);
- int h = logoImage.getHeight(this)+20;
- g.drawString(String.format(aboutText, version, build,
- buildDate, buildTime), 0, h);
- }
-
+ CConn cc;
public void run() {
- CConn cc = null;
+ cc = null;
if (listenMode.getValue()) {
int port = 5500;
@@ -358,7 +436,7 @@
try {
listener = new TcpListener(null, port);
} catch (java.lang.Exception e) {
- System.out.println(e.toString());
+ reportException(e);
exit(1);
}
@@ -376,18 +454,14 @@
while (!cc.shuttingDown)
cc.processMsg();
} catch (java.lang.Exception e) {
- if (e instanceof EndOfStream) {
- vlog.info(e.getMessage());
- } else if (cc == null || !cc.shuttingDown) {
- e.printStackTrace();
- JOptionPane op =
- new JOptionPane(e.getMessage(), JOptionPane.WARNING_MESSAGE);
- JDialog dlg = op.createDialog("TigerVNC Viewer");
- dlg.setIconImage(frameIcon);
- dlg.setVisible(true);
+ if (cc == null || !cc.shuttingDown) {
+ reportException(e);
+ if (cc != null)
+ cc.deleteWindow();
+ exit(1);
+ } else if (embed.getValue()) {
+ reportException(new java.lang.Exception("Connection closed"));
} else {
- if (!cc.shuttingDown)
- vlog.info(e.toString());
cc = null;
}
}
@@ -400,6 +474,13 @@
static BoolParameter noLionFS
= new BoolParameter("NoLionFS", null, false);
+ BoolParameter embed
+ = new BoolParameter("Embed",
+ "If the viewer is being run as an applet, display its output to " +
+ "an embedded frame in the browser window rather than to a dedicated " +
+ "window. This also has the effect of setting FullScreen=0, and Scale=100.",
+ false);
+
BoolParameter useLocalCursor
= new BoolParameter("UseLocalCursor",
"Render the mouse cursor locally",
@@ -568,7 +649,6 @@
Thread thread;
Socket sock;
- boolean applet;
static int nViewers;
static LogWriter vlog = new LogWriter("main");
}
diff --git a/java/com/tigervnc/vncviewer/index.vnc b/java/com/tigervnc/vncviewer/index.vnc
index e889987..27bdebc 100644
--- a/java/com/tigervnc/vncviewer/index.vnc
+++ b/java/com/tigervnc/vncviewer/index.vnc
@@ -14,6 +14,8 @@
<APPLET CODE=com.tigervnc.vncviewer.VncViewer ARCHIVE=VncViewer.jar
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
<param name=PORT value=$PORT>
+<param name="Embed" value="true">
+<param name="draggable" value="true">
</APPLET>
<BR>
<A href="http://www.tigervnc.org/">TigerVNC site</A>