summaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/com/tigervnc/vncviewer/CConn.java103
-rw-r--r--java/com/tigervnc/vncviewer/DesktopWindow.java7
-rw-r--r--java/com/tigervnc/vncviewer/F8Menu.java4
-rw-r--r--java/com/tigervnc/vncviewer/OptionsDialog.java20
-rw-r--r--java/com/tigervnc/vncviewer/README5
-rw-r--r--java/com/tigervnc/vncviewer/Viewport.java28
-rw-r--r--java/com/tigervnc/vncviewer/VncViewer.java138
-rw-r--r--java/com/tigervnc/vncviewer/index.vnc2
8 files changed, 241 insertions, 66 deletions
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index dd01d9db..e48e93b2 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.rfb.Exception;
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 @@ public class CConn extends CConnection
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 @@ public class CConn extends CConnection
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 @@ public class CConn extends CConnection
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 @@ public class CConn extends CConnection
// 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 @@ public class CConn extends CConnection
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 @@ public class CConn extends CConnection
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 class CConn extends CConnection
}
public void toggleFullScreen() {
+ if (viewer.embed.getValue())
+ return;
fullScreen = !fullScreen;
menu.fullScreen.setSelected(fullScreen);
if (viewport != null) {
@@ -1319,6 +1390,13 @@ public class CConn extends CConnection
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 @@ public class CConn extends CConnection
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 3dc4c25a..4749eb2a 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 @@ class DesktopWindow extends JPanel implements Runnable, MouseListener,
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 543f7408..5045b77f 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 @@ public class F8Menu extends JPopupMenu implements ActionListener {
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 @@ public class F8Menu extends JPopupMenu implements ActionListener {
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 3d73d4c3..24c7b0e0 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 @@ class OptionsDialog extends Dialog implements
// 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 @@ class OptionsDialog extends Dialog implements
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 @@ class OptionsDialog extends Dialog implements
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 @@ class OptionsDialog extends Dialog implements
}
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 @@ class OptionsDialog extends Dialog implements
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 @@ class OptionsDialog extends Dialog implements
}
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 @@ class OptionsDialog extends Dialog implements
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 @@ class OptionsDialog extends Dialog implements
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 @@ class OptionsDialog extends Dialog implements
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 @@ class OptionsDialog extends Dialog implements
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 196df40f..446bbf96 100644
--- a/java/com/tigervnc/vncviewer/README
+++ b/java/com/tigervnc/vncviewer/README
@@ -13,6 +13,7 @@ optimizations, major GUI improvements, and more.
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 @@ There are three basic ways to use the TigerVNC Java Viewer:
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 f43f592d..19c51c94 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 @@ public class Viewport extends JFrame
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 class Viewport extends JFrame
}
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 8a1f930e..e63ec3b1 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.rdr.*;
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 class VncViewer extends java.applet.Applet implements Runnable
public VncViewer(String[] argv) {
- applet = false;
+ embed.setParam(false);
// load user preferences
UserPreferences.load("global");
@@ -268,12 +270,12 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
nViewers--;
if (nViewers > 0)
return;
- if (applet) {
+ if (embed.getValue())
destroy();
- } else {
+ else
System.exit(n);
- }
}
- 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);
+ // 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);
+ }
+ }
+
+ CConn cc;
public void run() {
- CConn cc = null;
+ cc = null;
if (listenMode.getValue()) {
int port = 5500;
@@ -358,7 +436,7 @@ public class VncViewer extends java.applet.Applet implements Runnable
try {
listener = new TcpListener(null, port);
} catch (java.lang.Exception e) {
- System.out.println(e.toString());
+ reportException(e);
exit(1);
}
@@ -376,18 +454,14 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 e8899875..27bdebcb 100644
--- a/java/com/tigervnc/vncviewer/index.vnc
+++ b/java/com/tigervnc/vncviewer/index.vnc
@@ -14,6 +14,8 @@ $USER's $DESKTOP desktop ($DISPLAY)
<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>