Skip to content

Commit

Permalink
Viewer: Disable scrollbar hotkeys if no scrollbars
Browse files Browse the repository at this point in the history
... or if keyboard grabbing is enabled.

Fixes #348
  • Loading branch information
dcommander committed Nov 22, 2022
1 parent dda6375 commit ccb77c5
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 24 deletions.
6 changes: 6 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ sequence, Mac users sometimes attempt to use Command-V with TurboVNC out of
habit, which caused view-only mode to be activated accidentally because of
3.0 beta1[28]. CTRL-ALT-SHIFT-V can still be used to toggle view-only mode.

8. The TurboVNC Viewer normally reserves CTRL-ALT-SHIFT-{arrow keys} as hotkeys
to move the horizontal and vertical scrollbars. However, those key sequences
are also used by Emacs and GNOME. Thus, the TurboVNC Viewer now sends those
key sequences to the server if no scrollbars are visible or if keyboard
grabbing is enabled.


3.0.1
=====
Expand Down
6 changes: 5 additions & 1 deletion java/com/turbovnc/vncviewer/DesktopWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,11 @@ public void keyPressed(KeyEvent e) {
case KeyEvent.VK_PAGE_DOWN:
case KeyEvent.VK_HOME:
case KeyEvent.VK_END:
return;
if (cc.viewport != null &&
(cc.viewport.sp.getHorizontalScrollBar().isVisible() ||
cc.viewport.sp.getVerticalScrollBar().isVisible()) &&
!VncViewer.isKeyboardGrabbed(cc.viewport))
return;
}
}
if ((e.getModifiersEx() & InputEvent.META_DOWN_MASK) ==
Expand Down
67 changes: 44 additions & 23 deletions java/com/turbovnc/vncviewer/Viewport.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 2012-2013, 2015-2021 D. R. Commander. All Rights Reserved.
/* Copyright (C) 2012-2013, 2015-2022 D. R. Commander. All Rights Reserved.
* Copyright (C) 2011-2013 Brian P. Hinz
* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
*
Expand Down Expand Up @@ -49,28 +49,7 @@ public Viewport(CConn cc_) {
sp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
sp.setViewportBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
sp.getViewport().setBackground(Color.BLACK);
InputMap im = sp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
int ctrlAltShiftMask = InputEvent.SHIFT_DOWN_MASK |
InputEvent.CTRL_DOWN_MASK |
InputEvent.ALT_DOWN_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");
}
setScrollBarHotkeysEnabled(true);
tb = new Toolbar(cc);
add(tb, BorderLayout.PAGE_START);
getContentPane().add(sp);
Expand Down Expand Up @@ -179,6 +158,9 @@ public void actionPerformed(ActionEvent e) {
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
sp.validate();
}
setScrollBarHotkeysEnabled((sp.getHorizontalScrollBar().isVisible() ||
sp.getVerticalScrollBar().isVisible()) &&
!VncViewer.isKeyboardGrabbed(cc.viewport));
if (cc.desktop.cursor != null) {
Cursor cursor = cc.desktop.cursor;
if (cursor.hotspot != null)
Expand Down Expand Up @@ -219,6 +201,42 @@ public void componentMoved(ComponentEvent e) {
lastEvent.deviceID = -1;
}

private void setScrollBarHotkeysEnabled(boolean enable) {
InputMap im = sp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
int ctrlAltShiftMask = InputEvent.SHIFT_DOWN_MASK |
InputEvent.CTRL_DOWN_MASK |
InputEvent.ALT_DOWN_MASK;
if (im == null) return;
if (enable) {
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");
} else {
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_UP, ctrlAltShiftMask));
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, ctrlAltShiftMask));
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ctrlAltShiftMask));
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ctrlAltShiftMask));
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, ctrlAltShiftMask));
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,
ctrlAltShiftMask));
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, ctrlAltShiftMask));
im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_END, ctrlAltShiftMask));
}
}

public Dimension getAvailableSize() {
Dimension availableSize = getSize();
if (!cc.opts.fullScreen) {
Expand Down Expand Up @@ -438,6 +456,9 @@ public void grabKeyboardHelper(boolean on, boolean force) {
return;
grabKeyboard(on, Params.grabPointer.getValue());
VncViewer.setGrabOwner(on ? this : null);
setScrollBarHotkeysEnabled((sp.getHorizontalScrollBar().isVisible() ||
sp.getVerticalScrollBar().isVisible()) &&
!on);
} catch (UnsatisfiedLinkError e) {
vlog.info("WARNING: Could not invoke grabKeyboard() from TurboVNC Helper.");
vlog.info(" Keyboard grabbing will be disabled.");
Expand Down

0 comments on commit ccb77c5

Please sign in to comment.