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

swhkd does not process hotkeys of newly connected devices #162

Closed
ajanon opened this issue Sep 14, 2022 · 42 comments · Fixed by #217
Closed

swhkd does not process hotkeys of newly connected devices #162

ajanon opened this issue Sep 14, 2022 · 42 comments · Fixed by #217
Assignees
Labels
Bug Something isn't working Component: daemon Difficulty: high Priority: high High priority tasks

Comments

@ajanon
Copy link
Collaborator

ajanon commented Sep 14, 2022

Version Information:

  • Linux arch-dktp-alexis 5.19.6-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 31 Aug 2022 22:09:40 +0000 x86_64 GNU/Linux
  • swhkd 1.2.1 (installed from the swhkd-git AUR package)

Describe the bug:
swhkd does not register hotkeys from a newly connected keyboard (or disconnected then reconnected).

Expected behavior:
swhkd should be able to register hotkeys on a newly connected keyboard.

Actual behavior:
swhkd does not grab newly connected devices and thus cannot handle their keypresses events.

To Reproduce:
Start swhkd. Connect a keyboard (or disconnect yours before reconnecting it). Hotkeys will not work.

Additional information:
This can probably be solved using udev, with either the udev crate or tokio-udev crate.

My attempts at implementing this (the same content is also in the [wip] commits of each branch):

  • Using the tokio-udev crate (udev_async branch):

    This does not work as-is. Unfortunately, sometimes udev events get 'stuck' and only processed after another batch of events comes in. In practice, this translates to e.g. a batch of 'Add' events (after connecting a device) only passed to the application loop after a batch of 'Remove' events (after disconnecting the same device for instance).

  • Using the udev crate iterators wrapped in a tokio stream (udev_sync branch):

    This does not work as-is, as the MonitorSocket Iterator may return None when no udev events are available. tokio stops listening after the first None received from the stream, which means that events are not listened to at all.

  • Using the udev crate with a busy loop (udev_sync_busy branch):

    At the cost of an always busy thread, this does receive all udev events in a timely manner.

The busy loop is the only one which is working, but also the worst performance-wise. See this one more as a proof of concept.

@ajanon ajanon added the Bug Something isn't working label Sep 14, 2022
@ajanon
Copy link
Collaborator Author

ajanon commented Sep 14, 2022

MWE for each implementation

Each exemple prints events from the 'input' subsystem as they are received. Each log is prefixed by a basic timestamp to highlight the difference between the actual physical event and the time it is passed to the application.

Busy loop

use std::error::Error;
use std::time::{SystemTime, UNIX_EPOCH};
use tokio::select;
use tokio_stream::StreamExt;
use udev::MonitorBuilder;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let mut udev = tokio_stream::iter(MonitorBuilder::new()?.match_subsystem("input")?.listen()?);
    loop {
        select! {
            udev_item = udev.next() => {
                if udev_item.is_none() {
                    continue;
                }
                let event = udev_item.unwrap();
                println!("[{:?}] '{:?}' event - devnode: {:?}",
                         SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(),
                         event.event_type(),
                         event.devnode());
            }
        }
    }
}

On my computer, when disconnecting and reconnecting my keyboard, this gives:

[1663146489] 'Remove' event - devnode: Some("/dev/input/event3")
[1663146489] 'Remove' event - devnode: None
[1663146489] 'Remove' event - devnode: Some("/dev/input/event5")
[1663146489] 'Remove' event - devnode: None
[1663146489] 'Remove' event - devnode: Some("/dev/input/event6")
[1663146489] 'Remove' event - devnode: None
[1663146489] 'Remove' event - devnode: Some("/dev/input/event7")
[1663146489] 'Remove' event - devnode: None
[1663146489] 'Remove' event - devnode: Some("/dev/input/event8")
[1663146489] 'Remove' event - devnode: None
[1663146491] 'Add' event - devnode: None
[1663146491] 'Add' event - devnode: None
[1663146491] 'Add' event - devnode: None
[1663146491] 'Add' event - devnode: None
[1663146491] 'Add' event - devnode: None
[1663146491] 'Add' event - devnode: Some("/dev/input/event5")
[1663146491] 'Add' event - devnode: Some("/dev/input/event7")
[1663146491] 'Add' event - devnode: Some("/dev/input/event6")
[1663146491] 'Add' event - devnode: Some("/dev/input/event8")
[1663146491] 'Add' event - devnode: Some("/dev/input/event3")

