LookingGlass/client
Tudor Brindus 4bceaf5505 [client] fix hang in eglSwapBuffers when exiting while not visible
eglSwapBuffers is allowed to block when called with a nonzero interval
parameter. On Wayland, Mesa will block until a frame callback arrives.
If an application is not visible, a compositor is free to not schedule
frame callbacks (in order to save CPU time rendering something that is
entirely invisible).

Currently, starting Looking Glass from a terminal, hiding it
entirely, and sending ^C will cause Looking Glass to hang joining the
render thread until the window is made visible again.

Calling eglDestroySurface is insufficient to unblock eglSwapBuffers, as
it attempts to grab the same underlying mutex.

Instead, this commit makes it so that we pass a 0 interval to
eglSwapBuffers when running on Wayland, such that we don't block waiting
for a frame callback. This is not entirely ideal as it *does* mean
Looking Glass submits buffers while hidden, but it seems better than
hanging on exit.

It also forces opengl:vsync and egl:vsync flags to off when running on
Wayland, as they are meaningless there.
2021-01-04 14:43:21 +11:00
..
clipboards [client] added streaming clipboard support for large transfers 2020-12-03 12:01:51 +11:00
cmake [client] egl: move shaders into seperate files and build into objects 2019-03-28 14:59:54 +11:00
decoders [build] make "common" a static library (part 2/2) 2019-04-11 11:12:59 +10:00
fonts [build] make "common" a static library (part 2/2) 2019-04-11 11:12:59 +10:00
include [client] reworked the mouse tracking logic 2020-12-04 00:32:28 +11:00
parsers [all] update copyright dates 2019-02-22 22:16:14 +11:00
renderers [client] fix hang in eglSwapBuffers when exiting while not visible 2021-01-04 14:43:21 +11:00
src [client] fix Wayland detection logic 2021-01-04 14:43:21 +11:00
CMakeLists.txt [all] pass the project path to the version.cmake script 2020-10-09 02:51:28 +11:00
DEBUGGING.md [doc] Fix formatting 2018-05-23 08:46:03 +10:00
README.md [client] set default opengl:vsync=off 2021-01-04 14:43:21 +11:00

Looking Glass Client

This is the Looking Glass client application that is designed to work in tandem with the Looking Glass Host application


Building the Application

Build Dependencies

  • binutils-dev
  • cmake
  • fonts-freefont-ttf
  • libsdl2-dev
  • libsdl2-ttf-dev
  • libspice-protocol-dev
  • libfontconfig1-dev
  • libx11-dev
  • nettle-dev

Debian (and maybe Ubuntu)

apt-get install binutils-dev cmake fonts-freefont-ttf libsdl2-dev libsdl2-ttf-dev libspice-protocol-dev libfontconfig1-dev libx11-dev nettle-dev

Building

mkdir build
cd build
cmake ../
make

Should this all go well you should be left with the file looking-glass-client


Usage Tips

Key Bindings

By default Looking Glass uses the Scroll Lock key as the escape key for commands as well as the input capture mode toggle, this can be changed using the -m switch if you desire a different key. Below are a list of current key bindings:

Command Description
ScrLk Toggle cursor screen capture
ScrLk+F Full Screen toggle
ScrLk+V Video stream toggle
ScrLk+I Spice keyboard & mouse enable toggle
ScrLk+N Toggle night vision mode (EGL renderer only!)
ScrLk+Q Quit
ScrLk+Insert Increase mouse sensitivity (in capture mode only)
ScrLk+Del Decrease mouse sensitivity (in capture mode only)
ScrLk+F1 Send Ctrl+Alt+F1 to the guest
ScrLk+F2 Send Ctrl+Alt+F2 to the guest
ScrLk+F3 Send Ctrl+Alt+F3 to the guest
ScrLk+F4 Send Ctrl+Alt+F4 to the guest
ScrLk+F5 Send Ctrl+Alt+F5 to the guest
ScrLk+F6 Send Ctrl+Alt+F6 to the guest
ScrLk+F7 Send Ctrl+Alt+F7 to the guest
ScrLk+F8 Send Ctrl+Alt+F8 to the guest
ScrLk+F9 Send Ctrl+Alt+F9 to the guest
ScrLk+F10 Send Ctrl+Alt+F10 to the guest
ScrLk+F11 Send Ctrl+Alt+F11 to the guest
ScrLk+F12 Send Ctrl+Alt+F12 to the guest

Setting options via command line arguments

The syntax is simple: module:name=value, for example:

./looking-glass-client win:fullScreen=yes egl:nvGain=1

Setting options via configuration files

By default the application will look for and load the config files in the following locations

  • /etc/looking-glass-client.ini
  • ~/.looking-glass-client.ini

The format of this file is the commonly known INI format, for example:

[win]
fullScreen=yes

[egl]
nvGain=1

Command line arguments will override any options loaded from the config files.

Supported options

