Commit Graph

348 Commits (fbd373143c8f15266b24474864a9eccc9206c1f9)

Author SHA1 Message Date
Andri Yngvason fbd8020778 pixels: Fix more endienness macros 2020-07-16 17:46:44 +00:00
Jan Beich 1bc095bd75 pixels: detect endianness via compiler defines
../src/pixels.c:24:10: fatal error: 'endian.h' file not found
 #include <endian.h>
          ^~~~~~~~~~
../src/pixels.c:58:6: error: expected value in expression
 #elif
      ^
2020-07-16 14:34:56 +00:00
Andri Yngvason 2cb9f663a0 Align with aml API changes 2020-07-11 21:33:02 +00:00
Andri Yngvason 184ed0a7ef Allow the user to adjust the FPS limit 2020-07-11 20:53:31 +00:00
Andri Yngvason 73ade6b84e Add dtrace probes for rendering and damage checking 2020-07-11 20:53:31 +00:00
Andri Yngvason e5272618ba Destroy wl_registry on exit 2020-07-11 20:53:31 +00:00
Andri Yngvason 0268b52c53 Use native pixel format 2020-07-11 20:53:31 +00:00
Andri Yngvason c0f1036f97 pixels: Add more formats and take into account endianness 2020-07-11 20:53:31 +00:00
Andri Yngvason ef74911298 Exit on mode change intead of crashing 2020-07-11 20:53:31 +00:00
Andri Yngvason 9d2e22b9bd pixels: Add copyright notice 2020-07-11 20:53:31 +00:00
Andri Yngvason 9a9c7c8be6 buffer: Cleanup dmabuf params after use 2020-07-11 20:53:31 +00:00
Andri Yngvason 1406ce1cf8 Clean up damage refinery on exit 2020-07-11 20:53:31 +00:00
Andri Yngvason cd7594320b Clean up gbm device on exit 2020-07-11 20:53:31 +00:00
Andri Yngvason 4c14c11de4 transform-util: Add copyright notice 2020-07-11 20:53:31 +00:00
Andri Yngvason b8df02838e pixman-renderer: Add copyright notice 2020-07-11 20:53:31 +00:00
Andri Yngvason ee3b6d74cf buffer: Add copyright notice 2020-07-11 20:53:31 +00:00
Andri Yngvason 7b6372ef49 damage-refinery: Add copyright notice 2020-07-11 20:53:31 +00:00
Andri Yngvason 843368c993 screencopy: Actually use y-inversion flag 2020-07-11 20:53:31 +00:00
Andri Yngvason 46fdbfb109 screencopy: Set the rate limit to 30 Hz 2020-07-11 20:53:31 +00:00
Andri Yngvason 2b522ee596 Remove frame-capture abstraction 2020-07-11 20:53:31 +00:00
Andri Yngvason b0ec79acf8 Move damage hints into buffer abstraction 2020-07-11 20:53:31 +00:00
Andri Yngvason 0615cd44c6 buffer: Add damage field 2020-07-11 20:53:31 +00:00
Andri Yngvason 0edaded063 Remove dead code 2020-07-11 20:53:30 +00:00
Andri Yngvason 84c57a7333 buffer: Fix pool release/acquire 2020-07-11 20:52:01 +00:00
Andri Yngvason f68bb825e1 buffer: Fix error check and use non-linear 2020-07-11 20:52:01 +00:00
Andri Yngvason 0178dd8a39 screencopy: map dmabuf after it's ready 2020-07-11 20:52:01 +00:00
Andri Yngvason 19eb9af7e5 buffer: Unmap before release/destroy 2020-07-11 20:52:01 +00:00
Andri Yngvason 3fc07f571d screencopy: Use linux-dmabuf if available 2020-07-11 20:52:01 +00:00
Andri Yngvason 70216b5829 main: Add gbm and linux-dmabuf 2020-07-11 20:52:01 +00:00
Andri Yngvason 4a21939b43 buffer: Use create_immed 2020-07-11 20:52:01 +00:00
Andri Yngvason 4fa019d31f buffer: Add DMA-BUFs 2020-07-11 20:52:01 +00:00
Andri Yngvason 9b136c90de buffer: Add specific handling for different buffers 2020-07-11 20:52:01 +00:00
Andri Yngvason 480392e40c buffer: Add buffer type to interface 2020-07-11 20:52:01 +00:00
Andri Yngvason 59cc119d76 main: Refine damage hints 2020-07-11 20:52:01 +00:00
Andri Yngvason fe590f3940 damage-refinery: Use damage hint 2020-07-11 20:52:01 +00:00
Andri Yngvason e398dcc235 damage-refinery: Hash directly instead of copying 2020-07-11 20:52:01 +00:00
Andri Yngvason 439d3997d4 damage-refinery: Use negative stride to handle y-inversion 2020-07-11 20:52:01 +00:00
Andri Yngvason c515a29951 Create hash based damage checker 2020-07-11 20:52:01 +00:00
Andri Yngvason 946ace1760 Fix damage transform 2020-07-11 20:52:01 +00:00
Andri Yngvason 12555bea13 pixman-renderer: Use negative stride for y-inversion 2020-07-11 20:52:01 +00:00
Andri Yngvason 1cafc25655 Transform damage coordinates 2020-07-11 20:52:01 +00:00
Andri Yngvason 6b1dc2e6c3 Add utilities for managing output transforms 2020-07-11 20:52:01 +00:00
Andri Yngvason 507b76dfbd Create pixman renderer 2020-07-11 20:52:01 +00:00
Andri Yngvason 29f1669d55 buffer: Leave pixman out of buffers 2020-07-11 20:52:01 +00:00
Andri Yngvason e65cae43c2 Extract pixel format conversion into own file 2020-07-11 20:52:01 +00:00
Andri Yngvason a6e1ba25ea Render using pixman 2020-07-11 20:52:00 +00:00
Andri Yngvason 4fb472f611 Create a buffer abstraction 2020-07-11 20:52:00 +00:00
Andri Yngvason 0a139a1ac4 Align with aml API changes 2020-07-06 16:46:30 +00:00
Andri Yngvason 4f1bca55c3 Exit when main selected seat/output goes away 2020-06-12 23:15:22 +00:00
Andri Yngvason 041ac60ef6 renderer: Add more error messages 2020-06-10 22:09:22 +00:00
Andri Yngvason ff882b7774 keyboard: Ignore shift level on modifiers 2020-05-26 22:19:48 +00:00
Andri Yngvason ff1223e4f9 keyboard: Fix comparison of signed and unsigned value 2020-05-18 20:38:48 +00:00
Andri Yngvason 9b48290d09 Improve error handling in wayland dispatch 2020-05-10 12:21:10 +00:00
Andri Yngvason 151e916752 renderer: Set GL_PACK_ALIGNMENT to 1
Otherwise row stride will multiple of 4, even for damage data.
2020-05-10 12:21:10 +00:00
Andri Yngvason 0761a5b818 damage: Fix uninitialised value 2020-05-10 12:21:10 +00:00
Andri Yngvason 4f5933c07f dmabuf: Limit rate to 30 FPS 2020-05-03 19:58:50 +00:00
Andri Yngvason f5453ffe1e keyboard: Relax matching criteria on shift level
Clients behave differently when it comes to sending release events for keys,
so it's hard to rely on any one kind of behaviour.
2020-05-01 17:34:22 +00:00
Andri Yngvason 405268fc58 keyboard: Log keyboard symbol lookup errors 2020-05-01 17:19:14 +00:00
Andri Yngvason 6e889211db renderer: Run glFinish() before glReadPixels() 2020-04-26 14:15:57 +00:00
Andri Yngvason 8cc8c198d2 renderer: Run glFinish() after rendering dmabuf frame 2020-04-26 14:14:06 +00:00
Andri Yngvason 06a249897b dmabuf: Show a debug message when frames are held for too long. 2020-04-26 14:14:06 +00:00
Andri Yngvason 04569b01f2 dmabuf: Add dtrace probes 2020-04-26 11:24:29 +00:00
Andri Yngvason 9d6310cb14 dmabuf: Remove rate limiting 2020-04-26 10:39:58 +00:00
Andri Yngvason 6becbacbe5 Align with NeatVNC interface changes 2020-04-12 21:46:48 +00:00
Andri Yngvason 1fc664a014 Remove call to nvnc_set_dimensions() 2020-04-12 16:14:18 +00:00
Andri Yngvason f9deca5c9c shm: Add copyright notice
Putting a proper license on this to appease package maintainers.
2020-04-12 13:08:42 +00:00
Greg V 3f62295214 keyboard: rename keymap_len to keymap_size 2020-04-09 15:39:09 +03:00
Greg V fa49aca45a keyboard: check that write finished writing everything
(Use loop to write until the end)
2020-04-09 15:38:13 +03:00
Greg V ccc582cd58 keyboard: allocate shm with *actually* correct size
strlen returns "the number of characters that precede the terminating NUL".
We do need to send the \0 byte, since xkbcommon on the receiving end
*is* expecting a C string. And e.g. wlroots does strlen+1.
2020-04-09 15:37:18 +03:00
Andri Yngvason 14d62d0029 Fix transformations
This fixes #29
2020-04-09 11:50:48 +00:00
Andri Yngvason 58a181ccbc Redesign update/rendering loop
Every change to the framebuffer is now copied into a single buffer
inside a single callback. This simplifies things a lot, and might even
perform better.
2020-04-07 23:37:31 +00:00
Greg V d610076614 shm: support memfd and SHM_ANON 2020-04-06 02:07:25 +03:00
Greg V 720b127dee keyboard: allocate shm with correct size
This was working on Linux because shm_open there returns a regular file,
but this is required on FreeBSD where shm_open returns a memory-backed fd.
2020-04-06 00:26:22 +03:00
Andri Yngvason be401b5e4a Report error when binding to address fails
This fixes #21
2020-04-04 22:38:23 +00:00
Andri Yngvason 6e521a07a0 Merge frames rather than dropping them when encoder is too slow 2020-04-04 21:03:49 +00:00
Andri Yngvason 238c196e6b Capture a new frame immediately when a client requests a whole frame 2020-04-04 15:01:38 +00:00
Andri Yngvason ee4917f200 Make sure that frames being written to are not in use by the encoder 2020-04-04 13:14:07 +00:00
Andri Yngvason 8ce312e9eb renderer: Add dtrace probes 2020-04-02 00:55:18 +00:00
Andri Yngvason 075680994e screencopy: Add dtrace probes 2020-04-02 00:34:00 +00:00
Andri Yngvason dc7adf8f3b renderer: Use ATTR_INDEX_ constants for glEnableVertex* 2020-03-29 14:05:33 +00:00
Andri Yngvason e85f219aff Make sure damage buffer is properly aligned 2020-03-29 13:09:28 +00:00
Andri Yngvason b14a0b854b Rotate NeatVNC framebuffers rather than allocating new ones 2020-03-28 19:23:03 +00:00
Andri Yngvason 2bb17c8215 Blit the whole frame when a new client connects 2020-03-28 15:20:59 +00:00
Andri Yngvason e7586e8753 Only copy the damaged region from GPU 2020-03-28 15:05:04 +00:00
Andri Yngvason 1ebd9a7647 damage: Respect frame boundaries 2020-03-28 14:34:12 +00:00
Andri Yngvason b6ca7aff8c Join process_frame() and update_vnc() 2020-03-28 14:09:29 +00:00
Andri Yngvason bfbc81bf04 Use GPU damage checker 2020-03-28 13:07:33 +00:00
Andri Yngvason 52c18ffe23 damage: Add asynchronous damage checking 2020-03-28 13:05:59 +00:00
Andri Yngvason 7f5431d922 Move rendering calls into frame-capture 2020-03-28 11:44:40 +00:00
Andri Yngvason c91816f247 Implement damage buffer conversion 2020-03-28 10:59:21 +00:00
Andri Yngvason b0a6b6bd2a renderer: Swap FPOs rather than textures 2020-03-28 10:59:21 +00:00
Andri Yngvason ae90348ece renderer: Save previous rendered frame rather than previous imported frame
We can't keep dmabufs very long.
2020-03-26 21:43:35 +00:00
Andri Yngvason b5f1ff0898 renderer: Render to texture 2020-03-26 18:49:37 +00:00
Andri Yngvason 7e709c23e9 renderer: Add damage renderer 2020-03-25 23:21:11 +00:00
Andri Yngvason 6536cbd56f renderer: Add damage shaders 2020-03-25 23:21:11 +00:00
Andri Yngvason 557f0f365b renderer: Set up texture bindings on render() 2020-03-25 21:27:57 +00:00
Andri Yngvason a8fd0d6765 renderer: Show error when linking shaders fails 2020-03-25 21:07:36 +00:00
Andri Yngvason 996729f9bb renderer: Show error message when shader compilation failse 2020-03-25 20:44:54 +00:00
Andri Yngvason 13216fa507 renderer: Add u_tex1 to shaders 2020-03-25 20:26:15 +00:00
Andri Yngvason 49c584f80d renderer: Move shader setup into render() 2020-03-24 22:57:02 +00:00
Andri Yngvason 4da96d0dc1 renderer: Split buffer import and rendering 2020-03-24 22:48:13 +00:00
Andri Yngvason 9d058c85ce Renderer: Keep last texture 2020-03-24 22:07:49 +00:00
Andri Yngvason b39e7535ee renderer: Use FBO instead of pbuffer
This is in preperation for damage checking on the GPU
2020-03-24 19:17:23 +00:00
Andri Yngvason a12ce12ba6 Exit when compositor goes away 2020-03-22 20:29:13 +00:00
Andri Yngvason 26cef852b6 Replace libuv with aml 2020-03-21 16:46:10 +00:00
Andri Yngvason 7ea17d04aa Apply output transformation to pointer coordinates 2020-03-07 14:19:02 +00:00
Andri Yngvason e8279e57f5 Apply output transform to damage hint coordinates 2020-03-07 14:15:09 +00:00
Andri Yngvason 8ff7128714 output: Add coordinate transformations 2020-03-07 14:13:59 +00:00
Andri Yngvason 433ee722ec render: Implement rest of transforms 2020-03-07 12:16:01 +00:00
Andri Yngvason c32993d87d Use transformed geometry for frame buffers 2020-03-05 22:05:14 +00:00
Andri Yngvason 9642e086d8 render: Set glViewport based on output transform 2020-03-05 22:05:14 +00:00
Andri Yngvason e01f75bfbd output: Add functions to get transformed geometry 2020-03-05 22:05:14 +00:00
Andri Yngvason 35ffc2dac7 output: Add transform 2020-03-05 22:05:14 +00:00
Andri Yngvason a3d4189a0b render: Add output transforms 2020-03-05 22:05:14 +00:00
Andri Yngvason a327a2f6dd render: Add 2D projections 2020-03-05 18:46:27 +00:00
Andri Yngvason 1bf618a098 render: Fetch uniform locations in one place 2020-03-05 18:20:54 +00:00
Andri Yngvason 6b3b448405 render: Move shader_program into shader struct 2020-03-05 18:14:50 +00:00
Andri Yngvason 1e6c89d9a9 output: Use non-scaled geometry
This fixes #16
2020-03-04 21:40:33 +00:00
Andri Yngvason a70a2b1bc4 pointer: Remove output position from coordinates
This is no longer required as the input is mapped to the output in the
compositor.
2020-02-21 23:28:36 +00:00
Andri Yngvason 10e5c08752 Map input to the selected output 2020-02-21 23:28:33 +00:00
Dan Shick 4ad4c712b2 Fix shader path, meson doesn't include trailing slash in prefix 2020-02-11 18:41:59 -05:00
Andri Yngvason 4d6f477d71
Merge pull request #14 from danshick/cursor_overlay_flag
Added cli flag to change overlay_cursor option, defaulting to false
2020-02-11 23:49:35 +01:00
Dan Shick e53b4dfc9d Add option to enable cursor overlay rendering 2020-02-11 17:45:01 -05:00
Andri Yngvason e5512114f8 render: Only compile the shader that is being used 2020-02-11 21:55:05 +00:00
Andri Yngvason c274c81fa3 Install shader files 2020-02-11 21:09:30 +00:00
Andri Yngvason a8d49f3022 render: Define constants for attribute indices 2020-02-11 20:32:04 +00:00
Andri Yngvason 4b3be2c972 render: Load shaders from files 2020-02-11 19:55:31 +00:00
Andri Yngvason 3c4b81862b render: Create a function to read a shader from a file 2020-02-11 19:55:31 +00:00
Andri Yngvason cbbd97018d Don't fail when config doesn't exist 2020-01-29 19:45:04 +00:00
Andri Yngvason 8491d6c73c Enable VeNCrypt auth & encryption 2020-01-25 18:10:59 +00:00
Andri Yngvason e6b1ca8044 keyboard: Assign state to keys rather than symbols
The keys are pressed and released, not the symbols. This fixes tracking
of the state of a key through modifier changes. E.g. A capital 'A' may
be received from the client while the shift key is pressed, but if the
shift key is released before the 'a' key, the 'a' symbol is generated.
2020-01-25 13:19:08 +00:00
Andri Yngvason ec7fee42c5 Create an integer set data structure 2020-01-25 13:17:24 +00:00
Andri Yngvason a1ee09386a pointer: Add output position to absolute coordinates
This fixes mouse issues when there are multiple outputs
2020-01-24 21:14:29 +00:00
Andri Yngvason 7eaece7c0a Restructure input initialisation 2020-01-24 20:56:47 +00:00
Andri Yngvason b0077c93fe Use output name for output selection 2020-01-24 20:19:57 +00:00
Andri Yngvason d0bee5c651 output: Add function to find display by name 2020-01-24 20:18:37 +00:00
Andri Yngvason df936b9dac Add xdg_output_v1 for more output info 2020-01-24 20:08:57 +00:00
Andri Yngvason 0572693f21 Exit when the compositor goes away 2020-01-21 19:16:36 +00:00
Andri Yngvason 48907682c7 keyboard: Fix modifier lookup 2020-01-20 21:15:04 +00:00
Andri Yngvason 5731ea4666 keyboard: Add bounds checking on keycode lookup 2020-01-19 12:43:48 +00:00
Andri Yngvason 20cd7725f6 Load a config file 2020-01-18 18:14:17 +00:00
Andri Yngvason c1210f1426 Create a simple config loader 2020-01-18 17:58:40 +00:00
Andri Yngvason e2079a7e56 keyboard: Don't send repeated events to server
This caused the virtual key to get "stuck" in the pressed position and
then to stop working at all. It's definitely a bug on the server side
also.
2020-01-15 20:34:56 +00:00
Andri Yngvason b744e2410e Handle more pixel formats 2020-01-14 21:44:07 +00:00
Andri Yngvason 7acf2c7aef screencopy: Update copyright notice 2020-01-14 20:42:48 +00:00
Andri Yngvason 9eb851cf92 screencopy: Adjust rate limiting based on capturing delay 2020-01-14 20:40:57 +00:00
Andri Yngvason 38d7b9cf4d screencopy: Simplify rate limiting 2020-01-14 20:12:58 +00:00
Andri Yngvason 017edc6ae1 Handle seat removal 2020-01-14 19:18:33 +00:00
Andri Yngvason 0cc1a70ba7 main: remove duplicate function 2020-01-14 19:11:01 +00:00
Andri Yngvason ffce795c6f dmabuf: Limit frame rate to 20 FPS 2020-01-04 15:05:15 +00:00
Andri Yngvason c5fee473d6 Fix segfault on exit when dmabuf capturing is selected 2020-01-04 13:48:09 +00:00
Andri Yngvason 457e540d89 pointer: Fix mouse scroll 2020-01-03 21:52:36 +00:00
Andri Yngvason 476854aeaf keyboard: Remove debug printout 2020-01-03 20:42:40 +00:00
Andri Yngvason 990e57fa89 keyboard: Improve key code lookup
The shift level for each symbol is now included in the lookup table, so
it's more robust for various keyboard layouts.
2020-01-03 20:03:02 +00:00
Andri Yngvason a6f979e93a Add seat selection 2019-12-31 14:01:22 +00:00
Andri Yngvason 452ba2c4fb Listen to connections from localhost only, by default 2019-12-31 10:33:40 +00:00
Drew DeVault 38c872b2ba Fix output selection 2019-12-30 16:13:44 -05:00
Andri Yngvason 2b00400b8a Add option to select keyboard layout 2019-12-30 10:15:12 +00:00
Andri Yngvason e82e3a92b5 screencopy: Add rate limiting
The smoothing filter allows for short bursts of higher frame rate in
order to reduce latency.
2019-12-29 11:47:33 +00:00
Andri Yngvason c794ca3822 smooth: Use integers rather than floats to store tme 2019-12-29 10:36:08 +00:00
Andri Yngvason baad0ecd68 Extract time functions into own module 2019-12-29 10:06:25 +00:00
Andri Yngvason 61657c97ba Add an exponential smoothing filter 2019-12-29 10:02:31 +00:00
Andri Yngvason cbfa0416b4 dmabuf: Close file descriptors after using them 2019-12-27 16:31:47 +00:00
Andri Yngvason 09772ddf5b Clean up some resources 2019-12-27 14:41:54 +00:00
Andri Yngvason 9adac0e683 Don't call uv_close() on unknown handles 2019-12-27 13:53:36 +00:00
Andri Yngvason 5c7f941481 keyboard: Add some acknowledgements 2019-12-25 11:45:07 +00:00
Andri Yngvason b2bbc9ac0b Implement keyboard backend 2019-12-25 11:05:05 +00:00
Andri Yngvason 7c1722445d Make screencopy the default capturing backend 2019-12-23 12:50:36 +00:00
Andri Yngvason 82bdbb82c0 Add virtual pointer backend 2019-12-22 21:42:10 +00:00
Andri Yngvason 529483a459 Remove unused code 2019-10-22 19:24:09 +00:00
Andri Yngvason 25187cbfb2 Add option for output selection 2019-10-13 12:58:56 +00:00
Andri Yngvason ba3dc617f4 output: Add missing copyright statement 2019-10-13 12:48:12 +00:00
Andri Yngvason 59fa4cfeaa Move output handling into its own source file 2019-10-13 12:47:02 +00:00
Andri Yngvason 9cd6811efa Add option parsing and the ability to select a frame capturing backend 2019-10-12 12:17:22 +00:00
Andri Yngvason b07de643ab render: Try to do proper cleanup on egl 2019-10-11 22:18:56 +00:00
Andri Yngvason cc1f470c6e Integrate dmabuf capturing into frame-capture 2019-10-10 22:51:44 +00:00
Andri Yngvason ffda3c164c Create frame-capture backend framework 2019-10-10 22:32:54 +00:00
Andri Yngvason e037e74756 Implement screencopy damage 2019-10-10 21:40:22 +00:00
Andri Yngvason ddaea0ceab Add some code for rendering screencopy frames 2019-10-10 21:28:07 +00:00
Andri Yngvason 1132dd6a3c render: Add a function to render plain framebuffer 2019-10-09 22:37:46 +00:00
Andri Yngvason 8cc00dd5eb render: rename shader_program -> dmabuf_shader_program 2019-10-09 22:00:01 +00:00
Andri Yngvason 36e7bde860 screencopy: Remember to request frame copy 2019-10-09 21:59:13 +00:00
Andri Yngvason af1307b420 render: Use compatible pbuffer
Otherwise glReadPixels() will be bonkers.
2019-10-09 20:53:11 +00:00
Andri Yngvason 640b12184d Align dmabuf backend with screencopy backend 2019-10-09 19:12:16 +00:00
Andri Yngvason a7b4859611 Working on screencopy backend for comparison width export-dmabuf 2019-10-08 22:16:26 +00:00
Andri Yngvason a52e1040a0 Add license and copyright notice 2019-10-08 18:41:23 +00:00
Andri Yngvason c02a6512ea Add damage checking 2019-10-07 23:44:55 +00:00
Andri Yngvason 3ba5884954 Feed captured frames to nvnc 2019-10-07 23:07:12 +00:00
Andri Yngvason 119ee0efef WiP: Implement frame capturing 2019-10-06 22:50:11 +00:00
Andri Yngvason eaae3ba2db Add more initialisation code 2019-10-06 22:12:29 +00:00
Andri Yngvason 33772e0b94 render: Fixup 2019-10-06 20:54:59 +00:00
Andri Yngvason 2d953c5053 Working on the main program 2019-10-06 18:51:39 +00:00
Andri Yngvason a52ff52fcf render: Move logging and struct to headers 2019-10-06 18:50:47 +00:00
Andri Yngvason f4e9169b66 Add strlcpy 2019-10-06 18:49:57 +00:00
Andri Yngvason 89dbbc5fc9 render: Add header 2019-10-06 17:14:53 +00:00
Andri Yngvason 232b945ad0 Wrap interface for wl-export-dmabuf 2019-10-06 17:12:03 +00:00
Andri Yngvason 0dceb98f79 Add dmabuf import & render 2019-10-06 14:08:52 +00:00
Andri Yngvason 838570a4f9 Create new VNC project 2019-10-06 13:10:46 +00:00