Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mac file drag and drop #244

Merged
merged 3 commits into from
Aug 18, 2017

Conversation

monomadic
Copy link
Contributor

@monomadic monomadic commented Jul 27, 2017

Here's an implementation for drag and dropping files on Mac OS. I needed to add two events for HoveredFile and HoveredFileCancelled, as without them how are you supposed to update your gui? :)

At the moment, the DropFile only supports one FileBuf, and not an array... which is harder to deal with and you can't reject the drop during hover based on a file filter (say the user drops four valid files and one invalid one). But since there's a windows implementation of this (though it seems buggy/limited to 255 chars) I decided to leave it for now.

I wasn't too sure of winits code conventions, it seems to repeat code in places (like dispatching events) so I have stayed away from adding convenience methods etc. Please let me know if I should do something else to conform to winits approach more.

@monomadic
Copy link
Contributor Author

monomadic commented Aug 2, 2017

...anyone? Just a confirmation or comment would be super appreciated, I'm afraid of branch divergence as it's a fairly active area of the code.

@LPGhatguy
Copy link
Contributor

I'm afraid that most of winit's contributors are centered on either Linux or Windows, which is also demonstrated by the lack of activity on #229.

I don't know who the best person to review Mac changes is.

@monomadic
Copy link
Contributor Author

monomadic commented Aug 2, 2017

Thanks for the reply.

That's an issue then, and it might make more people reluctant to make changes to improve it - I have a few PRs I wanted to put time into for the mac side of things, but I don't want to wait weeks for approval as #229 has - which by the way is another feature I also need. Who has been doing most of the Mac work? How can we change this situation, in my mind at least, having nobody accept these PRs is the reason you're not getting many PRs for mac, it's a catch-22 cycle.

@tomaka
Copy link
Contributor

tomaka commented Aug 2, 2017

It's not like it's a solvable problem.

In the past I've been merging people's PRs for X11 without carefully reviewing them, and now we are in a situation where the X11 backend is a mess that's difficult to read. It would be nice if the same didn't happen to MacOS.