|-------------------------------------------------------------------------------------------------------------------------|
| Long                   | Short | Value                  | Description                                                   |
|-------------------------------------------------------------------------------------------------------------------------|
| app:configFile         | -C    | NULL                   | A file to read additional configuration from                  |
| app:shmFile            | -f    | /dev/shm/looking-glass | The path to the shared memory file                            |
| app:shmSize            | -L    | 0                      | Specify the size in MB of the shared memory file (0 = detect) |
| app:renderer           | -g    | auto                   | Specify the renderer to use                                   |
| app:license            | -l    | no                     | Show the license for this application and then terminate      |
| app:cursorPollInterval |       | 1000                   | How often to check for a cursor update in microseconds        |
| app:framePollInterval  |       | 1000                   | How often to check for a frame update in microseconds         |
|-------------------------------------------------------------------------------------------------------------------------|

|-------------------------------------------------------------------------------------------------------------|
| Long                    | Short | Value                  | Description                                      |
|-------------------------------------------------------------------------------------------------------------|
| win:title               |       | Looking Glass (client) | The window title                                 |
| win:position            |       | center                 | Initial window position at startup               |
| win:size                |       | 1024x768               | Initial window size at startup                   |
| win:autoResize          | -a    | no                     | Auto resize the window to the guest              |
| win:allowResize         | -n    | yes                    | Aallow the window to be manually resized         |
| win:keepAspect          | -r    | yes                    | Maintain the correct aspect ratio                |
| win:borderless          | -d    | no                     | Borderless mode                                  |
| win:fullScreen          | -F    | no                     | Launch in fullscreen borderless mode             |
| win:maximize            | -T    | no                     | Launch window maximized                          |
| win:minimizeOnFocusLoss |       | yes                    | Minimize window on focus loss                    |
| win:fpsLimit            | -K    | 200                    | Frame rate limit (0 = disable - not recommended) |
| win:showFPS             | -k    | no                     | Enable the FPS & UPS display                     |
| win:ignoreQuit          | -Q    | no                     | Ignore requests to quit (ie: Alt+F4)             |
| win:noScreensaver       | -S    | no                     | Prevent the screensaver from starting            |
| win:alerts              | -q    | yes                    | Show on screen alert messages                    |
|-------------------------------------------------------------------------------------------------------------|

|---------------------------------------------------------------------------------------------------------------------------------------|
| Long               | Short | Value           | Description                                                                            |
|---------------------------------------------------------------------------------------------------------------------------------------|
| input:grabKeyboard | -G    | yes             | Grab the keyboard in capture mode                                                      |
| input:escapeKey    | -m    | 71 = ScrollLock | Specify the escape key, see https://wiki.libsdl.org/SDLScancodeLookup for valid values |
| input:hideCursor   | -M    | yes             | Hide the local mouse cursor                                                            |
| input:mouseSens    |       | 0               | Initial mouse sensitivity when in capture mode (-9 to 9)                               |
|---------------------------------------------------------------------------------------------------------------------------------------|

|------------------------------------------------------------------------------------------------------------------|
| Long                   | Short | Value     | Description                                                         |
|------------------------------------------------------------------------------------------------------------------|
| spice:enable           | -s    | yes       | Enable the built in SPICE client for input and/or clipboard support |
| spice:host             | -c    | 127.0.0.1 | The SPICE server host or UNIX socket                                |
| spice:port             | -p    | 5900      | The SPICE server port (0 = unix socket)                             |
| spice:input            |       | yes       | Use SPICE to send keyboard and mouse input events to the guest      |
| spice:clipboard        |       | yes       | Use SPICE to syncronize the clipboard contents with the guest       |
| spice:clipboardToVM    |       | yes       | Allow the clipboard to be syncronized TO the VM                     |
| spice:clipboardToLocal |       | yes       | Allow the clipboard to be syncronized FROM the VM                   |
| spice:scaleCursor      | -j    | yes       | Scale cursor input position to screen size when up/down scaled      |
| spice:captureOnStart   |       | no        | Capture mouse and keyboard on start                                 |
| spice:alwaysShowCursor |       | no        | Always show host cursor                                             |
|------------------------------------------------------------------------------------------------------------------|

|--------------------------------------------------------------------------|
| Long          | Short | Value | Description                              |
|--------------------------------------------------------------------------|
| egl:vsync     |       | no    | Enable vsync                             |
| egl:nvGainMax |       | 1     | The maximum night vision gain            |
| egl:nvGain    |       | 0     | The initial night vision gain at startup |
|--------------------------------------------------------------------------|

|------------------------------------------------------------------------------------|
| Long                 | Short | Value | Description                                 |
|------------------------------------------------------------------------------------|
| opengl:mipmap        |       | yes   | Enable mipmapping                           |
| opengl:vsync         |       | no    | Enable vsync                                |
| opengl:preventBuffer |       | yes   | Prevent the driver from buffering frames    |
| opengl:amdPinnedMem  |       | yes   | Use GL_AMD_pinned_memory if it is available |
|------------------------------------------------------------------------------------|