Commit graph

305 commits

Author SHA1 Message Date
Victor Berger 1e97103094 wayland: migrate to smithay-client-toolkit (#490)
* wayland: migrate to smithay-client-toolkit

* Update smithay-client-toolkit

* Add changelog entry for wayland rework
2018-05-05 13:36:34 -04:00
Francesca Frangipane c4b92ebd45
X11: General cleanup (#491)
* X11: General cleanup

This is almost entirely internal changes, and as usual, doesn't actually
fix any problems people have complained about.

- `XSetInputFocus` can't be called before the window is visible. This
was previously handled by looping (with a sleep) and querying for the
window's state until it was visible. Now we use `XIfEvent`, which blocks
until we receive `VisibilityNotify`. Note that this can't be replaced
with an `XSync` (I tried).
- We now call `XSync` at the end of window creation and check for
errors, assuring that broken windows are never returned. When creating
invisible windows, this is the only time the output buffer is flushed
during the entire window creation process (AFAIK). For visible windows,
`XIfEvent` will generally flush, but window creation has overall been
reduced to the minimum number of flushes.
- `check_errors().expect()` has been a common pattern throughout the
backend, but it seems that people (myself included) didn't make a
distinction between using it after synchronous requests and asynchronous
requests. Now we only use it after async requests if we flush first,
though this still isn't correct (since the request likely hasn't been
processed yet). The only real solution (besides forcing a sync *every
time*) is to handle asynchronous errors *asynchronously*. For future
work, I plan on adding logging, though I don't plan on actually
*handling* those errors; that's more of something to hope for in the
hypothetical async/await XCB paradise.
- We now flush whenever it makes sense to. `util::Flusher` was added to
force contributors to be aware of the output buffer.
- `Window::get_position`, `Window::get_inner_position`,
`Window::get_inner_size`, and `Window::get_outer_size` previously all
required *several* round-trips. On my machine, it took an average of
around 80µs. They've now been reduced to one round-trip each, which
reduces my measurement to 16µs. This was accomplished simply by caching
the frame extents, which are expensive to calculate (due to various
queries and heuristics), but change infrequently and predictably. I
still recommend that application developers use these methods sparingly
and generally prefer storing the values from `Resized`/`Moved`, as
that's zero overhead.
- The above change enabled me to change the `Moved` event to supply
window positions, rather than client area positions. Additionally, we no
longer generate `Moved` for real (as in, not synthetic)
`ConfigureNotify` events. Real `ConfigureNotify` events contain
positions relative to the parent window, which are typically constant
and useless. Since that position would be completely different from the
root-relative positions supplied by synthetic `ConfigureNotify` events
(which are the vast majority of them), that meant real `ConfigureNotify`
events would *always* be detected as the position having changed, so the
resultant `Moved` was multiple levels of misleading. In practice, this
meant a garbage `Moved` would be sent every time the window was resized;
now a resize has to actually change the window's position to be
accompanied by `Moved`.
- Every time we processed an `XI_Enter` event, we would leak 4 bytes via
`util::query_pointer` (`XIQueryPointer`). `XIButtonState` contains a
dynamically-allocated mask field which we weren't freeing. As this event
occurs with fairly high frequency, long-running applications could
easily accumulate substantial leaks. `util::PointerState::drop` now
takes care of this.
- The `util` module has been split up into several sub-modules, as it
was getting rather lengthy. This accounts for a significant part of this
diff, unfortunately.
- Atoms are now cached. Xlib caches them too, so `XInternAtom` wouldn't
typically be a round-trip anyway, but the added complexity is
negligible.
- Switched from `std::sync::Mutex` to `parking_lot::Mutex` (within this
backend). There appears to be no downside to this, but if anyone finds
one, this would be easy to revert.
- The WM name and supported hints are now global to the application, and
are updated upon `ReparentNotify`, which should detect when the WM was
replaced (assuming a reparenting WM was involved, that is). Previously,
these values were per-window and would never update, meaning replacing
the WM could potentially lead to (admittedly very minor) problems.
- The result of `Window2::create_empty_cursor` will now only be used if
it actually succeeds.
- `Window2::load_cursor` no longer re-allocates the cursor name.
- `util::lookup_utf8` previously allocated a 16-byte buffer on the heap.
Now it allocates a 1024-byte buffer on the stack, and falls back to
dynamic allocation if the buffer is too small. This base buffer size is
admittedly gratuitous, but less so if you're using IME.
- `with_c_str` was finally removed.
- Added `util::Format` enum to help prevent goofs when dealing with
format arguments.
- `util::get_property`, something I added way back in my first winit PR,
only calculated offsets correctly for `util::Format::Char`. This was
concealed by the accomodating buffer size, as it would be very rare for
the offset to be needed; however, testing with a buffer size of 1,
`util::Format::Long` would read from the same offset multiple times, and
`util::Format::Short` would miss data. This function now works correctly
for all formats, relying on the simple fact that the offset increases by
the buffer size on each iteration. We also account for the extra byte
that `XGetWindowProperty` allocates at the end of the buffer, and copy
data from the buffer instead of moving it and taking ownership of the
pointer.
- Drag and drop now reliably works in release mode. This is presumably
related to the `util::get_property` changes.
- `util::change_property` now exists, which should make it easier to add
features in the future.
- The `EventsLoop` device map is no longer in a mutex.
- `XConnection` now implements `Debug`.
- Valgrind no longer complains about anything related to winit (with
either the system allocator or jemalloc, though "not having valgrind
complain about jemalloc" isn't something to strive for).

* X11: Add better diagnostics when initialization fails

* X11: Handle XIQueryDevice failure

* X11: Use correct types in error handler
2018-05-03 09:15:49 -04:00
Francesca Frangipane eadd9a19b2
Replace Closed event with CloseRequested and Destroyed (#476)
* Replace Closed event with CloseRequested and Destroyed

Implements #434

The existing Closed event had ambiguous meaning, both in name and in
cross-platform behavior. Closed is now split into two more precise events:

* CloseRequested - the window has been requested to close, most commonly by
having clicked the window's close button. Whether or not you respond by
closing the window is up to you.

* Destroyed - the window has been destroyed, and can no longer be safely
used.

Most notably, now you can reliably implement classic patterns like
prompting the user to save their work before closing, and have the
opportunity to perform any necessary cleanup.

Migrating to the new API is straightforward. In most cases, you can simply
replace all existing usages of Closed with CloseRequested. For more
information, see the example programs, particularly handling_close and
multiwindow.

iOS applications must replace all usages of Closed with Destroyed, and
require no other changes.
2018-04-24 16:20:40 -04:00
Edwin Cheng bdc01fee1a Implement set_maximized, get_current_monitor, set_fullscreen and set_decorations for windows (#457)
* Implement set_fullscreen for windows

* Implement get_current_monitor for windows

* Implement set_maximized

* Implement set_decorations for windows

* Update CHANGELOG.md

* Fixed minor syntax bug for stable rust version

* Added support for WindowBuilder::with_maximized

* Move all window sized related functions to main thread

* Refactor and formatting force_window_active

* Remove unused code

* Update CHANGELOG.md

* Refactor and change keyboard handling code

* Reformatting and refactoring

* Added back missing link for comment

* Fixed set_maximized and set_fullscreen wrong order bug

* Call ShowWindow(SW_RESTORE) when restore_saved_window

* Sync system maximized status when set_fullscreen

* Fixed wrong function name
2018-04-12 13:12:15 -04:00
Gabriel Majeri d92666c188 Update winapi to 0.3 (#346)
* Update to `winapi` 0.3

* Update max size comment

* Fix missing import

* Shorten import path

* Update to stable winapi version
2017-12-24 14:46:47 +01:00
Francesca Sunshine d18db208ff x11: Implement file drag and drop (#360)
* x11: Implement file drag and drop

* Fixed typo
2017-12-13 12:22:03 +01:00
Gabriel Majeri bbf13561b5 Fix docs rendering (#340) 2017-11-05 11:21:57 +01:00
Andriy Symonovych 37a10e6741 update macos deps (#335) 2017-10-31 11:03:18 +01:00
Chris Tolliday 159364bec3 Impl Clone for EventsLoopProxy (#331) 2017-10-25 20:03:57 +02:00
Victor Berger 229029f2da Formalize thread-safety guarantees (#322) 2017-10-18 20:40:21 +02:00
David Harvey-Macaulay df7e349c70 Complete documentation for top-level items (#299) 2017-09-25 15:58:59 +02:00
tomaka f81a0741f5 Fixes to the documentation of EventsLoop (#288) 2017-09-17 19:59:36 +02:00
tomaka ae7802c8c2 Fix warnings for win32 (#283) 2017-09-13 11:15:16 +02:00
Pedro Côrte-Real 59c33d2c6a Move fullscreen modes to not touch physical resolutions (#270)
* Fix X11 screen resolution change using XrandR

The previous XF86 resolution switching was broken and everything
seems to have moved on to xrandr. Use that instead while cleaning
up the code a bit as well.

* Use XRandR for actual multiscreen support in X11

* Use actual monitor names in X11

* Get rid of ptr::read usage in X11

* Use a bog standard Vec instead of VecDeque

* Get rid of the XRandR mode switching stuff

Wayland has made the decision that apps shouldn't change screen
resolutions and just take the screens as they've been setup. In the
modern world where GPU scaling is cheap and LCD panels are scaling
anyway it makes no sense to make "physical" resolution changes when
software should be taking care of it. This massively simplifies the
code and makes it easier to extend to more niche setups like MST and
videowalls.

* Rename fullscreen options to match new semantics

* Implement XRandR 1.5 support

* Get rid of the FullScreen enum

Moving to just having two states None and Some(MonitorId) and then
being able to set full screen in the current monitor with something
like:

window.set_fullscreen(Some(window.current_monitor()));

* Implement Window::get_current_monitor()

Do it by iterating over the available monitors and finding which
has the biggest overlap with the window. For this MonitorId needs
a new get_position() that needs to be implemented for all platforms.

* Add unimplemented get_position() to all MonitorId

* Make get_current_monitor() platform specific

* Add unimplemented get_current_monitor() to all

* Implement proper primary monitor selection in X11

* Shut up some warnings

* Remove libxxf86vm package from travis

Since we're no longer using XF86 there's no need to keep the package
around for CI.

* Don't use new struct syntax

* Fix indentation

* Adjust Android/iOS fullscreen/maximized

On Android and iOS we can assume single screen apps that are already
fullscreen and maximized so there are a few methods that are implemented
by just returning a fixed value or not doing anything.

* Mark OSX/Win fullscreen/maximized unimplemented()!

These would be safe as no-ops but we should make it explicit so
there is more of an incentive to actually implement them.
2017-09-07 10:33:46 +02:00
tomaka 342d5d8587 Remove api_transition macro (#279)
* Remove api_transition macro

* Rename Window2 to Window

* Try fix X11 code
2017-09-06 17:32:24 +02:00
Pedro Côrte-Real 5b57b73fe8 Remove dead code causing warnings (#278) 2017-09-04 08:45:56 +02:00
tomaka 3d1c18ded9 Events loop backend (#269)
* Don't use UNIX_BACKEND in Window2::new

* Move get_available_monitors and get_primary_monitor to EventsLoop

* Remove UNIX_BACKEND

* Restore choosing the Linux backend

* Return a XNotSupported for new_x11()

* Fix fullscreen example
2017-09-01 11:04:57 +02:00
tomaka 7dc6fcdedc Rework MonitorId::get_native_identifier (#267)
* Rework MonitorId::get_native_identifier

* Try fix compilation

* Returns the monitor ID on wayland as well

* Try fix compilation

* Fix iOS compilation
2017-08-30 08:49:18 +02:00
Pedro Côrte-Real 60b575a7c1 Get rid of FullScreenState::get_monitor() 2017-08-29 02:53:13 +01:00
Pedro Côrte-Real 1382adbf11 Unify fullscreen and fullscreen_windowed APIs
Use the enum to make a single fullscreen API that's much more
consistent. Both set_fullscreen() and with_fullscreen() take the
same enum and support all the variations so you can build the window
however you want and switch between the modes at runtime.
2017-08-29 01:36:24 +01:00
Pedro Côrte-Real 1d97a2a506 Implement Windowed Fullscreen
There are two kinds of fullscreen. One where you take over the whole
output the other where you just set the window size to the screen
size and get rid of decorations. The first one already existed,
implement the second which is more common for normal desktop apps.
Use an enum to consolidate all the fullscreen states.
2017-08-28 02:23:55 +01:00
Pedro Côrte-Real a4052b8693 Add window maximization API
Implement a simple API to set a window to maximized. Implement it
only for the X11 backend.
2017-08-28 01:28:42 +01:00
Lloyd Cunningham f81d6ddf93 Derive Clone for CreationError 2017-08-23 20:52:06 -05:00
tomaka 2e079fe9a2 Merge pull request #211 from Ralith/transparent-ids
Transparent axis/button IDs
2017-07-17 07:37:26 +02:00
Pierre Krieger ac0d6c890a Remove dependency on cgl on OSX 2017-07-05 09:13:39 +02:00
Benjamin Saunders 3d9e8da9ec Transparent axis/button IDs 2017-07-01 02:22:02 -07:00
Victor Berger 05cd9f2114 Merge pull request #199 from alexheretic/xwayland-env-var
Add a `WINIT_UNIX_BACKEND` environment variable to all the user to control the choice of x11/wayland backend.
2017-06-25 10:40:05 +02:00
Victor Berger e915454a9d linux: update wayland dependencies 2017-06-23 20:25:06 +02:00
Alex Butler 3a89843767 Add WINIT_UNIX_BACKEND documentation 2017-06-21 20:10:23 +01:00
mitchmindtree 04ccad1dbc Rename ControlFlow variant from Complete to Break 2017-06-20 21:25:53 +10:00
mitchmindtree db9e80bdb6 Update examples and tests to addition of ControlFlow 2017-06-08 00:12:41 +10:00
mitchmindtree f2dd2f0752 WIP - Make poll_events and run_forever take &mut self
This removes the need for the EventsLoop::interrupt method by inroducing
a ControlFlow type. This new type is to be returned by the user's
callback and indicates whether the `EventsLoop` should continue waiting
for events or break from the loop.

Only the wayland, x11 and api_transition backends have been updated so
far, and only the wayland backend has actually been tested.
2017-06-02 21:19:45 +10:00
mitchmindtree f6587aed39 [WIP] Have EventsLoopProxy::wakeup return a Result. Begin linux impl.
X11 and Wayland implementations are now half implemented, however both
still do not correctly break from the inner blocking event dispatch
functions when `wakeup` is called, which they should do.
2017-05-25 23:19:13 +10:00
mitchmindtree 06a5ec35b3 [WIP] Remove Sync and Clone from EventsLoop. Add EventsLoopProxy.
This commit only updates the top-level API to get some early feedback.
None of the platform-specific code has been updated yet. I'm hoping to
get around to this over the next couple days however if someone more
familiar with the windows backend would like to do a PR against this
fork that would be a great help.

Closes #187.
2017-05-25 20:13:54 +10:00
Joe Wilm 55b5054d50 Derive Clone on winit::EventsLoop wrapper
Resolves #177.
2017-05-11 23:04:28 -07:00
vanderlokken f034017ab2 FIxed obsolete strings 2017-05-11 03:14:38 +03:00
Benjamin Saunders 22bc119cd7 Richer input events
This expands input events to represent sub-pixel mouse positions, devices responsible for generating events, and raw
device-oriented events. The X11 back end is refactored to make full use of the new expressiveness. Other backends have
had new functionality minimally stubbed out, save for the macos backend which already supports sub-pixel mouse
positions.
2017-04-23 01:08:15 -07:00
Victor Berger 4acf437221 Move api module into platform::linux 2017-03-04 09:09:09 +01:00
Pierre Krieger b988c174fe Add WindowId type 2017-02-03 09:13:11 +01:00
Pierre Krieger 9cd0430ec7 Remove stuff from Window's API 2017-02-03 06:48:58 +01:00
Pierre Krieger c3d2289b0c Remove resize_callback from WindowsAttributes 2017-01-28 15:34:15 +01:00
Pierre Krieger bcb242983b Add documentation for the new API 2017-01-28 15:33:54 +01:00
Pierre Krieger 0242daa242 Add interrupting the events loop 2017-01-28 15:09:01 +01:00
Pierre Krieger 422b332c1b Add a transition macro system 2017-01-28 15:00:17 +01:00
tomaka f1d70d351e Merge pull request #82 from tomaka/documentation
Some documentation improvements
2017-01-28 13:31:36 +01:00
mitchmindtree 53065bda40 Move resize_callback field from WindowBuilder into WindowAttributes struct 2016-11-12 02:55:21 +11:00
mitchmindtree eb18b3d8b6 Add a WindowBuilder::with_window_resize_callback method.
This allows for passing the window_resize_callback fn during the window
building stage. More importantly, this allows setting the callback
without the need for mutable access to the Window, making it possible
to set the callback in the downstream glium crate.

This may solve tomaka/glium#1232 for most folk.
2016-11-11 22:08:46 +11:00
Pierre Krieger 2c58e85584 Some documentation improvements 2016-11-06 09:51:20 +01:00
Victor Berger a505eddf29 wayland: bases of backend and output handling 2016-10-09 16:08:10 +02:00
Andrey Lesnikov 7f6ae8910e Merge https://github.com/tomaka/glutin
Conflicts:
	.travis.yml
	Cargo.toml
	examples/fullscreen.rs
	src/api/android/mod.rs
	src/api/cocoa/headless.rs
	src/api/cocoa/helpers.rs
	src/api/cocoa/mod.rs
	src/api/glx/mod.rs
	src/api/osmesa/mod.rs
	src/api/win32/callback.rs
	src/headless.rs
	src/lib.rs
	src/platform/linux/mod.rs
	src/window.rs
2016-09-19 19:53:28 +03:00
Victor Koenders 5ce48523cd Added a couple more PartialEq's 2016-08-17 20:42:45 +02:00
Jan Segre e0f36b80c9 Make WindowBuilder and HeadlessRendererBuilder derive Clone. 2016-05-23 03:17:31 -03:00
Osspial b2cf70b342 Fixed some warnings when building on Windows 2016-05-07 21:05:45 -04:00
Corey Farwell dc49156fe6 Allow OSX WindowBuilder to specify 'activation behavior'. 2016-04-29 10:43:30 -04:00
Pierre Krieger d216d6b052 Merge remote-tracking branch 'glutin/master' into merge-glutin
Conflicts:
	Cargo.toml
	build.rs
	src/api/caca/mod.rs
	src/api/cocoa/mod.rs
	src/api/egl/ffi.rs
	src/api/egl/mod.rs
	src/api/glx/mod.rs
	src/api/osmesa/mod.rs
2016-03-26 17:55:03 +01:00
Kirill Zdornyy 74a28adba2 Fix this_platform_is_not_supported on OpenBSD.
I followed the steps of @mneumann.
2016-03-01 18:06:13 -08:00
Pierre Krieger 10bb03c5f0 Remove most OpenGL stuff and make it compile on win32 2016-02-23 12:56:23 +01:00
Pierre Krieger 982279bc39 Update the emscripten port of glutin 2016-02-09 14:25:21 +01:00
Victor Berger 508e8cf665 Fix EGL for wayland. 2016-01-03 12:19:53 +01:00
Victor Berger fad2e77a36 api/wayland: Reset to empty API.
In order to build the whole new structure.
2015-12-22 14:36:41 +01:00
Pierre Krieger ed1d76aaee Remove now unneeded function 2015-12-19 14:36:49 +01:00
Pierre Krieger 95a60ee329 Switch WGL to ChoosePixelFormat 2015-12-19 13:06:50 +01:00
Pierre Krieger 0b6418fabb Change PixelFormatRequirements 2015-12-19 11:32:51 +01:00
Aceeri c6ffedccbd Removed comments, fixed Some/None matches, removed unnecessary lock checks 2015-11-09 03:13:52 -08:00
Aceeri 78eb4a5990 Minimum/maximum dimensions for windows in win32 api 2015-11-09 01:42:54 -08:00
mitchmindtree b02265fa11 Update to libc 0.2, remove unnecessary gl_common crate 2015-11-09 08:47:12 +01:00
Pierre Krieger 37262fb228 Remove public exports of gl_common and libc 2015-11-09 08:46:52 +01:00
Pierre Krieger 7a625ef3d8 Remove the window feature entirely 2015-10-03 10:33:37 +02:00
Pierre Krieger 8c6a27d426 Add an os module containing platform-specific traits 2015-10-03 09:53:37 +02:00
Josh Matthews 77b3743117 Warning fixes for OS X. 2015-09-28 12:19:36 -04:00
Pierre Krieger 86fa1b58e5 Rename MonitorID -> MonitorId 2015-09-24 09:11:59 +02:00
Pierre Krieger aa9cb99929 Add #[inline] attributes 2015-09-23 13:11:47 +02:00
Tim Neumann 9f6806ba2e make glutin compile on all iOS targets 2015-09-21 18:57:35 +02:00
Pierre Krieger 62bafe2130 Remove BuilderAttribs 2015-09-21 14:03:05 +02:00
Pierre Krieger 932e565391 Remove extract_non_static 2015-09-21 12:03:58 +02:00
Pierre Krieger 3054e2ee02 Switch EGL to use only pf_reqs and opengl 2015-09-21 12:03:57 +02:00
Pierre Krieger 3ff08d747c Add GlAttributes::map_sharing 2015-09-21 12:03:56 +02:00
Pierre Krieger 58b3bfb4fb Extract PixelFormatRequirements from BuilderAttribs 2015-09-21 12:03:56 +02:00
Pierre Krieger 48fe9b2644 Extract WindowAttributes from the BuilderAttribs 2015-09-21 12:03:55 +02:00
Pierre Krieger c244f8c033 Extract GlAttributes from BuilderAttribs 2015-09-21 12:03:55 +02:00
Pierre Krieger b9a4f5fbe9 Err when a X connection cannot be created instead of panicking 2015-09-20 08:42:32 +02:00
Michael Neumann b707959c2c Make it work on DragonFly/FreeBSD
Tested on DragonFly BSD. Should work similarily on FreeBSD.
2015-08-30 13:52:09 +02:00
Sven Nilsen ce13975f15 Removed dot in error message
Closes https://github.com/tomaka/glutin/issues/562
2015-08-05 12:10:38 +02:00
Braden Evans 3b76b01cce Typo in error message 2015-08-04 18:02:55 -07:00
Braden Evans 9bcfad9f75 Implement Display, Error for ContextError 2015-08-04 18:01:38 -07:00
Pierre Krieger 2d4c382f0b Better choice for the pixel format 2015-07-25 15:57:03 +02:00
Pierre Krieger 7fe828bed3 Add smaall TODO 2015-07-20 19:43:36 +02:00
Pierre Krieger 57a1d546e7 Add CreationError::NoAvailablePixelFormat 2015-07-20 19:42:32 +02:00
Pierre Krieger 43dabf131a Add CreationError::OpenGlVersionNotSupported 2015-07-20 19:38:57 +02:00
Pierre Krieger ba5adfa1e1 Add CreationError::RobustnessNotSupported 2015-07-20 19:34:34 +02:00
Pierre Krieger baf9b92d3f Correct window creation on X11 2015-07-19 13:53:40 +02:00
tomaka bb96e8a58a Merge pull request #511 from thelink2012/drop-win32
[0.3] DroppedFile event for Win32
2015-07-09 11:06:38 +02:00
tomaka 836e53e55a Merge pull request #477 from rozaliev/feature/ios
[WIP] ios support
2015-06-29 09:29:46 +02:00
Pierre Krieger bff79c02ce Add support for the EGL_KHR_create_context_no_error extension 2015-06-25 09:35:58 +02:00
Denilson M. Amorim 826931e2c2 DroppedFile event for Win32 2015-06-23 19:05:37 -03:00
tomaka 40b84577c3 Merge pull request #497 from tomaka/robustness
Add with_robustness and handle robustness on all implementations
2015-06-23 16:46:52 +02:00
Pierre Krieger dbaca24cde Add with_robustness and handle robustness on all implementations 2015-06-22 19:42:03 +02:00
Pierre Krieger 3c889636ad Makes sure that the pf has the same multisampling settings as the requirements 2015-06-21 13:07:24 +02:00
tomaka 90b28c2052 Merge pull request #486 from tomaka/context-error
Handle errors from MakeCurrent and SwapBuffers
2015-06-17 07:36:00 +02:00
Pierre Krieger f6c26ec593 Handle errors from MakeCurrent and SwapBuffers 2015-06-16 10:44:44 +02:00