Sync loop

Replace the inner loop with:

        select! {
            Some(event) = udev.next() => {
                println!("[{:?}] '{:?}' event - devnode: {:?}",
                         SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(),
                         event.event_type(),
                         event.devnode());
            }
            else => {}
        }

This does work in this example, but events are ignored when trying the same thing in swhkd. I think this is because the stream is ignored by tokio on the first None it returns.

Async

use std::error::Error;
use std::time::{SystemTime, UNIX_EPOCH};
use tokio::select;
use tokio_stream::StreamExt;
use tokio_udev::{AsyncMonitorSocket, MonitorBuilder};

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let mut udev = AsyncMonitorSocket::new(MonitorBuilder::new()?.match_subsystem("input")?.listen()?)?;
    loop {
        select! {
            Some(Ok(event)) = udev.next() => {
                println!("[{:?}] '{:?}' event - devnode: {:?}",
                         SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(),
                         event.event_type(),
                         event.devnode());
            }
        }
    }
}

For two disconnections/reconnections, this gives me (late events in bold):

[1663146903] 'Remove' event - devnode: Some("/dev/input/event3")
[1663146903] 'Remove' event - devnode: None
[1663146903] 'Remove' event - devnode: Some("/dev/input/event5")
[1663146903] 'Remove' event - devnode: None
[1663146903] 'Remove' event - devnode: Some("/dev/input/event6")
[1663146903] 'Remove' event - devnode: None
[1663146903] 'Remove' event - devnode: Some("/dev/input/event7")
[1663146903] 'Remove' event - devnode: Some("/dev/input/event8")
[1663146903] 'Remove' event - devnode: None
[1663146919] 'Remove' event - devnode: None
[1663146919] 'Add' event - devnode: None
[1663146919] 'Add' event - devnode: None
[1663146919] 'Add' event - devnode: None
[1663146919] 'Add' event - devnode: None
[1663146919] 'Add' event - devnode: None
[1663146919] 'Add' event - devnode: Some("/dev/input/event6")
[1663146919] 'Add' event - devnode: Some("/dev/input/event8")
[1663146919] 'Add' event - devnode: Some("/dev/input/event5")
[1663146919] 'Add' event - devnode: Some("/dev/input/event7")
[1663146925] 'Add' event - devnode: Some("/dev/input/event3")
[1663146925] 'Remove' event - devnode: Some("/dev/input/event3")
[1663146925] 'Remove' event - devnode: None
[1663146925] 'Remove' event - devnode: Some("/dev/input/event5")
[1663146925] 'Remove' event - devnode: None
[1663146925] 'Remove' event - devnode: Some("/dev/input/event6")
[1663146925] 'Remove' event - devnode: None
[1663146925] 'Remove' event - devnode: Some("/dev/input/event7")
[1663146925] 'Remove' event - devnode: None
[1663146925] 'Remove' event - devnode: Some("/dev/input/event8")
[1663146932] 'Remove' event - devnode: None
[1663146932] 'Add' event - devnode: None
[1663146932] 'Add' event - devnode: None
[1663146932] 'Add' event - devnode: None
[1663146932] 'Add' event - devnode: None
[1663146932] 'Add' event - devnode: None
[1663146932] 'Add' event - devnode: Some("/dev/input/event6")
[1663146932] 'Add' event - devnode: Some("/dev/input/event8")
[1663146932] 'Add' event - devnode: Some("/dev/input/event5")

Please note that here, the input which is the actual keyboard is /dev/input/event3 but it is passed to the application only after it has been removed again.

I do not understand why this happens. The most I was able to understand was that the stream sometimes got 'stuck' on Poll::Pending as if no new events were available (but there actually was).

Running udevadm monitor -s input at the same time shows events in real time with no lag, as the busy loop does. I was not able to track this issue further for now.

@ajanon
Copy link
Collaborator Author

ajanon commented Sep 14, 2022

I looked into solving my issue with udev, but if anyone has any other idea, I can also take a shot at it !

@Shinyzenith
Copy link
Member

Wow! Impressive bug report and you have my respect for putting in the time to not only investigate the issue but also to propose possible changes ❤️.
The implementations look interesting, I'm not too familiar with udev but I just had one question, can udev detect the type of device that we're dealing with? this can help another bug where mice are picked up as keyboards sometimes.

@Shinyzenith
Copy link
Member

Apart from that, this looks good, I'll review it in depth once I'm done with relocating!

@Shinyzenith
Copy link
Member

I did some digging and found out that we don't need to create a new MonitorSocket from MonitorBuilder::new()?....listen(). We can create this builder once globally and then just poll the socket. Although this too is inefficient, it's...not as bad 🤣.

@ajanon
Copy link
Collaborator Author

ajanon commented Sep 19, 2022

can udev detect the type of device that we're dealing with? this can help another bug where mice are picked up as keyboards sometimes.

Maybe?

Take a look at https://wiki.ubuntu.com/X/InputConfiguration#Device_classification: udev classifies devices when detected. With some basic testing on my side, it seems that my keyboard is indeed detected as ID_INPUT_KEYBOARD and my mouse as ID_INPUT_MOUSE... and also ID_INPUT_KEYOARD. My mouse is connected through a Logitech receiver which works for both their mice and keyboards, so it advertises for both (even though I do not have one of their keyboards). This may be better than the current keyboard detection, but it may still yield false positives.

A basic implementation could be:

// or tokio_udev
let mut udev_scan = udev::Enumerator::new()?;
udev_scan.match_subsystem("input")?;
udev_scan.match_property("ID_INPUT_KEYBOARD", "1")?;
let keyboard_devices = udev_scan.scan_devices()?
    .map(|dev| dev.devnode().map(|path| path.to_owned()))
    .flatten()
    .map(evdev::Device::open)
    .flatten()
    .collect::<Vec<_>>();

This works with some basic testing. I could implement a PR for that if you'd like!

To be honest, I think it would be better to fix #131 rather than detecting keyboards: if swhkd could properly re-emit events from all kinds of devices, there would be no need to only grab keyboards, right?

@ajanon
Copy link
Collaborator Author

ajanon commented Sep 19, 2022

I did some digging and found out that we don't need to create a new MonitorSocket from MonitorBuilder::new()?....listen(). We can create this builder once globally and then just poll the socket. Although this too is inefficient, it's...not as bad 🤣.

Is it that bad? Isn't the socket only created once anyway? What does it change to create first the builder?

@Shinyzenith
Copy link
Member

Shinyzenith commented Sep 19, 2022 via email

@Shinyzenith
Copy link
Member

To be honest, I think it would be better to fix #131 rather than detecting keyboards: if swhkd could properly re-emit events from all kinds of devices, there would be no need to only grab keyboards, right?

Okay! it's cool that udev can detect these things for me, intruiging.
However I think you're correct, we can drop this task from udev entirely and just implement good mouse support too. I have attempted this in an open pr but failed eventually, would you like to try your hand at it? I'll help as much as I can.

Also I've been meaning to ask, would you like to join us as a maintainer? I've noticed that you have great debugging skills along with good problem solving skills.

@waycrate waycrate deleted a comment from ajanon Oct 26, 2022
@waycrate waycrate deleted a comment from ajanon Oct 26, 2022
@waycrate waycrate deleted a comment from ajanon Oct 26, 2022
@Shinyzenith
Copy link
Member

I have time this weekend to work on the udev problem! I'll go ahead and start on a patch asap. PS: Cleared up some unnecessary messages.

@ajanon
Copy link
Collaborator Author

ajanon commented Dec 18, 2022

I have reported this issue to tokio-udev upstream: jeandudey/tokio-udev#17
Hopefully they can help us!

@Shinyzenith
Copy link
Member

@ajanon
Copy link
Collaborator Author

ajanon commented May 28, 2023

The latest updates in the tokio_udev repo make it possible to detect added/removed devices.

This is implemented in the udev_async branch.

I will be waiting for a release of tokio_udev before creating a PR for it.

@Shinyzenith
Copy link
Member

jeandudey/tokio-udev#19

@Shinyzenith
Copy link
Member

@ajanon I tested the udev_async branch and it seems that sometimes, the code seems to panic. I am yet to find the triggering cause. I'll paste the logs below:

[2023-05-30T03:18:22Z INFO  swhkd] Device 'SINO WEALTH Gaming KB ' removed
[2023-05-30T03:18:22Z INFO  swhkd] Device 'SINO WEALTH Gaming KB  Keyboard' removed
thread 'main' panicked at 'index out of bounds: the len is 1 but the index is 2', swhkd/src/daemon.rs:331:43
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

