|
1259 | 1259 | <span id="1259">1259</span>
|
1260 | 1260 | <span id="1260">1260</span>
|
1261 | 1261 | <span id="1261">1261</span>
|
| 1262 | +<span id="1262">1262</span> |
| 1263 | +<span id="1263">1263</span> |
1262 | 1264 | </pre><pre class="rust"><code><span class="kw">use</span> <span class="ident">glow::HasContext</span>;
|
1263 | 1265 | <span class="kw">use</span> <span class="ident">parking_lot</span>::{<span class="ident">Mutex</span>, <span class="ident">MutexGuard</span>};
|
1264 |
| -<span class="kw">use</span> <span class="ident">raw_window_handle</span>::{<span class="ident">HasRawWindowHandle</span>, <span class="ident">RawWindowHandle</span>}; |
| 1266 | +<span class="kw">use</span> <span class="ident">raw_window_handle</span>::{<span class="ident">HasRawDisplayHandle</span>, <span class="ident">HasRawWindowHandle</span>, <span class="ident">RawWindowHandle</span>}; |
1265 | 1267 |
|
1266 | 1268 | <span class="kw">use</span> <span class="ident">std</span>::{<span class="ident">ffi</span>, <span class="ident">os::raw</span>, <span class="ident">ptr</span>, <span class="ident">sync::Arc</span>, <span class="ident">time::Duration</span>};
|
1267 | 1269 |
|
|
2031 | 2033 | <span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">target_os</span> <span class="op">=</span> <span class="string">"macos"</span>, <span class="ident">allow</span>(<span class="ident">unused</span>, <span class="ident">unused_mut</span>, <span class="ident">unreachable_code</span>))]</span>
|
2032 | 2034 | <span class="kw">unsafe</span> <span class="kw">fn</span> <span class="ident">create_surface</span>(
|
2033 | 2035 | <span class="kw-2">&</span><span class="self">self</span>,
|
2034 |
| - <span class="ident">has_handle</span>: <span class="kw-2">&</span><span class="kw">impl</span> <span class="ident">HasRawWindowHandle</span>, |
| 2036 | + <span class="ident">has_handle</span>: <span class="kw-2">&</span>(<span class="kw">impl</span> <span class="ident">HasRawWindowHandle</span> <span class="op">+</span> <span class="ident">HasRawDisplayHandle</span>), |
2035 | 2037 | ) -> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Surface</span>, <span class="ident"><span class="kw">crate</span>::InstanceError</span><span class="op">></span> {
|
2036 | 2038 | <span class="kw">use</span> <span class="ident">raw_window_handle::RawWindowHandle</span> <span class="kw">as</span> <span class="ident">Rwh</span>;
|
2037 | 2039 |
|
|
2040 | 2042 | <span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">any</span>(<span class="ident">target_os</span> <span class="op">=</span> <span class="string">"android"</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">"emscripten"</span>), <span class="ident">allow</span>(<span class="ident">unused_mut</span>))]</span>
|
2041 | 2043 | <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">inner</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">lock</span>();
|
2042 | 2044 |
|
2043 |
| - <span class="kw">match</span> <span class="ident">raw_window_handle</span> { |
2044 |
| - <span class="ident">Rwh::Xlib</span>(<span class="kw">_</span>) => {} |
2045 |
| - <span class="ident">Rwh::Xcb</span>(<span class="kw">_</span>) => {} |
2046 |
| - <span class="ident">Rwh::Win32</span>(<span class="kw">_</span>) => {} |
2047 |
| - <span class="ident">Rwh::AppKit</span>(<span class="kw">_</span>) => {} |
| 2045 | + <span class="kw">match</span> (<span class="ident">raw_window_handle</span>, <span class="ident">has_handle</span>.<span class="ident">raw_display_handle</span>()) { |
| 2046 | + (<span class="ident">Rwh::Xlib</span>(<span class="kw">_</span>), <span class="kw">_</span>) => {} |
| 2047 | + (<span class="ident">Rwh::Xcb</span>(<span class="kw">_</span>), <span class="kw">_</span>) => {} |
| 2048 | + (<span class="ident">Rwh::Win32</span>(<span class="kw">_</span>), <span class="kw">_</span>) => {} |
| 2049 | + (<span class="ident">Rwh::AppKit</span>(<span class="kw">_</span>), <span class="kw">_</span>) => {} |
2048 | 2050 | <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">target_os</span> <span class="op">=</span> <span class="string">"android"</span>)]</span>
|
2049 |
| - <span class="ident">Rwh::AndroidNdk</span>(<span class="ident">handle</span>) => { |
| 2051 | + (<span class="ident">Rwh::AndroidNdk</span>(<span class="ident">handle</span>), <span class="kw">_</span>) => { |
2050 | 2052 | <span class="kw">let</span> <span class="ident">format</span> <span class="op">=</span> <span class="ident">inner</span>
|
2051 | 2053 | .<span class="ident">egl</span>
|
2052 | 2054 | .<span class="ident">instance</span>
|
|
2061 | 2063 | }
|
2062 | 2064 | }
|
2063 | 2065 | <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"emscripten"</span>))]</span>
|
2064 |
| - <span class="ident">Rwh::Wayland</span>(<span class="ident">handle</span>) => { |
| 2066 | + (<span class="ident">Rwh::Wayland</span>(<span class="kw">_</span>), <span class="ident">raw_window_handle::RawDisplayHandle::Wayland</span>(<span class="ident">display_handle</span>)) => { |
2065 | 2067 | <span class="comment">/* Wayland displays are not sharable between surfaces so if the
|
2066 | 2068 | * surface we receive from this handle is from a different
|
2067 | 2069 | * display, we must re-initialize the context.
|
|
2071 | 2073 | <span class="macro">log::warn!</span>(<span class="string">"Re-initializing Gles context due to Wayland window"</span>);
|
2072 | 2074 | <span class="kw">if</span> <span class="ident">inner</span>
|
2073 | 2075 | .<span class="ident">wl_display</span>
|
2074 |
| - .<span class="ident">map</span>(<span class="op">|</span><span class="ident">ptr</span><span class="op">|</span> <span class="ident">ptr</span> <span class="op">!</span><span class="op">=</span> <span class="ident">handle</span>.<span class="ident">display</span>) |
| 2076 | + .<span class="ident">map</span>(<span class="op">|</span><span class="ident">ptr</span><span class="op">|</span> <span class="ident">ptr</span> <span class="op">!</span><span class="op">=</span> <span class="ident">display_handle</span>.<span class="ident">display</span>) |
2075 | 2077 | .<span class="ident">unwrap_or</span>(<span class="bool-val">true</span>)
|
2076 | 2078 | {
|
2077 | 2079 | <span class="kw">use</span> <span class="ident">std::ops::DerefMut</span>;
|
2078 | 2080 | <span class="kw">let</span> <span class="ident">display_attributes</span> <span class="op">=</span> [<span class="ident">egl::ATTRIB_NONE</span>];
|
| 2081 | + |
2079 | 2082 | <span class="kw">let</span> <span class="ident">display</span> <span class="op">=</span> <span class="ident">inner</span>
|
2080 | 2083 | .<span class="ident">egl</span>
|
2081 | 2084 | .<span class="ident">instance</span>
|
2082 | 2085 | .<span class="ident">upcast</span>::<span class="op"><</span><span class="ident">egl::EGL1_5</span><span class="op">></span>()
|
2083 | 2086 | .<span class="ident">unwrap</span>()
|
2084 | 2087 | .<span class="ident">get_platform_display</span>(
|
2085 | 2088 | <span class="ident">EGL_PLATFORM_WAYLAND_KHR</span>,
|
2086 |
| - <span class="ident">handle</span>.<span class="ident">display</span>, |
| 2089 | + <span class="ident">display_handle</span>.<span class="ident">display</span>, |
2087 | 2090 | <span class="kw-2">&</span><span class="ident">display_attributes</span>,
|
2088 | 2091 | )
|
2089 | 2092 | .<span class="ident">unwrap</span>();
|
|
2093 | 2096 | .<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident"><span class="kw">crate</span>::InstanceError</span>)<span class="question-mark">?</span>;
|
2094 | 2097 |
|
2095 | 2098 | <span class="kw">let</span> <span class="ident">old_inner</span> <span class="op">=</span> <span class="ident">std::mem::replace</span>(<span class="ident">inner</span>.<span class="ident">deref_mut</span>(), <span class="ident">new_inner</span>);
|
2096 |
| - <span class="ident">inner</span>.<span class="ident">wl_display</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">handle</span>.<span class="ident">display</span>); |
| 2099 | + <span class="ident">inner</span>.<span class="ident">wl_display</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">display_handle</span>.<span class="ident">display</span>); |
| 2100 | + |
2097 | 2101 | <span class="ident">drop</span>(<span class="ident">old_inner</span>);
|
2098 | 2102 | }
|
2099 | 2103 | }
|
2100 | 2104 | <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"emscripten"</span>)]</span>
|
2101 |
| - <span class="ident">Rwh::Web</span>(<span class="kw">_</span>) => {} |
| 2105 | + (<span class="ident">Rwh::Web</span>(<span class="kw">_</span>), <span class="kw">_</span>) => {} |
2102 | 2106 | <span class="ident">other</span> => {
|
2103 | 2107 | <span class="macro">log::error!</span>(<span class="string">"Unsupported window: {:?}"</span>, <span class="ident">other</span>);
|
2104 | 2108 | <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident"><span class="kw">crate</span>::InstanceError</span>);
|
|
0 commit comments