From c099a68168b07a230a04568c3365e0ec01baeae7 Mon Sep 17 00:00:00 2001 From: iceiix <43691553+iceiix@users.noreply.github.com> Date: Fri, 30 Nov 2018 11:35:35 -0800 Subject: [PATCH] Use glutin to replace sdl2 (#35) * Add glutin dependency * Create a glutin window * Use the glutin window, basics work * Store DPI factor on game object, update on Resized * Use physical size for rendering only. Fixes UI scaled too small Fixes https://github.com/iceiix/steven/pull/35#issuecomment-442683373 See also https://github.com/iceiix/steven/issues/22 * Begin adding mouse input events * Listen for DeviceEvents * Call hover_at on mouse motion * Listen for CursorMoved window event, hovering works Glutin has separate WindowEvent::CursorMoved and DeviceEvent::MouseMotion events, for absolute cursor and relative mouse motion, respectively, instead of SDL's Event::MouseMotion for both. * Use tuple pattern matching instead of nested if for MouseInput * Implement left clicking * Use grab_cursor() to capture the cursor * Hide the cursor when grabbing * Implement MouseWheel event * Listen for keyboard input, escape key release * Keyboard input: console toggling, glutin calls backquote 'grave' * Implement fullscreen in glutin, updates https://github.com/iceiix/steven/pull/31 * Update settings for glutin VirtualKeyCode * Keyboard controls (note: must clear conf.cfg to use correct bindings) * Move DeviceEvent match arm up higher for clarity * Remove SDL * Pass physical dimensions to renderer tick so blit_framebuffer can use full size but the ui is still sized logically. * Listen for DeviceEvent::Text * Implement text input using ReceivedCharacter window event, works https://github.com/iceiix/steven/pull/35#issuecomment-443247267 * Request specific version of OpenGL, version 3.2 * Request OpenGL 3.2 but fallback to OpenGL ES 2.0 if available (not tested) * Set core profile and depth 24-bits, stencil 0-bits * Allow changing vsync, but require restarting (until https://github.com/tomaka/glutin/issues/693) * Clarify specific Rust version requirement * Import glutin::* in handle_window_event() to avoid overly repetitive code * Linux in VM fix: manually calculate delta in MouseMotion For the third issue on https://github.com/iceiix/steven/pull/35#issuecomment-443084458 https://github.com/tomaka/glutin/issues/1084 MouseMotion event returns absolute instead of relative values, when running Linux in a VM * Heuristic to detect absolute/relative MouseMotion from delta:(xrel, yrel); use a higher scaling factor * Add clipboard pasting with clipboard crate instead of sdl2 https://github.com/iceiix/steven/pull/35#issuecomment-443307295 --- .travis.yml | 4 +- Cargo.lock | 510 ++++++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 3 +- README.md | 46 +---- appveyor.yml | 11 - src/gl/mod.rs | 6 +- src/main.rs | 337 +++++++++++++++++------------- src/render/mod.rs | 6 +- src/settings.rs | 10 +- src/ui/mod.rs | 27 +-- 10 files changed, 693 insertions(+), 267 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4207b0b..dc511e0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,11 +11,9 @@ matrix: cache: cargo before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2 ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo chown root:wheel /usr/local/bin/brew ; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew link sdl2 ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get update -qq ; fi - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -y libsdl2-dev libsdl2-mixer-dev gcc libegl1-mesa-dev libgles2-mesa-dev ; fi + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -y gcc libegl1-mesa-dev libgles2-mesa-dev ; fi script: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/lib" ; fi - cargo build --verbose diff --git a/Cargo.lock b/Cargo.lock index bdb073e..3165b7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,11 +32,37 @@ dependencies = [ "opaque-debug 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "andrew" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "line_drawing 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rusttype 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "android_glue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "approx" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "approx" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "arrayvec" version = "0.4.7" @@ -69,12 +95,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bitflags" -version = "0.7.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "bitflags" -version = "1.0.4" +name = "block" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -165,6 +191,15 @@ name = "cfg-if" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "cgl" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cgmath" version = "0.16.1" @@ -186,6 +221,26 @@ dependencies = [ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "clipboard" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "clipboard-win 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "x11-clipboard 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "clipboard-win" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -194,6 +249,20 @@ dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cocoa" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "collision" version = "0.18.0" @@ -221,6 +290,15 @@ dependencies = [ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "core-foundation" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "core-foundation-sys" version = "0.5.1" @@ -229,6 +307,22 @@ dependencies = [ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "core-foundation-sys" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "core-graphics" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crc" version = "1.8.1" @@ -312,6 +406,19 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "dlib" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "downcast-rs" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "dtoa" version = "0.4.3" @@ -418,6 +525,46 @@ dependencies = [ "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "gl_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gleam" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "glutin" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cocoa 0.18.4 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)", + "gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-client 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winit 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "x11-dl 2.18.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "h2" version = "0.1.13" @@ -571,8 +718,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "lazy_static" -version = "0.2.11" +name = "khronos_api" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -603,6 +750,23 @@ dependencies = [ "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libloading" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "line_drawing" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lock_api" version = "0.1.4" @@ -625,11 +789,28 @@ name = "lzw" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "memmap" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "memoffset" version = "0.2.1" @@ -758,6 +939,18 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "nix" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nodrop" version = "0.1.12" @@ -896,6 +1089,32 @@ dependencies = [ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "objc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "opaque-debug" version = "0.2.1" @@ -930,6 +1149,22 @@ dependencies = [ "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ordered-float" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "osmesa-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "owning_ref" version = "0.3.3" @@ -1036,16 +1271,6 @@ dependencies = [ "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rand" version = "0.4.3" @@ -1156,6 +1381,17 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rusttype" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "approx 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ryu" version = "0.2.6" @@ -1166,6 +1402,14 @@ name = "safemem" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "same-file" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "schannel" version = "0.1.14" @@ -1185,27 +1429,6 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "sdl2" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "sdl2-sys 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sdl2-sys" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "security-framework" version = "0.2.1" @@ -1289,6 +1512,15 @@ dependencies = [ "opaque-debug 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "simple_asn1" version = "0.2.0" @@ -1316,11 +1548,36 @@ dependencies = [ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "smithay-client-toolkit" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "andrew 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-client 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-commons 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-protocols 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "stable_deref_trait" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "stb_truetype" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "steven" version = "0.0.1" @@ -1330,8 +1587,10 @@ dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "cfb8 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "cgmath 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clipboard 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "collision 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "glutin 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1339,7 +1598,6 @@ dependencies = [ "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)", "rsa_public_encrypt_pkcs1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sdl2 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "sha-1 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1682,6 +1940,16 @@ name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "walkdir" +version = "2.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "want" version = "0.0.6" @@ -1692,6 +1960,58 @@ dependencies = [ "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "wayland-client" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "downcast-rs 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-commons 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-scanner 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-sys 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wayland-commons" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-sys 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wayland-protocols" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-client 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-commons 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-scanner 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-sys 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wayland-scanner" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wayland-sys" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi" version = "0.2.8" @@ -1716,11 +2036,40 @@ name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winit" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cocoa 0.18.4 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smithay-client-toolkit 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-client 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "x11-dl 2.18.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -1730,6 +2079,38 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "x11-clipboard" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "xcb 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "x11-dl" +version = "2.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "xcb" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "xdg" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "xml-rs" version = "0.7.0" @@ -1738,6 +2119,11 @@ dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "xml-rs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "zip" version = "0.4.2" @@ -1755,13 +2141,16 @@ dependencies = [ "checksum aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" "checksum aes-soft 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "acdc19c789666840bb86d1df8ee1f458418f74a6b9c8f10538fb700de5829cb8" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" +"checksum andrew 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "62ea7024f6f4d203bede7c0c9cdafa3cbda3a9e0fa04d349008496cc95b8f11b" +"checksum android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" "checksum approx 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08abcc3b4e9339e33a3d0a5ed15d84a687350c05689d825e0f6655eef9e76a94" +"checksum approx 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f71f10b5c4946a64aad7b8cf65e3406cd3da22fc448595991d22423cf6db67b4" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" "checksum bit-set 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f1efcc46c18245a69c38fcc5cc650f16d3a59d034f3106e9ed63748f695730a" "checksum bit-vec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440d5cb623bb7390ae27fec0bb6c61111969860f8e3ae198bfa0663645e67cf" -"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" +"checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" "checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" "checksum block-cipher-trait 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "30668a4dc25ca695ad6f4c4734b96b0a4414a87158eefeec04155bcef580a3de" "checksum block-padding 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc4358306e344bf9775d0197fd00d2603e5afb0771bb353538630f022068ea3" @@ -1774,13 +2163,20 @@ dependencies = [ "checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16" "checksum cfb8 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "246262ff86ddd02c34d3373bc1feef8bcdb92347f801ef0326f9a4091cfa164a" "checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" +"checksum cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "55e7ec0b74fe5897894cbc207092c577e87c52f8a59e8ca8d97ef37551f60a49" "checksum cgmath 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "64a4b57c8f4e3a2e9ac07e0f6abc9c24b6fc9e1b54c3478cfb598f3d0023e51c" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" +"checksum clipboard 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "25a904646c0340239dcf7c51677b33928bf24fdf424b79a57909c0109075b2e7" +"checksum clipboard-win 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "289da2fc09ab964a4948a63287c94fcb4698fa823c46da84c3792928c9d36110" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +"checksum cocoa 0.18.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cf79daa4e11e5def06e55306aa3601b87de6b5149671529318da048f67cdd77b" "checksum collision 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "928b2092661bb4cd6f5e5a39c639ac6553a1e69750fab6de2edb86e2304f9eaa" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" +"checksum core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e2640d6d0bf22e82bed1b73c6aef8d5dd31e5abe6666c57e6d45e2649f4f887" "checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" +"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" +"checksum core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3486aefc4c0487b9cb52372c97df0a48b8c249514af1ee99703bf70d2f2ceda1" @@ -1790,6 +2186,8 @@ dependencies = [ "checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" "checksum deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6abb26e16e8d419b5c78662aa9f82857c2386a073da266840e474d5055ec86" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" +"checksum dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "77e51249a9d823a4cb79e3eca6dcd756153e8ed0157b6c04775d04bf1b13b76a" +"checksum downcast-rs 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "18df8ce4470c189d18aa926022da57544f31e154631eb4cfe796aea97051fe6c" "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum encoding_rs 0.8.10 (registry+https://github.com/rust-lang/crates.io-index)" = "065f4d0c826fdaef059ac45487169d918558e3cf86c9d89f6e81cf52369126e5" @@ -1804,7 +2202,10 @@ dependencies = [ "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c" +"checksum gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0ffaf173cf76c73a73e080366bf556b4776ece104b06961766ff11449f38604" "checksum gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a" +"checksum gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4b47f5b15742aee359c7895ab98cf2cceecc89bb4feb6f4e42f802d7899877da" +"checksum glutin 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "535c6eda58adbb227604b2db10a022ffd6339d7ea3e970f338e7d98aeb24fcc3" "checksum h2 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd33bafe2e6370e6c8eb0cf1b8c5f93390b90acde7e9b03723f166b28b648ed" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "24f58e8c2d8e886055c3ead7b28793e1455270b5fb39650984c224bc538ba581" @@ -1820,15 +2221,19 @@ dependencies = [ "checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "037ab472c33f67b5fbd3e9163a2645319e5356fcd355efa6d4eb7fff4bbcb554" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" +"checksum khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62237e6d326bd5871cd21469323bf096de81f1618cd82cbaf5d87825335aeb49" "checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" "checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" "checksum libflate 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "21138fc6669f438ed7ae3559d5789a5f0ba32f28c1f0608d1e452b0bb06ee936" +"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" +"checksum line_drawing 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5cc7ad3d82c845bdb5dde34ffdcc7a5fb4d2996e1e1ee0f19c33bc80e15196b9" "checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" "checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f" "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" +"checksum malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "0a907b83e7b9e987032439a387e187119cddafc92d5c2aaeb1d92580a793f630" "checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" @@ -1841,6 +2246,7 @@ dependencies = [ "checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729" "checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" +"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" "checksum num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4825417e1e1406b3782a8ce92f4d53f26ec055e3622e1881ca8e9f5f9e08db" @@ -1856,10 +2262,15 @@ dependencies = [ "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9833ab0efe5361b1e2122a0544a5d3359576911a42cb098c2e59be8650807367" +"checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +"checksum objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" "checksum opaque-debug 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "51ecbcb821e1bd256d456fe858aaa7f380b63863eab2eb86eee1bd9f33dd6682" "checksum openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "5e1309181cdcbdb51bc3b6bedb33dfac2a83b3d585033d3f6d9e22e8c1928613" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" "checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" +"checksum ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0015e9e8e28ee20c581cfbfe47c650cedeb9ed0721090e0b7ebb10b9cdbcc2" +"checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" @@ -1873,7 +2284,6 @@ dependencies = [ "checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" "checksum proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" "checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" -"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" "checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" "checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2" @@ -1885,13 +2295,13 @@ dependencies = [ "checksum rsa_public_encrypt_pkcs1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c82a2353440d2314c25680aefd2e34e7e47e3dd60fddccb2228a6e3b977845ee" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum rusttype 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "436c67ae0d0d24f14e1177c3ed96780ee16db82b405f0fba1bb80b46c9a30625" "checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" +"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" "checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum sdl2 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a74c2a98a354b20713b90cce70aef9e927e46110d1bc4ef728fd74e0d53eba60" -"checksum sdl2-sys 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c543ce8a6e33a30cb909612eeeb22e693848211a84558d5a00bb11e791b7ab7" "checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0" "checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" @@ -1901,11 +2311,14 @@ dependencies = [ "checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" "checksum serde_urlencoded 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "aaed41d9fb1e2f587201b863356590c90c1157495d811430a0c0325fe8169650" "checksum sha-1 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfd94fe9ed1245c2a1459f99373217b131a1b32b6d0922988b1e45b35249249" +"checksum shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" "checksum simple_asn1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07eef2e83a2e3370574f3c1546bd93a33949ef685bf40151dba84e8f94978157" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" "checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" "checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" +"checksum smithay-client-toolkit 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ef227bd9251cf8f8e54f8dd9a4b164307e515f5312cd632ebc87b56f723893a2" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" +"checksum stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "48fa7d3136d8645909de1f7c7eb5416cc43057a75ace08fc39ae736bc9da8af1" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" @@ -1938,12 +2351,25 @@ dependencies = [ "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" +"checksum wayland-client 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)" = "267d642a6e551e5af62a5e4fbfaab299221e6ddbd453b5985cfa84c835887679" +"checksum wayland-commons 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)" = "da95f98e6b8222cb0f248811ecd69ba6ebe243b737fd34020f7c73665bb4a3af" +"checksum wayland-protocols 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d20e951995113cdb8f32578c8402e619aa3d3e894f3ca334deb219abc1f6df" +"checksum wayland-scanner 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)" = "4f17846a40a19f7917f11c18a6c8c3b3a34b3ba09cb200d3e03503ebdfcbf3a7" +"checksum wayland-sys 0.21.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a0931c24c91e4e56c1119e4137e237df2ccc3696df94f64b1e2f61982d89cc32" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum winit 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "27aa86a5723951d6a08c2acb9f10e25cb39ceb5b1987d7daf74e181b21f8f50b" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +"checksum x11-clipboard 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d8617c6185c96e5fcf57ff156496d73c9c82b7f09a5fea21b518dd32c10e2e05" +"checksum x11-dl 2.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "940586acb859ea05c53971ac231685799a7ec1dee66ac0bccc0e6ad96e06b4e3" +"checksum xcb 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5e917a3f24142e9ff8be2414e36c649d47d6cc2ba81f16201cdef96e533e02de" +"checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2" +"checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5" "checksum zip 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "36b9e08fb518a65cf7e08a1e482573eb87a2f4f8c6619316612a3c1f162fe822" diff --git a/Cargo.toml b/Cargo.toml index b269547..ba42f1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ opt-level = 1 [dependencies] sha-1 = "0.8.0" -sdl2 = "0.31.0" +glutin = "0.19.0" byteorder = "1.2.6" reqwest = "0.9.4" serde = "1.0.79" @@ -30,6 +30,7 @@ collision = "0.18.0" aes = "0.3.2" cfb8 = "0.3.1" rsa_public_encrypt_pkcs1 = "0.2.0" +clipboard = "0.5.0" # clippy = "*" [dependencies.steven_gl] diff --git a/README.md b/README.md index 439a35e..4d8d0b3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The Visual Studio 2017 Redistributable is required to run these builds. ## Building -Currently requires SDL2, and **beta or nightly** Rust to build. +Currently requires Rust version 1.31.0-beta or newer to build. Compile and run: ```bash @@ -37,19 +37,8 @@ Just compile: cargo build --release ``` -If you get an error such as: - -``` - = note: ld: library not found for -lSDL2 - clang: error: linker command failed with exit code 1 (use -v to see invocation) -``` - -then you need to install the prerequisites, see below: - ### Prerequisites -Compiling `steven` requires Rust beta and SDL2. Instructions for setting up SDL2 is platform-specific and will be covered as such outside of this section. - An easy way to manage multiple Rust toolchains is [`rustup`](https://github.com/rust-lang-nursery/rustup.rs). Installation instructions for `rustup` can be found on its [website](https://www.rustup.rs/). Once you've set up `rustup`, grab Rust beta by running @@ -62,39 +51,6 @@ Now we need to make sure that `steven` is compiled with beta. To do this without rustup override set beta ``` -### Installing dependencies on Linux -Install SDL2 (with headers) via your distro's package manager. Packages with headers generally end with `-dev`. -For example on Debian-based systems such as Ubuntu Linux: - -```bash -apt-get install -y libsdl2-dev libsdl2-mixer-dev gcc libegl1-mesa-dev libgles2-mesa-dev -``` - -### Installing dependencies on FreeBSD - -Install the SDL2 packages and configure the library path to find them: - -```sh -pkg install sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net sdl2_ttf -export LIBRARY_PATH=/usr/local/lib -``` - -### Installing dependencies on OS X -Installing them is easiest with [Homebrew](http://brew.sh/). To install SDL2 issue this command: - -```bash -brew install sdl2 -``` - -### Installing dependencies on Windows -Install [Visual Studio 2017](https://visualstudio.microsoft.com/vs/older-downloads) -with the Visual C++ option. May build with other compilers, but not tested -(previously was built with MinGW and the GNU toolchain). - -Download [SDL2-devel-2.0.4-VC.zip](https://www.libsdl.org/release/SDL2-devel-2.0.4-VC.zip), extract and -copy SDL2-2.0.4\lib\x64\SDL2.lib to .multirust\toolchains\beta-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib\SDL2.lib -and SDL2-2.0.4\lib\x64\SDL2.dll to target\release. - ## Running ### Standalone diff --git a/appveyor.yml b/appveyor.yml index d43e3fe..e289a92 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,22 +28,12 @@ build_script: cargo -V - appveyor DownloadFile https://www.libsdl.org/release/SDL2-devel-2.0.4-VC.zip -FileName sdl2-dev.zip - - mkdir C:\sdl2 - - 7z x sdl2-dev.zip -oC:\sdl2\ -y - - cp C:\sdl2\SDL2-2.0.4\lib\%PLATFORM%\SDL2.lib C:\Rust\lib\rustlib\%RUST_INSTALL%\lib\SDL2.lib - - cargo build mkdir dist-debug cp target\debug\steven.exe dist-debug - cp C:\sdl2\SDL2-2.0.4\lib\%PLATFORM%\SDL2.dll dist-debug cargo build --release @@ -52,7 +42,6 @@ build_script: cp target\release\steven.exe dist - cp C:\sdl2\SDL2-2.0.4\lib\%PLATFORM%\SDL2.dll dist artifacts: - path: dist diff --git a/src/gl/mod.rs b/src/gl/mod.rs index 4e96bec..7a1fe3d 100644 --- a/src/gl/mod.rs +++ b/src/gl/mod.rs @@ -13,7 +13,7 @@ // limitations under the License. extern crate steven_gl as gl; -use sdl2; +use glutin::GlContext; use std::ops::BitOr; use std::ffi; @@ -22,8 +22,8 @@ use std::ptr; use std::ops::{Deref, DerefMut}; /// Inits the gl library. This should be called once a context is ready. -pub fn init(vid: & sdl2::VideoSubsystem) { - gl::load_with(|s| vid.gl_get_proc_address(s) as *const _); +pub fn init(vid: & glutin::GlWindow) { + gl::load_with(|s| vid.get_proc_address(s) as *const _); } /// Dsed to specify how the vertices will be handled diff --git a/src/main.rs b/src/main.rs index d4f22f3..3050e12 100644 --- a/src/main.rs +++ b/src/main.rs @@ -47,8 +47,8 @@ use std::marker::PhantomData; use std::thread; use std::sync::mpsc; use crate::protocol::mojang; -use sdl2::Sdl; -use sdl2::keyboard; +use glutin; +use glutin::GlContext; const CL_BRAND: console::CVar = console::CVar { ty: PhantomData, @@ -73,8 +73,12 @@ pub struct Game { chunk_builder: chunk_builder::ChunkBuilder, connect_reply: Option>>, - - sdl: Sdl, + dpi_factor: f64, + last_mouse_x: f64, + last_mouse_y: f64, + last_mouse_xrel: f64, + last_mouse_yrel: f64, + is_fullscreen: bool, } impl Game { @@ -145,7 +149,7 @@ impl Game { fn main() { let con = Arc::new(Mutex::new(console::Console::new())); - let (vars, mut vsync) = { + let (vars, vsync) = { let mut vars = console::Vars::new(); vars.register(CL_BRAND); auth::register_vars(&mut vars); @@ -166,28 +170,24 @@ fn main() { let (res, mut resui) = resources::Manager::new(); let resource_manager = Arc::new(RwLock::new(res)); - let sdl = sdl2::init().unwrap(); - let sdl_video = sdl.video().unwrap(); - let mut window = sdl2::video::WindowBuilder::new(&sdl_video, "Steven", 854, 480) - .opengl() - .resizable() - .build() - .expect("Could not create sdl window."); - sdl2::hint::set_with_priority("SDL_MOUSE_RELATIVE_MODE_WARP", "1", &sdl2::hint::Hint::Override); - let gl_attr = sdl_video.gl_attr(); - gl_attr.set_stencil_size(0); - gl_attr.set_depth_size(24); - gl_attr.set_context_major_version(3); - gl_attr.set_context_minor_version(2); - gl_attr.set_context_profile(sdl2::video::GLProfile::Core); + let mut events_loop = glutin::EventsLoop::new(); + let window_builder = glutin::WindowBuilder::new() + .with_title("Steven") + .with_dimensions(glutin::dpi::LogicalSize::new(854.0, 480.0)); + let context = glutin::ContextBuilder::new() + .with_stencil_buffer(0) + .with_depth_buffer(24) + .with_gl(glutin::GlRequest::GlThenGles{opengl_version: (3, 2), opengles_version: (2, 0)}) + .with_gl_profile(glutin::GlProfile::Core) + .with_vsync(vsync); + let mut window = glutin::GlWindow::new(window_builder, context, &events_loop) + .expect("Could not create glutin window."); - let gl_context = window.gl_create_context().unwrap(); - window.gl_make_current(&gl_context).expect("Could not set current context."); - - gl::init(&sdl_video); - - sdl_video.gl_set_swap_interval(if vsync { 1 } else { 0 }); + unsafe { + window.make_current().expect("Could not set current context."); + } + gl::init(&window); let renderer = render::Renderer::new(resource_manager.clone()); let mut ui_container = ui::Container::new(); @@ -199,6 +199,7 @@ fn main() { screen_sys.add_screen(Box::new(screen::Login::new(vars.clone()))); let textures = renderer.get_textures(); + let dpi_factor = window.get_current_monitor().get_hidpi_factor(); let mut game = Game { server: server::Server::dummy_server(resource_manager.clone()), focused: false, @@ -210,18 +211,23 @@ fn main() { should_close: false, chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures), connect_reply: None, - sdl, + dpi_factor, + last_mouse_x: 0.0, + last_mouse_y: 0.0, + last_mouse_xrel: 0.0, + last_mouse_yrel: 0.0, + is_fullscreen: false, }; game.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5); - let mut events = game.sdl.event_pump().unwrap(); while !game.should_close { let now = Instant::now(); let diff = now.duration_since(last_frame); last_frame = now; let delta = (diff.subsec_nanos() as f64) / frame_time; - let (width, height) = window.size(); + let (width, height) = window.get_inner_size().unwrap().into(); + let (physical_width, physical_height) = window.get_inner_size().unwrap().to_physical(game.dpi_factor).into(); let version = { let mut res = game.resource_manager.write().unwrap(); @@ -231,15 +237,17 @@ fn main() { let vsync_changed = *game.vars.get(settings::R_VSYNC); if vsync != vsync_changed { - vsync = vsync_changed; - sdl_video.gl_set_swap_interval(if vsync { 1 } else { 0 }); + println!("Changing vsync currently requires restarting"); + break; + // TODO: after https://github.com/tomaka/glutin/issues/693 Allow changing vsync on a Window + //vsync = vsync_changed; } let fps_cap = *game.vars.get(settings::R_MAX_FPS); game.tick(delta); game.server.tick(&mut game.renderer, delta); - game.renderer.update_camera(width, height); + game.renderer.update_camera(physical_width, physical_height); game.server.world.compute_render_list(&mut game.renderer); game.chunk_builder.tick(&mut game.server.world, &mut game.renderer, version); @@ -249,7 +257,7 @@ fn main() { .unwrap() .tick(&mut ui_container, &game.renderer, delta, width as f64); ui_container.tick(&mut game.renderer, delta, width as f64, height as f64); - game.renderer.tick(&mut game.server.world, delta, width, height); + game.renderer.tick(&mut game.server.world, delta, width, height, physical_width, physical_height); if fps_cap > 0 && !vsync { @@ -259,129 +267,176 @@ fn main() { thread::sleep(sleep_interval - frame_time); } } - window.gl_swap_window(); + window.swap_buffers().expect("Failed to swap GL buffers"); - for event in events.poll_iter() { + events_loop.poll_events(|event| { handle_window_event(&mut window, &mut game, &mut ui_container, event); - } + }); } } -fn handle_window_event(window: &mut sdl2::video::Window, +fn handle_window_event(window: &mut glutin::GlWindow, game: &mut Game, ui_container: &mut ui::Container, - event: sdl2::event::Event) { - use sdl2::event::Event; - use sdl2::keyboard::Keycode; - use sdl2::mouse::MouseButton; - use std::f64::consts::PI; - - let mouse = window.subsystem().sdl().mouse(); - + event: glutin::Event) { + use glutin::*; match event { - Event::Quit{..} => game.should_close = true, + Event::DeviceEvent{event, ..} => match event { + DeviceEvent::MouseMotion{delta:(xrel, yrel)} => { + let (rx, ry) = + if xrel > 1000.0 || yrel > 1000.0 { + // Heuristic for if we were passed an absolute value instead of relative + // Workaround https://github.com/tomaka/glutin/issues/1084 MouseMotion event returns absolute instead of relative values, when running Linux in a VM + // Note SDL2 had a hint to handle this scenario: + // sdl2::hint::set_with_priority("SDL_MOUSE_RELATIVE_MODE_WARP", "1", &sdl2::hint::Hint::Override); + let s = 8000.0 + 0.01; + ((xrel - game.last_mouse_xrel) / s, (yrel - game.last_mouse_yrel) / s) + } else { + let s = 2000.0 + 0.01; + (xrel / s, yrel / s) + }; - Event::MouseMotion{x, y, xrel, yrel, ..} => { - let (width, height) = window.size(); - if game.focused { - if !mouse.relative_mouse_mode() { - mouse.set_relative_mouse_mode(true); - } - if let Some(player) = game.server.player { - let s = 2000.0 + 0.01; - let (rx, ry) = (xrel as f64 / s, yrel as f64 / s); - let rotation = game.server.entities.get_component_mut(player, game.server.rotation).unwrap(); - rotation.yaw -= rx; - rotation.pitch -= ry; - if rotation.pitch < (PI/2.0) + 0.01 { - rotation.pitch = (PI/2.0) + 0.01; + game.last_mouse_xrel = xrel; + game.last_mouse_yrel = yrel; + + use std::f64::consts::PI; + + if game.focused { + window.grab_cursor(true).unwrap(); + window.hide_cursor(true); + if let Some(player) = game.server.player { + let rotation = game.server.entities.get_component_mut(player, game.server.rotation).unwrap(); + rotation.yaw -= rx; + rotation.pitch -= ry; + if rotation.pitch < (PI/2.0) + 0.01 { + rotation.pitch = (PI/2.0) + 0.01; + } + if rotation.pitch > (PI/2.0)*3.0 - 0.01 { + rotation.pitch = (PI/2.0)*3.0 - 0.01; + } } - if rotation.pitch > (PI/2.0)*3.0 - 0.01 { - rotation.pitch = (PI/2.0)*3.0 - 0.01; + } else { + window.grab_cursor(false).unwrap(); + window.hide_cursor(false); + } + }, + + _ => () + }, + + Event::WindowEvent{event, ..} => match event { + WindowEvent::CloseRequested => game.should_close = true, + WindowEvent::Resized(logical_size) => { + game.dpi_factor = window.get_hidpi_factor(); + window.resize(logical_size.to_physical(game.dpi_factor)); + }, + + WindowEvent::ReceivedCharacter(codepoint) => { + if !game.focused { + ui_container.key_type(game, codepoint); + } + }, + + WindowEvent::MouseInput{device_id: _, state, button, modifiers: _} => { + match (state, button) { + (ElementState::Released, MouseButton::Left) => { + let (width, height) = window.get_inner_size().unwrap().into(); + + if game.server.is_connected() && !game.focused && !game.screen_sys.is_current_closable() { + game.focused = true; + window.grab_cursor(true).unwrap(); + window.hide_cursor(true); + return; + } + if !game.focused { + window.grab_cursor(false).unwrap(); + window.hide_cursor(false); + ui_container.click_at(game, game.last_mouse_x, game.last_mouse_y, width, height); + } + }, + (ElementState::Pressed, MouseButton::Right) => { + if game.focused { + game.server.on_right_click(&mut game.renderer); + } + }, + (_, _) => () + } + }, + WindowEvent::CursorMoved{device_id: _, position, modifiers: _} => { + let (x, y) = position.into(); + game.last_mouse_x = x; + game.last_mouse_y = y; + + if !game.focused { + let (width, height) = window.get_inner_size().unwrap().into(); + ui_container.hover_at(game, x, y, width, height); + } + }, + WindowEvent::MouseWheel{device_id: _, delta, phase: _, modifiers: _} => { + // TODO: line vs pixel delta? does pixel scrolling (e.g. touchpad) need scaling? + match delta { + MouseScrollDelta::LineDelta(x, y) => { + game.screen_sys.on_scroll(x.into(), y.into()); + }, + MouseScrollDelta::PixelDelta(position) => { + let (x, y) = position.into(); + game.screen_sys.on_scroll(x, y); + }, + } + }, + WindowEvent::KeyboardInput{device_id: _, input} => { + match (input.state, input.virtual_keycode) { + (ElementState::Released, Some(VirtualKeyCode::Escape)) => { + if game.focused { + window.grab_cursor(false).unwrap(); + window.hide_cursor(false); + game.focused = false; + game.screen_sys.replace_screen(Box::new(screen::SettingsMenu::new(game.vars.clone(), true))); + } else if game.screen_sys.is_current_closable() { + window.grab_cursor(true).unwrap(); + window.hide_cursor(true); + game.focused = true; + game.screen_sys.pop_screen(); + } } - } - } else { - if mouse.relative_mouse_mode() { - mouse.set_relative_mouse_mode(false); - } - ui_container.hover_at(game, x as f64, y as f64, width as f64, height as f64); - } - } - Event::MouseButtonUp{mouse_btn: MouseButton::Left, x, y, ..} => { - let (width, height) = window.size(); + (ElementState::Pressed, Some(VirtualKeyCode::Grave)) => { + game.console.lock().unwrap().toggle(); + }, + (ElementState::Pressed, Some(VirtualKeyCode::F11)) => { + if game.is_fullscreen { + window.set_fullscreen(Some(window.get_current_monitor())); + } else { + window.set_fullscreen(None); + } - if game.server.is_connected() && !game.focused && !game.screen_sys.is_current_closable() { - game.focused = true; - if !mouse.relative_mouse_mode() { - mouse.set_relative_mouse_mode(true); + game.is_fullscreen = !game.is_fullscreen; + }, + (ElementState::Pressed, Some(key)) => { + if game.focused { + if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { + game.server.key_press(true, steven_key); + } + } else { + let ctrl_pressed = input.modifiers.ctrl; + ui_container.key_press(game, key, true, ctrl_pressed); + } + }, + (ElementState::Released, Some(key)) => { + if game.focused { + if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { + game.server.key_press(false, steven_key); + } + } else { + let ctrl_pressed = input.modifiers.ctrl; + ui_container.key_press(game, key, false, ctrl_pressed); + } + }, + (_, None) => () } - return; - } - if !game.focused { - if mouse.relative_mouse_mode() { - mouse.set_relative_mouse_mode(false); - } - ui_container.click_at(game, x as f64, y as f64, width as f64, height as f64); - } - } - Event::MouseButtonDown{mouse_btn: MouseButton::Right, ..} => { - if game.focused { - game.server.on_right_click(&mut game.renderer); - } - } - Event::MouseWheel{x, y, ..} => { - game.screen_sys.on_scroll(x as f64, y as f64); - } - Event::KeyUp{keycode: Some(Keycode::Escape), ..} => { - if game.focused { - mouse.set_relative_mouse_mode(false); - game.focused = false; - game.screen_sys.replace_screen(Box::new(screen::SettingsMenu::new(game.vars.clone(), true))); - } else if game.screen_sys.is_current_closable() { - mouse.set_relative_mouse_mode(true); - game.focused = true; - game.screen_sys.pop_screen(); - } - } - Event::KeyDown{keycode: Some(Keycode::Backquote), ..} => { - game.console.lock().unwrap().toggle(); - } - Event::KeyDown{keycode: Some(Keycode::F11), ..} => { // TODO: configurable binding in settings::Stevenkey - let state = match window.fullscreen_state() { - sdl2::video::FullscreenType::Off => sdl2::video::FullscreenType::Desktop, - sdl2::video::FullscreenType::True => sdl2::video::FullscreenType::Off, - sdl2::video::FullscreenType::Desktop => sdl2::video::FullscreenType::Off, - }; + }, + _ => () + }, - window.set_fullscreen(state).expect(&format!("failed to set fullscreen to {:?}", state)); - } - Event::KeyDown{keycode: Some(key), keymod, ..} => { - if game.focused { - if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { - game.server.key_press(true, steven_key); - } - } else { - let ctrl_pressed = keymod.intersects(keyboard::LCTRLMOD | keyboard::RCTRLMOD); - ui_container.key_press(game, key, true, ctrl_pressed); - } - } - Event::KeyUp{keycode: Some(key), keymod, ..} => { - if game.focused { - if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { - game.server.key_press(false, steven_key); - } - } else { - let ctrl_pressed = keymod.intersects(keyboard::LCTRLMOD | keyboard::RCTRLMOD); - ui_container.key_press(game, key, false, ctrl_pressed); - } - } - Event::TextInput{text, ..} => { - if !game.focused { - for c in text.chars() { - ui_container.key_type(game, c); - } - } - } _ => (), } } diff --git a/src/render/mod.rs b/src/render/mod.rs index bcc538e..2bafbe3 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -283,7 +283,7 @@ impl Renderer { self.frustum = collision::Frustum::from_matrix4(self.perspective_matrix * self.camera_matrix).unwrap(); } - pub fn tick(&mut self, world: &mut world::World, delta: f64, width: u32, height: u32) { + pub fn tick(&mut self, world: &mut world::World, delta: f64, width: u32, height: u32, physical_width: u32, physical_height: u32) { self.update_textures(delta); let trans = self.trans.as_mut().unwrap(); @@ -342,8 +342,8 @@ impl Renderer { trans.main.bind_read(); trans.trans.bind_draw(); gl::blit_framebuffer( - 0, 0, width as i32, height as i32, - 0, 0, width as i32, height as i32, + 0, 0, physical_width as i32, physical_height as i32, + 0, 0, physical_width as i32, physical_height as i32, gl::ClearFlags::Depth, gl::NEAREST ); diff --git a/src/settings.rs b/src/settings.rs index cee3a5d..3cd5121 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -1,6 +1,6 @@ use crate::console; use std::marker::PhantomData; -use sdl2::keyboard::Keycode; +use glutin::VirtualKeyCode; // Might just rename this to settings.rs pub const R_MAX_FPS: console::CVar = console::CVar { @@ -46,7 +46,7 @@ macro_rules! create_keybind { description: $description, mutable: true, serializable: true, - default: &|| Keycode::$keycode as i64 + default: &|| VirtualKeyCode::$keycode as i64 }) } @@ -56,7 +56,7 @@ pub const CL_KEYBIND_LEFT: console::CVar = create_keybind!(A, "cl_keybind_l pub const CL_KEYBIND_RIGHT: console::CVar = create_keybind!(D, "cl_keybind_right", "Keybinding for moving to the right"); pub const CL_KEYBIND_OPEN_INV: console::CVar = create_keybind!(E, "cl_keybind_open_inv", "Keybinding for opening the inventory"); pub const CL_KEYBIND_SNEAK: console::CVar = create_keybind!(LShift, "cl_keybind_sneak", "Keybinding for sneaking"); -pub const CL_KEYBIND_SPRINT: console::CVar = create_keybind!(LCtrl, "cl_keybind_sprint", "Keybinding for sprinting"); +pub const CL_KEYBIND_SPRINT: console::CVar = create_keybind!(LControl, "cl_keybind_sprint", "Keybinding for sprinting"); pub const CL_KEYBIND_JUMP: console::CVar = create_keybind!(Space, "cl_keybind_jump", "Keybinding for jumping"); pub fn register_vars(vars: &mut console::Vars) { @@ -74,7 +74,7 @@ pub fn register_vars(vars: &mut console::Vars) { vars.register(CL_KEYBIND_JUMP); } -#[derive(Hash, PartialEq, Eq)] +#[derive(Hash, PartialEq, Eq, Debug)] pub enum Stevenkey { Forward, Backward, @@ -93,7 +93,7 @@ impl Stevenkey { Stevenkey::Sprint, Stevenkey::Jump) } - pub fn get_by_keycode(keycode: Keycode, vars: &console::Vars) -> Option { + pub fn get_by_keycode(keycode: VirtualKeyCode, vars: &console::Vars) -> Option { for steven_key in Stevenkey::values() { if keycode as i64 == *vars.get(steven_key.get_cvar()) { return Some(steven_key) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 90e6a80..f99b6b9 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -18,7 +18,8 @@ use std::rc::{Rc, Weak}; use std::cell::{RefCell, RefMut}; use crate::render; use crate::format; -use sdl2::keyboard::Keycode; +use glutin::VirtualKeyCode; +use clipboard::{ClipboardProvider, ClipboardContext}; const SCALED_WIDTH: f64 = 854.0; const SCALED_HEIGHT: f64 = 480.0; @@ -183,7 +184,7 @@ macro_rules! define_elements { } } - fn key_press(&self, game: &mut crate::Game, key: Keycode, down: bool, ctrl_pressed: bool) { + fn key_press(&self, game: &mut crate::Game, key: VirtualKeyCode, down: bool, ctrl_pressed: bool) { match *self { $( Element::$name(ref inner) => { @@ -395,8 +396,8 @@ impl Container { focusables[next_focus].set_focused(true); } - pub fn key_press(&mut self, game: &mut crate::Game, key: Keycode, down: bool, ctrl_pressed: bool) { - if key == Keycode::Tab { + pub fn key_press(&mut self, game: &mut crate::Game, key: VirtualKeyCode, down: bool, ctrl_pressed: bool) { + if key == VirtualKeyCode::Tab { if !down { self.cycle_focus(); } @@ -465,7 +466,7 @@ trait UIElement { fn get_size(&self) -> (f64, f64); fn is_dirty(&self) -> bool; fn post_init(_: Rc>) {} - fn key_press(&mut self, _game: &mut crate::Game, _key: Keycode, _down: bool, _ctrl_pressed: bool) {} + fn key_press(&mut self, _game: &mut crate::Game, _key: VirtualKeyCode, _down: bool, _ctrl_pressed: bool) {} fn key_type(&mut self, _game: &mut crate::Game, _c: char) {} fn tick(&mut self, renderer: &mut render::Renderer); } @@ -1309,10 +1310,10 @@ impl TextBoxBuilder { } impl UIElement for TextBox { - fn key_press(&mut self, game: &mut crate::Game, key: Keycode, down: bool, ctrl_pressed: bool) { + fn key_press(&mut self, game: &mut crate::Game, key: VirtualKeyCode, down: bool, ctrl_pressed: bool) { match (key, down) { - (Keycode::Backspace, false) => {self.input.pop();}, - (Keycode::Return, false) => { + (VirtualKeyCode::Back, false) => {self.input.pop();}, + (VirtualKeyCode::Return, false) => { use std::mem; let len = self.submit_funcs.len(); let mut temp = mem::replace(&mut self.submit_funcs, Vec::with_capacity(len)); @@ -1321,12 +1322,12 @@ impl UIElement for TextBox { } self.submit_funcs.append(&mut temp); }, - (Keycode::V, true) => { + (VirtualKeyCode::V, true) => { if ctrl_pressed { - let clipboard = game.sdl.video().unwrap().clipboard(); - if clipboard.has_clipboard_text() { - let text = clipboard.clipboard_text().unwrap(); - self.input.push_str(&text); + let mut clipboard: ClipboardContext = ClipboardProvider::new().unwrap(); + match clipboard.get_contents() { + Ok(text) => self.input.push_str(&text), + Err(_) => () } } },