Enable enter notify event handling in Client
This commit is contained in:
parent
4e154bdd87
commit
ed24ac86d2
2 changed files with 13 additions and 11 deletions
2
client.h
2
client.h
|
@ -678,7 +678,7 @@ private:
|
||||||
void configureRequestEvent(xcb_configure_request_event_t *e);
|
void configureRequestEvent(xcb_configure_request_event_t *e);
|
||||||
virtual void propertyNotifyEvent(xcb_property_notify_event_t *e) override;
|
virtual void propertyNotifyEvent(xcb_property_notify_event_t *e) override;
|
||||||
void clientMessageEvent(XClientMessageEvent* e);
|
void clientMessageEvent(XClientMessageEvent* e);
|
||||||
void enterNotifyEvent(XCrossingEvent* e);
|
void enterNotifyEvent(xcb_enter_notify_event_t *e);
|
||||||
void leaveNotifyEvent(XCrossingEvent* e);
|
void leaveNotifyEvent(XCrossingEvent* e);
|
||||||
void focusInEvent(XFocusInEvent* e);
|
void focusInEvent(XFocusInEvent* e);
|
||||||
void focusOutEvent(XFocusOutEvent* e);
|
void focusOutEvent(XFocusOutEvent* e);
|
||||||
|
|
22
events.cpp
22
events.cpp
|
@ -542,18 +542,20 @@ bool Client::windowEvent(xcb_generic_event_t *e)
|
||||||
workspace()->updateFocusMousePosition(QPoint(event->root_x, event->root_y));
|
workspace()->updateFocusMousePosition(QPoint(event->root_x, event->root_y));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if KWIN_QT5_PORTING
|
case XCB_ENTER_NOTIFY: {
|
||||||
case EnterNotify:
|
auto *event = reinterpret_cast<xcb_enter_notify_event_t*>(e);
|
||||||
enterNotifyEvent(&e->xcrossing);
|
enterNotifyEvent(event);
|
||||||
// MotionNotify is guaranteed to be generated only if the mouse
|
// MotionNotify is guaranteed to be generated only if the mouse
|
||||||
// move start and ends in the window; for cases when it only
|
// move start and ends in the window; for cases when it only
|
||||||
// starts or only ends there, Enter/LeaveNotify are generated.
|
// starts or only ends there, Enter/LeaveNotify are generated.
|
||||||
// Fake a MotionEvent in such cases to make handle of mouse
|
// Fake a MotionEvent in such cases to make handle of mouse
|
||||||
// events simpler (Qt does that too).
|
// events simpler (Qt does that too).
|
||||||
motionNotifyEvent(e->xcrossing.window, e->xcrossing.state,
|
motionNotifyEvent(event->event, event->state,
|
||||||
e->xcrossing.x, e->xcrossing.y, e->xcrossing.x_root, e->xcrossing.y_root);
|
event->event_x, event->event_y, event->root_x, event->root_y);
|
||||||
workspace()->updateFocusMousePosition(QPoint(e->xcrossing.x_root, e->xcrossing.y_root));
|
workspace()->updateFocusMousePosition(QPoint(event->root_x, event->root_y));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
#if KWIN_QT5_PORTING
|
||||||
case LeaveNotify:
|
case LeaveNotify:
|
||||||
motionNotifyEvent(e->xcrossing.window, e->xcrossing.state,
|
motionNotifyEvent(e->xcrossing.window, e->xcrossing.state,
|
||||||
e->xcrossing.x, e->xcrossing.y, e->xcrossing.x_root, e->xcrossing.y_root);
|
e->xcrossing.x, e->xcrossing.y, e->xcrossing.x_root, e->xcrossing.y_root);
|
||||||
|
@ -789,14 +791,14 @@ void Client::propertyNotifyEvent(xcb_property_notify_event_t *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Client::enterNotifyEvent(XCrossingEvent* e)
|
void Client::enterNotifyEvent(xcb_enter_notify_event_t *e)
|
||||||
{
|
{
|
||||||
if (e->window != frameId())
|
if (e->event != frameId())
|
||||||
return; // care only about entering the whole frame
|
return; // care only about entering the whole frame
|
||||||
|
|
||||||
#define MOUSE_DRIVEN_FOCUS (!options->focusPolicyIsReasonable() || \
|
#define MOUSE_DRIVEN_FOCUS (!options->focusPolicyIsReasonable() || \
|
||||||
(options->focusPolicy() == Options::FocusFollowsMouse && options->isNextFocusPrefersMouse()))
|
(options->focusPolicy() == Options::FocusFollowsMouse && options->isNextFocusPrefersMouse()))
|
||||||
if (e->mode == NotifyNormal || (e->mode == NotifyUngrab && MOUSE_DRIVEN_FOCUS)) {
|
if (e->mode == XCB_NOTIFY_MODE_NORMAL || (e->mode == XCB_NOTIFY_MODE_UNGRAB && MOUSE_DRIVEN_FOCUS)) {
|
||||||
|
|
||||||
if (options->isShadeHover()) {
|
if (options->isShadeHover()) {
|
||||||
cancelShadeHoverTimer();
|
cancelShadeHoverTimer();
|
||||||
|
@ -812,7 +814,7 @@ void Client::enterNotifyEvent(XCrossingEvent* e)
|
||||||
if (options->focusPolicy() == Options::ClickToFocus || workspace()->userActionsMenu()->isShown())
|
if (options->focusPolicy() == Options::ClickToFocus || workspace()->userActionsMenu()->isShown())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QPoint currentPos(e->x_root, e->y_root);
|
QPoint currentPos(e->root_x, e->root_y);
|
||||||
if (options->isAutoRaise() && !isDesktop() &&
|
if (options->isAutoRaise() && !isDesktop() &&
|
||||||
!isDock() && workspace()->focusChangeEnabled() &&
|
!isDock() && workspace()->focusChangeEnabled() &&
|
||||||
currentPos != workspace()->focusMousePosition() &&
|
currentPos != workspace()->focusMousePosition() &&
|
||||||
|
|
Loading…
Reference in a new issue