LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Есть вот такое вот решение:

bool KeyboardWidget::nativeEventFilter(const QByteArray &eventType, void *message, long *) {
	xcb_generic_event_t *ev = static_cast<xcb_generic_event_t*>(message);
	switch (ev->response_type & ~0x80) {
		case XCB_KEY_PRESS: {
			xcb_key_press_event_t *key_press_event = reinterpret_cast<xcb_key_press_event_t*>(ev);
			keyEventReceived(key_press_event->detail, true);
			break;
		}
		case XCB_KEY_RELEASE: {
			xcb_key_release_event_t *key_release_event = reinterpret_cast<xcb_key_release_event_t*>(ev);
			keyEventReceived(key_release_event->detail, false);
			break;
		}
	case XCB_FOCUS_OUT:
		focusChanged();
		break;
	}
	return false;
}

void KeyboardWidget::focusChanged() {
	Display *display = QX11Info::display();
	Window currentWindow;
	int rev;
	XGetInputFocus(display, &currentWindow, &rev);
	if ((currentWindow == PointerRoot) || (currentWindow == None)) {
		currentWindow = DefaultRootWindow(display);
	}
	XSelectInput(display, currentWindow, KeyPressMask | KeyReleaseMask | FocusChangeMask);
}

...

QApplication::instance()->installNativeEventFilter(this);
focusChanged();	

Такой вариант работает и ловит клавиши, которые при этом таки доставляются нужному приложению, но... только если указатель мыши находится над окном моего приложения. Если данное условие не выполняется, то никаких событий моё приложение не получает.

UPD: Не совсем так. Для Google Chrome всё ок, для Qt Creator ловит только если указатель над окном моего приложения.

Исходная версия KivApple, :

Есть вот такое вот решение:

bool KeyboardWidget::nativeEventFilter(const QByteArray &eventType, void *message, long *) {
	xcb_generic_event_t *ev = static_cast<xcb_generic_event_t*>(message);
	switch (ev->response_type & ~0x80) {
		case XCB_KEY_PRESS: {
			xcb_key_press_event_t *key_press_event = reinterpret_cast<xcb_key_press_event_t*>(ev);
			keyEventReceived(key_press_event->detail, true);
			break;
		}
		case XCB_KEY_RELEASE: {
			xcb_key_release_event_t *key_release_event = reinterpret_cast<xcb_key_release_event_t*>(ev);
			keyEventReceived(key_release_event->detail, false);
			break;
		}
	case XCB_FOCUS_OUT:
		focusChanged();
		break;
	}
	return false;
}

void KeyboardWidget::focusChanged() {
	Display *display = QX11Info::display();
	Window currentWindow;
	int rev;
	XGetInputFocus(display, &currentWindow, &rev);
	if ((currentWindow == PointerRoot) || (currentWindow == None)) {
		currentWindow = DefaultRootWindow(display);
	}
	XSelectInput(display, currentWindow, KeyPressMask | KeyReleaseMask | FocusChangeMask);
}

...

QApplication::instance()->installNativeEventFilter(this);
focusChanged();	

Такой вариант работает и ловит клавиши, которые при этом таки доставляются нужному приложению, но... только если указатель мыши находится над окном моего приложения. Если данное условие не выполняется, то никаких событий моё приложение не получает.