Unfortunately I have zero knowledge about cocoa (I don't even know what that msg_send macro is for), so I can't review myself.

@monomadic
Copy link
Contributor Author

monomadic commented Aug 2, 2017

The msg_send macro is an objc call - cocoa-rs is primary a very shallow bunch of wrapper traits that each include a bunch of wrapper functions that contain calls to the msg_send macro (almost always just 1-line calls actually). However, cocoa-rs is woefully incomplete, so this PR simply calls the objc ffi bridge directly. Pretty much zero difference, but we can of course put a PR into cocoa-rs to add that call (though who knows how long that would take), and it would purely be an organisational change and wouldn't provide any more safety. I would suggest including a msg_send for now and I can make a PR to cocoa-rs if you like, and when that comes in we switch to that.

I believe @mitchmindtree actually sketched out a suggestion for implementing this which is very close to what I've done... perhaps if he's around he might have some insight?

I don't understand what you mean by 'It's not like it's a solvable problem' - are we talking PR requests for the mac module are unsolvable? I was considering adding the mac equivalent of the with_parent functionality recently merged for windows (in the platform specific stuff), but that's a MUCH bigger topic...

I find the response disheartening if that's what you meant, it IS a solvable problem, and if you were put in the same position re: X11 again, you should make the same decision - a few junior-ish devs maintaining a module poorly is better than a rotting module that doesn't work at all and can't keep feature parity, which is what happens if PRs are not able to be merged. Do you really need to personally review every change to each one of your projects? Because the entire rust community has a lot to fear if that's the case.

@tomaka
Copy link
Contributor

tomaka commented Aug 2, 2017

a few junior-ish devs maintaining a module poorly is better than a rotting module that doesn't work at all and can't keep feature parity

It's not like the code "isn't working at all", as you say. It does work right now, and any pull request may break it inadvertently.

Instant A: the X11 module is working fine. Instant B: someone merges a PR that wasn't reviewed carefully enough. Instant C: the X11 module is broken, people open issues or ask me questions on IRC about it, and I have to respond to them. I guess that's my punishment for breaking things, so I have decided that I wouldn't merge non-trivial PRs unless they are reviewed first.

Winit contains unsafe code targetting poorly-designed and poorly-implemented legacy systems that are full of stupid undocumented flaws. If there's one repository whose changes need to be reviewed, it's this one. I'm not asking for a very careful review with stamp saying "this PR is bug-free". All I want is a second eye to catch potential issues.

Do you really need to personally review every change to each one of your projects?

I don't need to personally review changes, but I can't ask for other people to spend their time doing it.

@monomadic
Copy link
Contributor Author

monomadic commented Aug 2, 2017

But you've said that you can't vouch for windows or linux rust code, so you're creating your own paradox here. You need to accept having someone to review changes you can't, anyone is better than no one. Perhaps have a minimum of two people you loosely trust check over each non-windows pr. If unreasonable bugs DO pop up after two people have checked it, you can't blame yourself for that, and you reassess those people involved in the check.

I understand your concerns about quality, but you can't let your past experiences sink the non-windows aspects of these projects. If any company on earth worked on the basis of one person reviewing all code that shipped from the company, that person would immediately become the single point of failure, burn out asap and leave a crater behind. And you're not even being paid :P

I'm trying to be constructive here, and challenge your idea of this being unsolvable, if you truly believe that, maybe revoke the mac and linux modules and focus the library on windows instead. The mac version works for now, but what about in a few months when the new MacOS comes out? What about two years from now? Choosing to support it but not support it is a very turbulent situation to be in.

@tomaka
Copy link
Contributor

tomaka commented Aug 2, 2017

you don't understand even the most basic of windows or linux rust code

No, I only said I wasn't familiar with the MacOS code. I think I'm competent for Windows, Android and Emscripten, and I have the basics of X11. I wrote the initial implementation of X11 by following tutorials.

Perhaps have a minimum of two people you loosely trust check over each non-windows pr. If unreasonable bugs DO pop up after two people have checked it, you can't blame yourself for that, and you reassess those people involved in the check.

I'm totally in favour of this! The problem is that I can't ask people "hey can you please commit to reviewing all winit PRs for platform X"? There's already @Ralith and @mitchmindtree doing that from time to time, and it's great. Hopefully I'm not doing anything that deters any possible contributor, and if I do it's not on purpose.

Choosing to support it but not support it is a very turbulent situation to be in.

To be fair glutin (winit's ancestor) didn't support MacOS at the beginning. The MacOS backend was written by @mitchmindtree and other people, and I merged it. It would unreasonable to remove it now.

@monomadic
Copy link
Contributor Author

monomadic commented Aug 2, 2017

What we used to do at a company I worked at (fairly large team) was have a tag for QA. If a PR had that, the issue would be on hold until two people min had checked it and posted in the thread that they'd checked it and any recommendations before push. Once it had gotten two those people partially owned the issue, so anything that went wrong it was their responsibility to help fix or rewind, as they'd let it slip past.

Every afternoon if we had nothing else to do or had finished work, we'd filter by QA and get issues over the line.

This is open source so it might not be feasible to just let just anyone QA an issue, but perhaps just give some of those who have any history with winit a chance, and newbies to QA-ing can still add their bit (but perhaps just two newbies posting a QA response might not qualify for a PR being pushed). Another rule was of course that you can't QA your own PR.

@tomaka
Copy link
Contributor

tomaka commented Aug 2, 2017

I agree with all these rules, the problem is only manpower. As you said I'm not getting paid, and people who review don't get paid either.

I should probably add a CONTRIBUTING file or something to encourage people to do so, but I'm really not familiar with that. I personally tend to watch the repos I submitted PRs to and then read/review the PRs that touch the code I wrote, but most people probably don't do that.

@monomadic
Copy link
Contributor Author

monomadic commented Aug 2, 2017

Perhaps reduce it to one other person QA the code then, until you have more active mac devs working on it? And then the QA contributor is responsible for helping patch bugs as a rule (otherwise won't really be trusted to QA in the future). Like I could QA that other guys PR on #229 and he could check over mine.

I'm not really sure how to proceed here, I have a lot of things I want in winit on the mac side, and know a great deal about rust-objc, cocoa-rs and winit now (I re-wrote the entire mac module from scratch in my own branch to work with vsts), but don't know how to contribute this code to the main repository. I'm writing my own gui lib and drag and drop is fundamental to that, for example...

@tomaka
Copy link
Contributor

tomaka commented Aug 2, 2017

Well, I guess I could trust your code. If you wrote multiple PRs and even rewrote the entire backend, then you are probably familiar enough with the code to know what you're doing.
I said I wanted code quality, but I'm not too strict either. I just want to avoid PRs that break things.

Anyway, I'm going to leave this PR open for one more day in case someone shows up after this discussion. If it's not the case, please ping and I'll merge it.

@monomadic
Copy link
Contributor Author

Thanks man, I appreciate that. I'll take one more look at it tonight and see if I can improve it before I ping, but it's quite small and doesn't do much (basically just responds to two events). I've documented it but I'll see if I can add anything or wrap any IdRefs which might need wrappers.

@elinorbgr
Copy link
Contributor

Just some though, they are not related to the MacOS implementation (as I know nothing of MacOS), but regarding the impact of this PR on the other backends.

I completely see the value of the two new events you introduced, and I believe they make sense on most platforms. As such the other platforms will likely implement them too at some point.

I'm just wondering: I believe files are not the only thing you can drag&drop into a window. You can also drag text or images or stuff from window to window, can't you? (I reckon this may be quite platform specific here...).

In such case, wouldn't it make sense to directly handle the generic case, for example by putting an enum in the fashion of Event::HoveredContent(ContentType) with something like

pub enum ContentType {
    File(PathBuf),
    Text(String),
    /* maybe other formats ? */
    Other(String /* mime type  */, Vec<u8> /* raw contents */)
}

This idea comes from my understanding of how drag&drop works on wayland. I don't know how it can translate to other platforms, hence my question here.

Copy link
Contributor

@mitchmindtree mitchmindtree left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just tested this on my old mbp running OS X 10.10.5 and it seems to work nicely for multiple windows and handling multiple files. Looks good to me. Thanks!

@mitchmindtree
Copy link
Contributor

I should mention that my mac is no longer my main work environment so it's not as easy for me to review these PRs as it used to be, however I'll attempt to continue to do so when I can while I have one.

@Ralith
Copy link
Contributor

Ralith commented Aug 2, 2017

I'm just wondering: I believe files are not the only thing you can drag&drop into a window. You can also drag text or images or stuff from window to window, can't you? (I reckon this may be quite platform specific here...).

Qt implements drag and drop as "mime type, data" much like the last case of your example, fwiw. Maybe a fully general and forwards-compatible approach would be more like struct Drag { type: String, data: Vec<u8> } with a bunch of From and TryInto impls for common cases?

@monomadic
Copy link
Contributor Author

@Ralith the events returned by the code I wrote are also used by the windows code, so I was as minimally invasive as possible, but left empty stub functions for the future in case we do move to a more general approach. I didn't want to break the windows stuff in some way or write code that did things exceptionally different to the existing stuff.

@Ralith
Copy link
Contributor

Ralith commented Aug 3, 2017

Fair enough!

@monomadic
Copy link
Contributor Author

monomadic commented Aug 4, 2017

@vberger Mac basically does drag and drop the same way copy-paste works, yep! I believe (totally up for re-thinking though) the best approach for the first PR is to get feature parity with the windows version, so that if you implement the existing events it will work across both platforms. I am hoping the next step is for someone to take the 'hovered' event and make that one work on windows too (but supporting it on mac won't break windows support, for example, it just won't have a hover effect for now so I thought that was acceptable).

Macs drag and drop behaviour is more sophisticated than windows (last I checked), it works with a Pasteboard system so receiving a drag-drop event is like having a file pasted onto it and it can contain all kinds of metadata and decide what files it wants to accept or reject or inspect... so the winit implementation could easily get wacky. For example, there's actually also a situation where you can get MULTIPLE types of data (for example, rich text and plan text)...

In the future I'd love to build some way (through a builder method) to register what filetypes you'd like to accept for dropping. Thoughts?

In summary, I feel simple / compatible first is better, I mean the basic framework of extending the event delegate and exposing callbacks is here, so perhaps if we can get this in, the next step could be to experiment in a separate PR and see how we go? Those extensions I imagine would be much more subjective to discussion.

@elinorbgr
Copy link
Contributor

Macs drag and drop behaviour is more sophisticated than windows (last I checked), it works with a Pasteboard system so receiving a drag-drop event is like having a file pasted onto it and it can contain all kinds of metadata and decide what files it wants to accept or reject or inspect... so the winit implementation could easily get wacky. For example, there's actually also a situation where you can get MULTIPLE types of data (for example, rich text and plan text)...

From my understanding of it, Wayland works in a very similar way, this is why I raised this question at first.

I have mixed feelings regarding how to handle that for the future:

  • Either merge it this way, to have things working nicely first, and then upgrade to the full solution handling every possible drag&drop later. This would be yet an other breaking change, but we could get things advance quickly.
  • Either discuss and have a clean future-proof solution now, but it'll necessarily take more time.

I'd tend in favor of the first solution (merging this as is and refining later) as winit is clearly still in a fast-moving phase, and breaking changes are already kind of regular... Thoughts @tomaka @Ralith ?

@monomadic
Copy link
Contributor Author

monomadic commented Aug 13, 2017

blink
any updates here? :d

Copy link

@trishume trishume left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed the code and tested this on my OSX Sierra Macbook with both one and multiple files. Everything looks good to me.

In the future, if you tag me in an issue, I'm happy to review and test OSX-related PRs.

@tomaka
Copy link
Contributor

tomaka commented Aug 18, 2017

Either merge it this way, to have things working nicely first, and then upgrade to the full solution handling every possible drag&drop later. This would be yet an other breaking change, but we could get things advance quickly.

Let's go with this.

@tomaka tomaka merged commit 200ef9c into rust-windowing:master Aug 18, 2017
@monomadic
Copy link
Contributor Author

Thanks, @trishume - if you make PRs for mac please feel free to do the same.

@monomadic monomadic deleted the mac-file-drag-and-drop branch August 26, 2017 04:36
madsmtm added a commit to madsmtm/winit that referenced this pull request Jun 11, 2022
* refactor(windows): `begin_resize_drag` now similar to gtk's (rust-windowing#200)

* refactor(windows): `begin_resize_drag` now similart to gtk's

* fix

* feat(linux): skipping taskbar will now also skip pager (rust-windowing#198)

* refactor(linux): clean dummy device_id (rust-windowing#195)

* refactor(linux): clean dummy device_id

* fmt

* feat(linux): allow resizing undecorated window using touch (rust-windowing#199)

* refactor(windows): only skip taskbar if needed when `set_visible` is called (rust-windowing#196)

* fix: increase borderless resizing inset (rust-windowing#202)

* fix: increase borderless resizing inset

* update some comments

* Replace winapi with windows crate bindings shared with WRY (rust-windowing#206)

* fix(deps): update rust crate libayatana-appindicator to 0.1.6 (rust-windowing#190)

Co-authored-by: Renovate Bot <[email protected]>

* Add Windows crate and webview2-com-sys bindings

* Initial port to webview2-com-sys

* Finish conversion and remove winapi

* Fix renamed lint warning

* Fix all match arms referencing const variables

* Put back the assert instead of expect

* Point to the published version of webview2-com-sys

* Cleanup slightly weird BOOL handling

* Replace mem::zeroed with Default::default

* Add a summary in .changes

* Remove extra projects not in config.json

* Fix clippy warnings

* Update to 32-bit compatible webview2-com-sys

* Better fix for merge conflict

* Fix clippy errors on Windows

* Use path prefix to prevent variable shadowing

* Fix Windows clippy warnings with nightly toolchain

* Fix Linux nightly/stable clippy warnings

* Fix macOS nightly/stable clippy warnings

* Put back public *mut libc::c_void for consistency

* Re-run cargo fmt

* Move call_default_window_proc to util mod

* Remove unnecessary util::to_wstring calls

* Don't repeat LRESULT expression in match arms

* Replace bitwise operations with util functions

* Cleanup more bit mask & shift with util fns

* Prefer from conversions instead of as cast

* Implement get_xbutton_wparam

* Use *mut libc::c_void for return types

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Renovate Bot <[email protected]>

* fix(keyboard): add mapping for space key on Windows (rust-windowing#209)

* fix(keyboard): add mapping for space key on Windows

* change file

* feat: impl Clone for EventLoopWindowTarget (rust-windowing#211)

* chore: add `on_issue_closed.yml` (rust-windowing#214)

* Update tray dependency version (rust-windowing#217)

* Delete on_issue_closed.yml (rust-windowing#221)

* refactor(linux): event loop (rust-windowing#233)

* Use crossbeam::channel

* Fix crossbeam channel import

* Add check on poll event

* Fix deadlock when unregistering shortcut on Linux (rust-windowing#230)

* Add fullscreen monitor selection support on Linux (rust-windowing#235)

* Add fullscreen monitor support on Linux

* Add change file

* Remove todo on videomode

* Fix clippy

* Update to 2021 edition (rust-windowing#236)

* Update to 2021 edition

* Fix clippy

* Add run_return on Linux (rust-windowing#237)

* Add run_return on Linux

* Add main context

* Add run_return trait on Linux (rust-windowing#238)

* Fix: rust-windowing#239 Update webview2-com and windows crates (rust-windowing#240)

* Replace webivew2-com-sys with prebuilt windows

* Use windows utility instead of direct GetLastError

* Bump windows version and add changelog

* Run cargo fmt

* Restore inverted matches macro

* Scope constants in match arms

* Fix inverted null check

* Update src/platform_impl/windows/util.rs

Co-authored-by: Amr Bashir <[email protected]>

* Use env_logger instead of simple_logger (rust-windowing#241)

* Use env_logger instead of simple_logger

* Make clippy happy

* Cherry pick commits to next (rust-windowing#244)

* feat(macos): Add `unhide_application` method, closes rust-windowing#182 (rust-windowing#231)

* feat(macos): Add `unhide_application` method

* Update src/platform/macos.rs

Co-authored-by: Amr Bashir <[email protected]>

* Reanme to `show_application()`

* Remove broken doc link

Co-authored-by: Amr Bashir <[email protected]>

* feat: Allow more strings to parse to keycode (rust-windowing#229)

* feat: support accelerator key strings `,` `-` `.` `Space` `Tab` and `F13`-`F24` (rust-windowing#228)

* feat(macOS): support more accelerator key strings

* Move function keys together

* Add `,` `-` `.` `Space` `F20-F24` for Windows

* Remove support for accelerators not found in `winapi`

* Add `,` `-` `.` `Space` `F13-F24` for Linux

* Update .changes

* Add the rest for Windows

* Add the rest for Linux

* Add the rest on macOS

* Update accelerator-strings.md

* Fix git comments

Co-authored-by: Kasper <[email protected]>
Co-authored-by: Amr Bashir <[email protected]>

* Add redraw events on Linux (rust-windowing#245)

* Add redraw events on Linux

* Update doc of RequestRedraw Event

* Add change file

* Fix missing menu bar on borderless window (rust-windowing#247)

Credit goes to irh's work on winit commit f2de847

* refactor: improve `set_skip_taskbar` impl on Windows (rust-windowing#250)

* fix: emit errors on parsing an invalid accelerator for string, closes rust-windowing#135 (rust-windowing#252)

* chore: update comment

* fix(linux): fix focus events not firing properly (rust-windowing#253)

* fix(linux): fix focus events not firing properly

* add changelog

* chore: update focus events error message

* chore: fmt

* fix: revert windows-rs 0.28 version bump

* fix(linux): fix native menu items (rust-windowing#256)

* chore: remove examples commited by accident

* Update `ReceivedImeText` (rust-windowing#251)

* Allow receiving text without Ime on Windows

* Avoid panic todo

* Receive text without ime on mac

* Fix CursorMoved event on Linux

* Add ReceivedImeText on Linux

This only add Simple IME from GTK for now. We should add the actual IME
from system in the future.

* Fix redraw event that causes inifinite loop (rust-windowing#260)

* Fix redraw event that causes inifinite loop

* Refactor event loop

* Remove unused function

* Add doc comment on linux's run_return

* Ignore doc test on run_return

* Add non blocking iteration on Linux (rust-windowing#261)

* Docs: SystemTrayExtWindows::remove() is gone (rust-windowing#262)

Fix docs following rust-windowing#153

* Fix busy loop on Linux (rust-windowing#265)

* Update windows crate to 0.29.0 (rust-windowing#266)

* Update to windows 0.29.0

* Add change description

* Remove clippy check (rust-windowing#267)

* refactor(windows): align util function with win32 names

* chore: update PR template

* fix(linux): fire resized & moved events on min/maximize, closes rust-windowing#219 (rust-windowing#254)

* feat(linux): implement `raw_window_handle()` (rust-windowing#269)

* chore(deps): update to raw-window-handle 0.4

* add linux raw-window-handle support

* update macos/ios/android

* fix ios

* Fix core-video-sys dependency (rust-windowing#274)

* The `cocoa` crate links to AppKit, which made the symbol `CGDisplayCreateUUIDFromDisplayID` from ApplicationServices/ColorSync (which AppKit uses internally) available to us on macOS 10.8 to 10.13. (rust-windowing#275)

However, this does not work on macOS 10.7 (where AppKit does not link to ColorSync internally). Instead of relying on this, we should just link to ApplicationServices directly.

* Fix some invalid msg_send! usage (rust-windowing#276)

* Revert "Fix some invalid msg_send! usage (rust-windowing#276)" (rust-windowing#277)

This reverts commit a3a2e0cfc49ddfa8cdf65cf9870fb8e3d45b4bc0.

* Revert "The `cocoa` crate links to AppKit, which made the symbol `CGDisplayCreateUUIDFromDisplayID` from ApplicationServices/ColorSync (which AppKit uses internally) available to us on macOS 10.8 to 10.13. (rust-windowing#275)" (rust-windowing#279)

This reverts commit 6f9c468f26ddb60e29be2139397bfaf3b30eab1e.

* The `cocoa` crate links to AppKit, which made the symbol `CGDisplayCreateUUIDFromDisplayID` from ApplicationServices/ColorSync (which AppKit uses internally) available to us on macOS 10.8 to 10.13. (rust-windowing#280)

However, this does not work on macOS 10.7 (where AppKit does not link to ColorSync internally). Instead of relying on this, we should just link to ApplicationServices directly.

Co-authored-by: madsmtm <[email protected]>

* Fix some invalid msg_send! usage (rust-windowing#278)

Co-authored-by: madsmtm <[email protected]>

* Add exit code to ControlFlow::Exit (rust-windowing#281)

* Add exit code to ControlFlow::Exit

* Cargo fmt

* Add change files

Co-authored-by:  multisn8 <[email protected]>

* Add new_any_thread to Unix event loop (rust-windowing#282)

* Update windows crate to 0.30.0 (rust-windowing#283)

* Update windows crate to 0.30.0

* Simplify new-type usage

* Fix boxing in GWL_USERDATA

* Make sure everyone is using Get/SetWindowLongPtrW

* build the system_tray module when "ayatana" feature is enabled (rust-windowing#285)

Without those cfg feature checks, the "ayatana" feature does
actually not enable anything.

* Fix click events missing whe tray has menu (rust-windowing#291)

* Fix click events missing whe tray has menu

* Add change file

* Fix crash when tray has no menu (rust-windowing#294)

* chore: update pull request commit exmple

* fix(windows): send correct position for system tray events, closes rust-windowing#295 (rust-windowing#300)

* fix(windows): revert maximized state handling to winit impl, closes rust-windowing#193 (rust-windowing#299)

* fix(windows): revet maximized state handling to winit impl, closes rust-windowing#193

* add chanefile [skip ci]

* fix: `MenuItem::Quit` on Windows (rust-windowing#303)

* fix: `MenuItem::Close` on Windows

* use `PostQuitMessage` instead

Co-authored-by: amrbashir <[email protected]>

* feat: v1 audit by Radically Open Security (rust-windowing#304)

* Update to gtk 0.15 (rust-windowing#288)

* Update to gtk 0.15

* Fix picky none on set_geometry_hint

* Fix CursorMoved position

Co-authored-by: Amr Bashir <[email protected]>
Co-authored-by: Bill Avery <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Renovate Bot <[email protected]>
Co-authored-by: Lucas Fernandes Nogueira <[email protected]>
Co-authored-by: Kasper <[email protected]>
Co-authored-by: amrbashir <[email protected]>
Co-authored-by: Jay Oster <[email protected]>
Co-authored-by: madsmtm <[email protected]>
Co-authored-by: multisn8 <[email protected]>
Co-authored-by: Aurélien Jacobs <[email protected]>
Co-authored-by: Lucas Fernandes Nogueira <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

7 participants