Commit graph

45 commits

Author SHA1 Message Date
hcpl
7cd440135a Try XOpenIM with different locale modifiers (#424)
* Try XOpenIM with different locale modifiers

Implements the solution suggested in
https://github.com/tomaka/winit/issues/277#issuecomment-337751136.

* Use empty XSetLocaleModifiers beforehand

Also, for modifiers, convert from length-based UTF-8 strings to
null-terminated bytestrings.

* Add CHANGELOG entry and comments
2018-04-05 13:21:50 -04:00
Francesca Frangipane
f3ab8af813
x11: Don't panic when using dead keys (#432) 2018-04-05 12:58:24 -04:00
Francesca Frangipane
d667a395b6 x11: Destroy dropped windows; handle WM_DELETE_WINDOW (#416)
Fixes #79 #414

This changes the implementation of Drop for Window to send a WM_DELETE_WINDOW ClientMessage,
offloading all the cleanup and window destruction to the event loop. Unsurprisingly, this
entails that the event loop now handles WM_DELETE_WINDOW using the behavior that was
previously contained in Window's Drop implementation, along with destroying the Window.
Not only does this mean that dropped windows are closed, but also that clicking the × button
on the window actually closes it now.

The previous implemention of Drop was also broken, as the event loop would be (seemingly
permenanently) frozen after its invocation. That was caused specifically by the mutex
locking, and is no longer an issue now that the locking is done in the event loop.

While I don't have full confidence that it makes sense for the Drop implementation to behave
this way, this is nonetheless a significant improvement. The previous behavior led to
inconsistent state, panics, and event loop breakage, along with not actually destroying the
window.

This additionally makes the assumption that users don't need Focused or CursorLeft events
for the destroyed window, as Closed is adequate to indicate unfocus, and users may not
expect to receive events for closed/dropped windows. In my testing, those specific events
were sent immediately after the window was destroyed, though this sort of behavior could be
WM-specific. I've opted to explicitly suppress those events in the case of the window no
longer existing.
2018-03-23 10:31:31 +01:00
Francesca Sunshine
124b16fcde x11: Always use correct window ID for XInput2 events (#372)
The `CursorMoved` events that are used to send position updates alongside `Focused` and
`CursorEntered` events were using incorrect values for the window ID. This is a direct
result of the X11 backend being hard to understand, as those values came from variables in
the top-level scope of the function, which one would assume to be valid throughout the
entirety of their scope. In reality, their validity is dependent on the event belonging to
the `XEvent` union, so very surprising things can happen if those variables are read in the
case of XInput2/XKB/etc. events. To prevent future accidents, the aforementioned variables
have been removed, and are now defined per-event instead.

Additionally, the `CursorMoved` event sent alongside `Focused` now uses the correct device
ID; it previously used the ID of a master keyboard, but now uses the ID of the pointer
paired to that keyboard. Note that for those using multi-pointer X, the correctness of this
ID is dependent on the correctness of the window manager's focus model.
2018-01-08 11:06:02 +01:00
Bryan Gilbert
011720848a Added modifier support to mouse events (#328) 2017-12-26 22:46:28 +01:00
Francesca Sunshine
8f18dab061
x11: Send window maximization hints correctly (#363)
Previously, the maximization hints were being sent as two separate client messages: one for
horizontal, and one for vertical. That resulted in the window only being maximized
horizontally (at least with my WM). The corrected client message sets both of these hints at
once.

In the process of implementing that, the relevant components were refactored to use the util
module, as we gradually move towards a hopeful future of a more readable X11 backend.
2017-12-15 14:37:09 -05: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
stuart nelson
0f14e63b34 Send mouse position after focused/cursorenter events (#349)
* Update mouse pos after cursor enter event

* Update mouse position on windows focus

* Send device_id

* Update other device id

* Fix windows import

* Remove deque for vec

* Just send event

* Use correct push_back method

* Push correct event
2017-11-26 21:43:13 +01:00
Jacob Kiesel
cfd087d9a5 Mouse events (#344)
* Explicit mouse-related DeviceEvents

This makes the API more intuitive for common use-cases and allows us
to better propagate platform knowledge of motion semantics.

* Improve event naming consistency

* Clarify axis event forwards-compatibility

* Rename WindowEvent::MouseMoved/Entered/Left to CursorMoved/...

This emphasizes the difference between motion of the host GUI cursor,
as used for clicking on things, and raw mouse(-like) input data, as
used for first-person controls.

* Add support for windows and OSX, fix merging

* Fix warnings and errors on Linux

* Remove unnecessary breaking changes

* Add MouseWheel events to windows and OSX

* Fix bad push call.

* Fix docs, naming, and x11 events

* Remove mutability warning

* Add changelog entry
2017-11-12 21:56:57 +01:00
Chris Tolliday
159364bec3 Impl Clone for EventsLoopProxy (#331) 2017-10-25 20:03:57 +02:00
Victor Berger
9c116a1bae x11: uniformize keyboard scancodes with linux (#297) 2017-09-25 07:25:36 +02:00
Matteo Signer
52a78d61bf Fix #273 (#274) 2017-09-21 16:09:07 +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
Benjamin Saunders
c508d68d1d Fix evdev emulated scroll events
When X's evdev input module is configured to emulate scroll events (as
used with e.g. trackpoints), it generates non-emulated scroll button
presses and does not generate motion events. This is contrary to the
behavior of all other hardware I've tested, and contrary to the
behavior of libinput, but nonetheless should be supported.
2017-07-30 11:40:52 -07:00
tomaka
2066909845 Merge pull request #223 from Determinant/xim-send-spot
XIM support for sending spot to IME
2017-07-18 20:09:02 +02:00
Benjamin Saunders
506e830cb0 Fix X11 scroll direction
This was inconsistent with the documented semantics of MouseScrollDelta.
2017-07-17 23:52:28 -07:00
tomaka
2e079fe9a2 Merge pull request #211 from Ralith/transparent-ids
Transparent axis/button IDs
2017-07-17 07:37:26 +02:00
Rukai
e1e21ded28 Fix x11 ModifiersState 2017-07-15 09:58:32 -07:00
Determinant
9cd370fa4c Merge branch 'master' of https://github.com/tomaka/winit into xim-send-spot 2017-07-12 13:46:01 -04:00
Determinant
d6b9faacc9 rename the field 2017-07-12 13:26:11 -04:00
tomaka
9462a51f32 Merge pull request #203 from Determinant/xim-improvement
XIM: Increase the string lookup buffer size and add IC focus/unfocus.
2017-07-12 19:14:11 +02:00
Determinant
8e13f85fac Merge branch 'xim-improvement' into xim-send-spot 2017-07-12 01:24:30 -04:00
Determinant
aea61a74fb remove the the redundant code, fix a bug 2017-07-12 00:00:51 -04:00
Rukai
117beed0b5 Fix x11 mouse scroll wheel 2017-07-11 17:15:23 +10:00
Determinant
75856e0e39 dynamically reallocate buffer; release mutex before callback 2017-07-01 12:24:35 -04:00
Benjamin Saunders
3d9e8da9ec Transparent axis/button IDs 2017-07-01 02:22:02 -07:00
Determinant
5e5debc48f increase the buffer size; proper IC focus/unfocus 2017-06-23 14:27:48 -04:00
mitchmindtree
04ccad1dbc Rename ControlFlow variant from Complete to Break 2017-06-20 21:25:53 +10:00
mitchmindtree
df1276d72a Fix x11 EventsLoopProxy::wakeup implementation using a dummy, InputOnly window 2017-06-17 22:59:56 +10:00
mitchmindtree
4b42af910b Make x11 backend take &mut self in poll_events method 2017-06-09 22:55:48 +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
38856b1c60 X11 - Move event insertion from interrupt to proxy wakeup. 2017-05-31 18:07:51 +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
Joe Wilm
4ec5078bdb Fix poll_events on x11 not draining completely
If the interrupted flag were set going into poll_events, it would only
ever handle the first event in the queue. Now, the flag is reset at the
start so events are processed until the caller requests otherwise.
2017-05-11 23:00:22 -07:00
Joe Wilm
46057d7122 Remove unnecessary locking
For X11 interrupt, we can just use the root window which doesn't require
taking a lock to find.
2017-05-09 21:30:31 -07:00
Joe Wilm
f3db0ba641 Fix x11 interrupt to actually wake event loop
This is the same behavior as with WindowProxy::wakeup_event_loop in
previous versions.

Unfortunately, `EventsLoop::interrupt` is also the recommend way to exit
a `run_forever` loop from within the event handler callback. Pushing an
extra event on the queue in that case is simply wasteful. Changing this
would require a refactor taking one of two possible forms:

1. Add a method *in addition* to interrupt intended for waking up the
   event loop
2. Add a return type to the event callback like

    enum Continue { True, False }

   which would be used in lieu of the atomic interrupt flag.
2017-05-09 09:51:00 -07:00
Joe Wilm
8288d419fd Remove unnecessary mut 2017-05-09 09:50:16 -07:00
Joe Wilm
c92ac695af Fix x11 poll_events to drain queue
It was only processing a single event per call. The docs say

> Fetches all the events that are pending, calls the callback function
> for each of them, and returns.

which suggests that was incorrect.
2017-05-09 09:20:35 -07:00
Joe Wilm
0b75a6b60c Make keyboard input event order consistent
All platforms should now receive events in the following order:

1. KeyboardInput(ElementState::Pressed, ..)
2. ReceivedCharacter
3. KeyboardInput(ElementState::Released, ..)

cc https://github.com/tomaka/glutin/issues/878
2017-05-07 21:16:48 -07: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
9aaa788434 linux: Remove dead code from wayland & fix some trivial warnings. 2017-03-04 11:26:12 +01:00
Victor Berger
624a422f20 linux: move api transition boilerplate to x11/wayland submodules 2017-03-04 09:09:09 +01:00
Victor Berger
4acf437221 Move api module into platform::linux 2017-03-04 09:09:09 +01:00
Renamed from src/api/x11/mod.rs (Browse further)