@Shinyzenith
Copy link
Member

Here are the steps I found to reliably reproduce the issue.
I have an external keyboard connected to my laptop. Upon disconnecting my external keyboard and attempting to press just a modifier key ( in this case, Super ) It causes swhkd to crash. It seems to be crashing on the keyboard_stream_map match.

@CluelessTechnologist
Copy link

When running from the main branch swhkd doesn't give any error but it doesn't seem to accept keyboard events any longer. When running from the udev_async branch I get the same error as @Shinyzenith .

[2023-06-03T15:31:04Z INFO  swhkd] Device 'Gaming keyboard' removed
[2023-06-03T15:31:04Z INFO  swhkd] Device 'Gaming keyboard' removed
[2023-06-03T15:31:04Z INFO  swhkd] Device 'Gaming keyboard' removed
thread 'main' panicked at 'removal index (is 3) should be < len (is 1)', swhkd/src/daemon.rs:318:49
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Aborted

@ConcurrentCrab
Copy link
Contributor

Is this still an issue?

I wanted to look into it because of the bounty but I can't reproduce the issue with the udev_async head. I can plug and unplug my USB keyboard freely and swhkd seems to cope just fine.

(Incidentally I am doing this on a setup where no commands are actually run, on any hotkey swhkd prints "failed to send command through ipc". swhkd can't find the socket created by swhkd for reasons unclear to me. But that can't be the reason for the error not happening to me, can it?)

@Shinyzenith
Copy link
Member

I have detailed the steps to a crash issue two comments above. Can you reproduce that?

@ConcurrentCrab
Copy link
Contributor

I have detailed the steps to a crash issue two comments above. Can you reproduce that?

I can connect and disconnect the USB keyboard, and pressing super in both states, on both keyboards (obvs on the external only when connected), makes swhkd log the key. Using any combinations involving super also are logged fine (though the commands not executed, as I mentioned above).

The only combination in my config is a Super + l. I don't think the configured combinations should be relevant to the location of the crash either, however.

Here are the steps I found to reliably reproduce the issue. I have an external keyboard connected to my laptop. Upon disconnecting my external keyboard and attempting to press just a modifier key ( in this case, Super ) It causes swhkd to crash. It seems to be crashing on the keyboard_stream_map match.

Am I missing something?

@ConcurrentCrab
Copy link
Contributor

Fixed the socket issue with commands, it was just polkit being weird like always. still can't reproduce the crash.

Wow, that's some main(). Looking at it, I might have some theories, even if I can't reproduce it personally. Is it alright if I make some educated-guess changes and ask any of you (who suffer from the crash) to test?

@ConcurrentCrab
Copy link
Contributor

ConcurrentCrab commented Jul 16, 2023

Still don't face the issue, but I came up with some theories and made some fixes to obvious problems:
https://github.com/ConcurrentCrab/swhkd/tree/udev_async
#216

@Shinyzenith and others: can you test and see if these fixes work for you?

@CluelessTechnologist
Copy link

Still don't face the issue, but I came up with some theories and made some fixes to obvious problems: https://github.com/ConcurrentCrab/swhkd/tree/udev_async #216

Nice, seems to be working now. Great job!

[2023-07-18T20:11:23Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event2' removed
[2023-07-18T20:11:23Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event3' removed
[2023-07-18T20:11:23Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event4' removed
[2023-07-18T20:11:23Z INFO  swhkd] Device 'Logitech Gaming Mouse G502 Keyboard' at '/dev/input/event1' removed
[2023-07-18T20:11:31Z ERROR swhkd] Could not open evdev device at /dev/input/mouse0: Inappropriate ioctl for device (os error 25)
[2023-07-18T20:11:31Z DEBUG swhkd] Keyboard: Logitech Gaming Mouse G502 Keyboard
[2023-07-18T20:11:31Z INFO  swhkd] Device 'Logitech Gaming Mouse G502 Keyboard' at '/dev/input/event1' added.
[2023-07-18T20:11:31Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-18T20:11:31Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event2' added.
[2023-07-18T20:11:31Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-18T20:11:31Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event3' added.
[2023-07-18T20:11:31Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-18T20:11:31Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event4' added.
[2023-07-18T20:11:31Z TRACE swhkd] Other: Logitech Gaming Mouse G502

@Shinyzenith
Copy link
Member

Fixed the socket issue with commands, it was just polkit being weird like always. still can't reproduce the crash.

Wow, that's some main(). Looking at it, I might have some theories, even if I can't reproduce it personally. Is it alright if I make some educated-guess changes and ask any of you (who suffer from the crash) to test?

Sorry for the late reply. I'm more than happy to do some more testing. Yeah the main() needs cleanup...a lot of it.

@Shinyzenith
Copy link
Member

I'll review the PR and get that going.

@Shinyzenith
Copy link
Member

I have merged the pr sent by @ConcurrentCrab. Just to be sure @CluelessTechnologist would you mind testing the latest HEAD of udev branch once more? If all is good to go, I'll merge.

@CluelessTechnologist
Copy link

I have merged the pr sent by @ConcurrentCrab. Just to be sure @CluelessTechnologist would you mind testing the latest HEAD of udev branch once more? If all is good to go, I'll merge.

Sure. Just tested the latest commit from udev branch. Happy to report that it's still working:

[2023-07-19T22:49:04Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event2' removed
[2023-07-19T22:49:04Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event3' removed
[2023-07-19T22:49:04Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event4' removed
[2023-07-19T22:49:04Z INFO  swhkd] Device 'Logitech Gaming Mouse G502 Keyboard' at '/dev/input/event1' removed
[2023-07-19T22:49:11Z ERROR swhkd] Could not open evdev device at /dev/input/mouse0: Inappropriate ioctl for device (os error 25)
[2023-07-19T22:49:11Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-19T22:49:11Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event2' added.
[2023-07-19T22:49:11Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-19T22:49:11Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event4' added.
[2023-07-19T22:49:11Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-19T22:49:11Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event3' added.
[2023-07-19T22:49:11Z DEBUG swhkd] Keyboard: Logitech Gaming Mouse G502 Keyboard
[2023-07-19T22:49:11Z INFO  swhkd] Device 'Logitech Gaming Mouse G502 Keyboard' at '/dev/input/event1' added.
[2023-07-19T22:49:11Z TRACE swhkd] Other: Logitech Gaming Mouse G502

@Shinyzenith Shinyzenith linked a pull request Jul 20, 2023 that will close this issue
@Shinyzenith
Copy link
Member

Shinyzenith commented Jul 20, 2023

@CluelessTechnologist I made some minor changes and force pushed. Would you mind testing the branch head one last time? My apologies. After that it'll be ready for merge.

@CluelessTechnologist
Copy link

@CluelessTechnologist I made some minor changes and force pushed. Would you mind testing the branch head one last time? My apologies. After that it'll be ready for merge.

Okay I pulled the latest commit and recompiled and reinstalled. Still seems to be working:

[2023-07-21T13:44:11Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event2' removed
[2023-07-21T13:44:11Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event3' removed
[2023-07-21T13:44:11Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event4' removed
[2023-07-21T13:44:11Z INFO  swhkd] Device 'Logitech Gaming Mouse G502 Keyboard' at '/dev/input/event1' removed
[2023-07-21T13:44:18Z ERROR swhkd] Could not open evdev device at /dev/input/mouse0: Inappropriate ioctl for device (os error 25)
[2023-07-21T13:44:18Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-21T13:44:18Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event2' added.
[2023-07-21T13:44:18Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-21T13:44:18Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event4' added.
[2023-07-21T13:44:18Z DEBUG swhkd] Keyboard: Logitech Gaming Mouse G502 Keyboard
[2023-07-21T13:44:18Z INFO  swhkd] Device 'Logitech Gaming Mouse G502 Keyboard' at '/dev/input/event1' added.
[2023-07-21T13:44:18Z DEBUG swhkd] Keyboard: Gaming keyboard
[2023-07-21T13:44:18Z INFO  swhkd] Device 'Gaming keyboard' at '/dev/input/event3' added.
[2023-07-21T13:44:18Z TRACE swhkd] Other: Logitech Gaming Mouse G502

@ConcurrentCrab
Copy link
Contributor

ConcurrentCrab commented Jul 22, 2023

Nice, seems to be working now. Great job!

Awesome! Happy to be of help to y'all, and thanks for the bounty!

@Shinyzenith I can't collect the bounty on bountysource.com until this issue is marked as closed, so I'd really appreciate it if you could close it and test miscelleneous changes afterwards :P

@Shinyzenith
Copy link
Member

@CluelessTechnologist I am not sure how you wish to split the bounty but I'll list out the people who have helped us achieve the goal:

@ajanon For their excellent udev async patch and reporting upstream on fixing the epoll error.
@jeandudey For fixing the epoll error.
@ConcurrentCrab For fixing index out of bound error due to incorrect state management.

@CluelessTechnologist
Copy link

@ConcurrentCrab were you able to claim the bounty?

@ConcurrentCrab
Copy link
Contributor

@ConcurrentCrab were you able to claim the bounty?

I thought it best not to take any actions on my side yet in case you had actually intended to split it.

@jeandudey
Copy link

@Shinyzenith I released the fixes for tokio-udev but who fixed it was @sjoerdsimons, so I don't actually deserve any bounty but him

@Shinyzenith
Copy link
Member

Thank you for the clarification!

@CluelessTechnologist
Copy link

@ConcurrentCrab were you able to claim the bounty?

I thought it best not to take any actions on my side yet in case you had actually intended to split it.

Unfortunately there's no way to split it. The one who creates the PR is eligible for the bounty. So you can go ahead and claim it since you were the one that created the PR.

@Shinyzenith I released the fixes for tokio-udev but who fixed it was @sjoerdsimons, so I don't actually deserve any bounty but him

@sjoerdsimons here's the bounty for tokio-udev: https://app.bountysource.com/issues/121368069-events-were-blocked-while-poll-next

@Shinyzenith
Copy link
Member

Unfortunately there's no way to split it. The one who creates the PR is eligible for the bounty. So you can go ahead and claim it since you were the one that created the PR.

To be completely fair, alexis created the initial fix, just in a branch. I opened the PR. I obviously don't want any part of the bounty, I'm just stating the facts.
The next PR fixing the index out of bounds issue was from ConcurrentCrab.

@sjoerdsimons
Copy link

@ConcurrentCrab were you able to claim the bounty?

I thought it best not to take any actions on my side yet in case you had actually intended to split it.

Unfortunately there's no way to split it. The one who creates the PR is eligible for the bounty. So you can go ahead and claim it since you were the one that created the PR.

@Shinyzenith I released the fixes for tokio-udev but who fixed it was @sjoerdsimons, so I don't actually deserve any bounty but him

@sjoerdsimons here's the bounty for tokio-udev: https://app.bountysource.com/issues/121368069-events-were-blocked-while-poll-next

I have no need for a bounty; I'm happy for @jeandudey to pick it up as thanks for maintaining tokio-udev or for the funding to be re-used for another issue that seems worthwhile.

@ConcurrentCrab
Copy link
Contributor

So a kinda update regarding bountysource: I had requested a cashout of a pair of bounties I did a couple weeks ago, and have been patiently waiting for the past few weeks for it to process, which I found weird as their FAQ claimed it should be a week at max. So I tried to look up some stuff and I kinda got my answer: https://github.com/bountysource/core/issues

So it goes without saying: please stop giving more money to bountysource, or displaying their services on your projects. I think it;s pretty safe to say they're not going to pay any of it out now, even if they even exist anymore on any level.

As for money that already exists on their platform, I saw somebody suggest in the issues asking paypal to chargeback any transactions that have happened less than 6 months ago; since bountysource is unresponsive on all levels, paypal should automatically resolve in favour of customers.

@CluelessTechnologist Of course, That is what I'd recommend you do for the bounties you've posted for your issues as well. And, if I may ask this favour of you, I would also request you to paypal me for this bounty (only once the chargeback claim is successful, of course), because I sort of did actually need the pocket money. This would also allow you to split it with @ajanon as they wish.

@CluelessTechnologist
Copy link

Sadly I was warned about BountySource before but there isn't that many sites that offer bounties with escrow. Rysolv is one that I have used before. I was debating switching to it but decided against it which was my mistake I guess.

I'm really sorry about this @ConcurrentCrab. Please send me a DM with your PayPal email on Matrix (@CluelessTechnologist:matrix.org) or email me. (email in my GitHub profile)

Another option is to enable Github Sponsors on your profile.

@ConcurrentCrab
Copy link
Contributor

ConcurrentCrab commented Aug 30, 2023

@CluelessTechnologist I sent you an email (from the same address as my commits).

@Shinyzenith
Copy link
Member

Very unfortunate situation. I hope bountysource returns you your capital @CluelessTechnologist.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Something isn't working Component: daemon Difficulty: high Priority: high High priority tasks
Development

Successfully merging a pull request may close this issue.

8 participants