X11: Как я ДЕЙСТВИТЕЛЬНО захватываю указатель мыши?

Я реализовал горизонтальный виджет разделителя в Xlib. Я пытаюсь захватить мышь, когда пользователь перетаскивает на панели разделителя (так, чтобы пользователь мог динамично переместить разделение и таким образом изменить размер окон по обе стороны от панели разделителя).

Я использовал XGrabPointer() после получения щелчка левой кнопкой, в надеждах, что все будущее движение мыши (перетаскивание) будет отклонено к окну разделителя, пока левая кнопка не будет отпущена.

Unfortuntately, это, кажется, не работает как этот. Если пользователь перетаскивает слишком быстро, и указатель мыши вводит одно из окон по обе стороны от разделения, сообщения MotionEvent отклонены к тому (дочернему) окну, а не окну разделителя.

Что я сделал неправильно? Мой XGrabPointer() вызов следующие:

::XGrabPointer(mDisplay, window, True,
               ButtonPressMask |
                 ButtonReleaseMask |
                 PointerMotionMask |
                 FocusChangeMask |
                 EnterWindowMask |
                  LeaveWindowMask,
               GrabModeAsync,
               GrabModeAsync,
               RootWindow(mDisplay, DefaultScreen(mDisplay)),
               None,
               CurrentTime);
11
задан slugster 8 December 2013 в 08:41
поделиться

1 ответ

Мне почти неловко признать это, но ответ оказался столь же простым, как изменение третьего параметра (owner_events) с Верно к ложному.

Из учебника / справочника Xlib на tronche.com :

Если owner_events имеет значение False, все сгенерированные события указателя сообщаются относительно grab_window и сообщаются только в том случае, если они выбраны с помощью event_mask.Если owner_events имеет значение True и если сгенерированное событие указателя обычно сообщается этому клиенту, оно передается как обычно. В противном случае событие сообщается относительно grab_window и сообщается только в том случае, если оно выбрано с помощью event_mask.

Я все еще не уверен, что полностью понимаю поведение случая True, но моя интерпретация такова, что если True, другим X-программам (то есть окнам, созданным другими процессами) запрещено получать XEvents, но тем, которые могли бы попадание в любое окно, созданное вашим процессом, доставляются как обычно. В ложном случае сообщается обо всех событиях, относящихся к конкретному выбранному вами окну. Это было то, что я хотел.

14
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: