Я реализовал горизонтальный виджет разделителя в Xlib. Я пытаюсь захватить мышь, когда пользователь перетаскивает на панели разделителя (так, чтобы пользователь мог динамично переместить разделение и таким образом изменить размер окон по обе стороны от панели разделителя).
Я использовал XGrabPointer()
после получения щелчка левой кнопкой, в надеждах, что все будущее движение мыши (перетаскивание) будет отклонено к окну разделителя, пока левая кнопка не будет отпущена.
Unfortuntately, это, кажется, не работает как этот. Если пользователь перетаскивает слишком быстро, и указатель мыши вводит одно из окон по обе стороны от разделения, сообщения MotionEvent отклонены к тому (дочернему) окну, а не окну разделителя.
Что я сделал неправильно? Мой XGrabPointer()
вызов следующие:
::XGrabPointer(mDisplay, window, True,
ButtonPressMask |
ButtonReleaseMask |
PointerMotionMask |
FocusChangeMask |
EnterWindowMask |
LeaveWindowMask,
GrabModeAsync,
GrabModeAsync,
RootWindow(mDisplay, DefaultScreen(mDisplay)),
None,
CurrentTime);
Мне почти неловко признать это, но ответ оказался столь же простым, как изменение третьего параметра (owner_events) с Верно к ложному.
Из учебника / справочника Xlib на tronche.com :
Если owner_events имеет значение False, все сгенерированные события указателя сообщаются относительно grab_window и сообщаются только в том случае, если они выбраны с помощью event_mask.Если owner_events имеет значение True и если сгенерированное событие указателя обычно сообщается этому клиенту, оно передается как обычно. В противном случае событие сообщается относительно grab_window и сообщается только в том случае, если оно выбрано с помощью event_mask.
Я все еще не уверен, что полностью понимаю поведение случая True, но моя интерпретация такова, что если True, другим X-программам (то есть окнам, созданным другими процессами) запрещено получать XEvents, но тем, которые могли бы попадание в любое окно, созданное вашим процессом, доставляются как обычно. В ложном случае сообщается обо всех событиях, относящихся к конкретному выбранному вами окну. Это было то, что я хотел.